App mit einem bewegenden Balken(über Touch gesteuert) und einem bewegenden Ball im Feld entwickeln (Arkanoid o. Breakout gennant)

  • Antworten:3
mer ry
  • Forum-Beiträge: 3

30.10.2014, 19:01:09 via Website

Ich bin schon seit ein paar Tagen dran eine App zu entwickeln. Meine Entwicklungsumgebung ist Eclipse und ich programmiere in Java, darstellen und ausprobieren tue ich es über das angeschlossene Sony Tablet, welches Android 4.0.3 drauf hat.
Jetzt habe ich schon verschiedenes probiert, nur leider noch nicht geschaft.
Ich schaffe es über Touch einen Balken am unteren Rand von rechts nach links zu Bewegen. Dieses Spielt sich in der Main Klasse ab, welche von einer "Activity" erbt.
Und ich habe es seperat in einem anderen Fenster geschaft einen Ball über das Feld sich bewegen zu lassen mit abprellen an den rändern, diese Klasse erbt von der "View".
Mein Problem ist jetzt das ich dieses beides in einem Fenster gern hätte und zu einem Spiel bringen will, welches sich Arkanoid oder auch Breakout nennt, aber ich bekomme es nur seperat hin, da es von Verschiedenen Klassen erbt.

Bitte hat jemand eine Idee wie es verwirklcihbar ist und kann mir tips geben oder helfen.
Würde mich sehr freuen wenn ich es jetzt bald mal hinbekomme.
Vielen Dank schon im Vorraus an alle.

Antworten
pepperonas
  • Forum-Beiträge: 434

31.10.2014, 12:03:10 via Website

Hallo,
gut, wenn du schon mal das die "Grundfunktionalitäten" hast.
Wichtig ist nun, wie du es selbst schon sagst, dass du ein "Gerüst" brauchst.

Ein erprobtes Konzept sieht so aus:
- eine GameLoopist der Motor für das Programm. Hier wird ein Thread gestartet, der das Programm antreibt.
- eine andere Klasse könnte GameViewheißen und kümmert sich um das Rendern- hier wird onDraw()ausgeführt
- ein Interface (übergeordneter Bauplan) beschreibt Objekte, die in deinem Spiel zu sehen sind. Hier könntest du gewisse Gemeinsamkeiten von Spielgegenständen darstellen (zB dass alle Objekte den Member float moveSpeedhaben oder int widthoder int posX)
-aus diesem Interface leitest du Kinder ab, zB deinen Block und der bekommt Methoden wie getWidth()oder setPosY(int y)
- eine Klasse Hudkönnte Punkte anzeigen, auch diese Klasse braucht eine Methode, die du über die GameView ansprichst und letztlich Objekte darstellen / zeichnen kann (Stichwort onDraw() )

Meine Erklärung war jetzt extrem verkürzt und BEI WEITEM nicht vollständig. Aber wenn du ein bisschen oben genannte Methoden oder Member googelst, solltest du schon was finden.

Kleiner Tipp: Nimm dir einen Stift und ein Blatt und zeichne mal zwei drei Spielzüge auf. Schau dir an was sich geändert hat und überlege dir 1. welche "Variablen" sich verändert haben und wie man die Variablen angesprochen hat. Wenn du gründlich arbeitest und etwas Erfahrung mit Java hast, kommst du irgendwann von ganz alleine dahinter.
Und nicht aufgeben, wenn es nicht gleich "klick" macht - es ist wie so eine Art "Blick", den man früher oder später dafür bekommt ;)

Open Source

Antworten
mer ry
  • Forum-Beiträge: 3

02.11.2014, 18:45:55 via Website

Erst mal vielen Dank für die Hilfe. Jetzt habe ich nicht mehr das Gefühl, das es garnicht mehr geht sonder das ich es doch schaffen kann. Die Anhaltspunkte könten mich glaub gut weiter bringen. Ich habe leider heute zwar keine Zeit mehr, aber ich werde morgen das ganze versuchen zu erarbeiten und umzusetzen.

Antworten
mer ry
  • Forum-Beiträge: 3

03.11.2014, 17:32:53 via Website

