Hallo zusammen,
ich hab mir dieses Programm mal zu Gemüte geführt: http://www.jforeach.com/creating-an-android-game-in-a-day/80 Dies ist auch soweit lauffähig auf meinem Handy. Ich habe die Klasse Gameview um folgende Methoden erweitert und dabei die Methode KeyEvents komplett entfernt.
Hier wird die Spielfigur über einen Touchevent am Display des Handys ausgeführt. Dieser führt über einen Zufallsalgorithmus direkt irgendwann mal zum Ziel. Vorher war es so, dass nach jedem Schritt auf einem Feld, der per Tastendruck ausgelöst wurde, das Spielfeld über die Funktion invalidate() neu gezeichnet wurde. Über einen Zufallsalgorithmus müsste dies ja genau so funktionieren, nur dass ich die Funktion verzögern müsste, da ja nach jeder Bewegung der Figur direkt eine weitere ausgeführt wird.
Also ist es in der jetzigen Situation so, dass man die Figur per Displayberührung startet und diese sofort am Ziel erscheint. Man sieht also nicht die einzelnen Schritte.
Nun möchte ich die Sichtbarkeit eines Einzelschritts erreichen, indem ich die invalidate() Funktion verzögere.
Dazu habe ich folgendes versucht:
a) Den Klassiker. Funktioniert überhaupt nicht. Das Programm steigt aus.
oder dies. Das führt zwar dazu, dass man das Programm nach der Displayberührung verzögern kann, aber leider nicht jedes Mal den einzelnen Schritt der Spielfigur.
und einen Timer. Das führt zwar in etwa zum gleichen Ergebnis.
Daher meine Fragen:
1) Habe ich das überhaupt richtig verstanden, dass invalidate() das Spielfeld jedesmal neu zeichnet?
2) Was ist an den o.g. Methoden falsch?
Ich weiß, dass für die Beantwortung der Fragen erst das genannte Programm nachvollzogen werden muss, was man nicht in 1-2 Minuten machen kann. Aber vielleicht kennt sich ja jemand damit aus.
Danke und gruß!
ich hab mir dieses Programm mal zu Gemüte geführt: http://www.jforeach.com/creating-an-android-game-in-a-day/80 Dies ist auch soweit lauffähig auf meinem Handy. Ich habe die Klasse Gameview um folgende Methoden erweitert und dabei die Methode KeyEvents komplett entfernt.
Code:
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
int aktuellX = labyrinth.getAktuellX();
int aktuellY = labyrinth.getAktuellY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
//Touchpad aktiviert
if(Math.floor(touchX/totalzellebreite) == aktuellX &&
Math.floor(touchY/totalzellehoehe) == aktuellY) {
bewegung = true;
return true;
}
break;
case MotionEvent.ACTION_UP:
bewegung = false;
return true;
case MotionEvent.ACTION_MOVE:
if(bewegung) {
labyrinth.zielpunktErreicht = false;
while(labyrinth.istZielpunktErreicht() == false)
{
int zufallszahl = erstelleZufall();
boolean bewegt = false;
switch(zufallszahl) {
case 1:
bewegt = labyrinth.bewege(Labyrinth.RECHTS);
break;
case 2:
bewegt = labyrinth.bewege(Labyrinth.LINKS);
break;
case 3:
bewegt = labyrinth.bewege(Labyrinth.UNTEN);
break;
case 4:
bewegt = labyrinth.bewege(Labyrinth.OBEN);
break;
}
if(bewegt) {
//der Ball wurde bewegt, also wird das Spielfeld neu gezeichnet
invalidate();
}
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(context.getText(R.string.finished_title) );
LayoutInflater inflater = context.getLayoutInflater();
View ansicht = inflater.inflate(R.layout.finish, null);
builder.setView(ansicht);
View closeButton =ansicht.findViewById(R.id.closeGame);
closeButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View clicked) {
if(clicked.getId() == R.id.closeGame) {
context.finish();
}
}
});
AlertDialog finishDialog = builder.create();
finishDialog.show();
return true;
}
}
return false;
}
public int erstelleZufall() {
int obergrenze = 5;
int untergrenze = 1;
int ergebnis = (int) (Math.random() * (obergrenze - untergrenze) + untergrenze);
return ergebnis;
}
}
Hier wird die Spielfigur über einen Touchevent am Display des Handys ausgeführt. Dieser führt über einen Zufallsalgorithmus direkt irgendwann mal zum Ziel. Vorher war es so, dass nach jedem Schritt auf einem Feld, der per Tastendruck ausgelöst wurde, das Spielfeld über die Funktion invalidate() neu gezeichnet wurde. Über einen Zufallsalgorithmus müsste dies ja genau so funktionieren, nur dass ich die Funktion verzögern müsste, da ja nach jeder Bewegung der Figur direkt eine weitere ausgeführt wird.
Also ist es in der jetzigen Situation so, dass man die Figur per Displayberührung startet und diese sofort am Ziel erscheint. Man sieht also nicht die einzelnen Schritte.
Nun möchte ich die Sichtbarkeit eines Einzelschritts erreichen, indem ich die invalidate() Funktion verzögere.
Dazu habe ich folgendes versucht:
a) Den Klassiker. Funktioniert überhaupt nicht. Das Programm steigt aus.
Code:
invalidate()
try {
Thread.sleep(1000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
oder dies. Das führt zwar dazu, dass man das Programm nach der Displayberührung verzögern kann, aber leider nicht jedes Mal den einzelnen Schritt der Spielfigur.
Code:
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
invalidate()
}
}, 100);
und einen Timer. Das führt zwar in etwa zum gleichen Ergebnis.
Code:
Thread timer = new Thread() {
public void run(){
try {
invalidate()
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
timer.start();
invalidate();
Daher meine Fragen:
1) Habe ich das überhaupt richtig verstanden, dass invalidate() das Spielfeld jedesmal neu zeichnet?
2) Was ist an den o.g. Methoden falsch?
Ich weiß, dass für die Beantwortung der Fragen erst das genannte Programm nachvollzogen werden muss, was man nicht in 1-2 Minuten machen kann. Aber vielleicht kennt sich ja jemand damit aus.
Danke und gruß!