Ich habe mich jetzt heute den Ganzen Tag damit beschäftigt und evtl. habe ich es jetzt rellativ verstanden.
Und zwar stelle ich es mir so vor das ich eine Inferface Klasse mache, in welcher ich die beiden Objekte initialisiere und dem Balken auch das imageview aus der xml zuweise.
Dann gibt es die gameLopist, welche von der Schnittstellenklasse erbt, in welcher der Thread geöfnet wird, wo die Klasse gameView ausführt, in welcher die onDraw dan ausgeführt wird. In dieser wird der ball, welcher durch das bild läuft dann auch gezeichnet.
Dann noch die Hug klasse, welche von gameView erbt und in dieser werden die bewrührungen gezählt, also die tie toore kann man sagen und geschaut wann fertig ist.
Habe ich das so untegefähr richtig verstanden?
Ich hatte auch so in etwa ein klassendiagramm gemacht... es ist jetzt nicht normgerecht, aber soll etwa verdeutlichen wie ich mri das projekt vorstelle:
image

Auch versucht habe ich schon ein etwas abgewandeltes projekt, in welchem auch von der einen klasse ein thread der anderen aufgerufen wird, aber da funktioniert noch eine übergabe einer Variablen info nicht.
Es handelt sich um folgenden Code:
MainActivity.java

package com.example.threadtest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName(); //MyThreadExample1Activity

private Button bStart;
private Button bReset;
public TextView tvStatus;

private Handler handler;

private Counter worker;
private Thread workthread;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activty_main);

    handler = new Handler();
    bStart = (Button) findViewById(R.id.main_b_start);
    bReset = (Button) findViewById(R.id.main_b_reset);
    tvStatus = (TextView) findViewById(R.id.main_tv_status);

    worker = new Counter();
    workthread = new Thread(worker);
    worker.setPause(true);


    bStart.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Thread.State status = workthread.getState();
            Log.d(TAG, "status: " + status);
            if (Thread.State.NEW.equals(status)) {
                // first start
                Log.d(TAG, "start");
                workthread.start(); 
                setButtonMsg("pause");
                bReset.setEnabled(true);
            } else {
                if (worker.isPause()) {
                    Log.d(TAG, "weiter");
                    worker.setPause(false);
                    bReset.setEnabled(false);
                    setButtonMsg(getString(R.string.pause));
                } else {
                    Log.d(TAG, "pause");
                    worker.setPause(true);
                    bReset.setEnabled(true);
                    setButtonMsg(getString(R.string.weiter));
                }
            }
        }
    });

    bReset.setEnabled(false);
    bReset.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if(worker.isPause()){
                worker.reset();
                Log.d(TAG, getString(R.string.pause));
                setButtonMsg(getString(R.string.start));
            }
        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    workthread.interrupt();
    workthread = null;
}

private void setButtonMsg(final String msg) {
    handler.post(new Runnable() {
        @Override
        public void run() {
            if (msg == null) {
                bStart.setText("");
            } else {
                bStart.setText(msg);
            }
        }
    });
}

}

Counter.java

package com.example.threadtest;

import android.os.Handler;
import android.widget.TextView;

public class Counter implements Runnable { //private

private int result = 0;
private boolean pause = false;

@Override
public void run() {

    pause = false;
    result = 0;
    while (true) {
        if (pause) {

                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                }

            continue;
        }
        result++;
        result = result % 100;
        //Diesen erkennt er nicht, bzw. kann er nicht von der Anderen klasse verwenden, aber ich kann ihn hier auch nicht nochmal deklarieren, das geht auch nciht
        handler.post(new Runnable() {
        @Override
        public void run() {     
            //Und hier ist es das selbe
            tvStatusNeu.setText("" + result);
            }
        });
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
        }
    }
}

public void setPause(boolean pause) {
    this.pause = pause;
}

public boolean isPause() {
    return pause;
}

public void reset() {
    this.result = 0;
    handler.post(new Runnable() {
        @Override
        public void run() {
            tvStatusNeu.setText("" + result);
        }
    });
}

}

Bin Dankbar über jeden Hinweis und hilfe

Antworten