Z
Zonnex
Erfahrenes Mitglied
- 49
Hi,
um Bewegung in ein Spiel zu kriegen benutze ich z.Z. zwei Threads mit jeweils einem Handler (Ausschnitt ganz unten im Beitrag)
Trotz der gesetzten Pausen via "handler.postDelayed(runnable, millisek)"
entstehen scheinbar durch den ausgeführten code enorme Verzögerungen, sprich der emulator/das Handy kommen nicht hinterher..
hab im Internet schon haufenweise Sachen über Threads gefunden u.a. LunarLander von Google... jedoch erschließt sich mir auch aus letzterem nicht wie man einen Thread macht der das Spiel immer in der selben Geschwindigkeit wiedergibt (ohne das schnellere Hardware das Spiel schneller macht)
Nachtrag:
- ohne "handler.postDelayed(runnable, millisek)" läuft das Programm scheinbar flüssig (sprich der ball rast von Ecke zu Ecke)
- beim berühren des Displays merkt man wie der Ball-Thread ruckelt
1. der Spieler wird in die Richtung der Touchposition bewegt
2. ein Ball bewegt sich autmatisch und es wird geprüft ob eine Kollision mit dem Rand oder Spieler entsteht
um Bewegung in ein Spiel zu kriegen benutze ich z.Z. zwei Threads mit jeweils einem Handler (Ausschnitt ganz unten im Beitrag)
Trotz der gesetzten Pausen via "handler.postDelayed(runnable, millisek)"
entstehen scheinbar durch den ausgeführten code enorme Verzögerungen, sprich der emulator/das Handy kommen nicht hinterher..
hab im Internet schon haufenweise Sachen über Threads gefunden u.a. LunarLander von Google... jedoch erschließt sich mir auch aus letzterem nicht wie man einen Thread macht der das Spiel immer in der selben Geschwindigkeit wiedergibt (ohne das schnellere Hardware das Spiel schneller macht)
Nachtrag:
- ohne "handler.postDelayed(runnable, millisek)" läuft das Programm scheinbar flüssig (sprich der ball rast von Ecke zu Ecke)
- beim berühren des Displays merkt man wie der Ball-Thread ruckelt
1. der Spieler wird in die Richtung der Touchposition bewegt
Code:
UpdateThread = new Runnable()
{
@Override
public void run()
{
if(i_pos != i_center)
{
if(i_pos > i_center)
{
i_center++;
}
else
{
i_center--;
}
}
postInvalidate();
updateHandler.postDelayed(this, 5);
}
};
2. ein Ball bewegt sich autmatisch und es wird geprüft ob eine Kollision mit dem Rand oder Spieler entsteht
Code:
updateHandler = new Handler();
UpdateThread = new Runnable()
{
@Override
public void run()
{
if(isRun)
{
update();
updateHandler.postDelayed(this, 2);
}
else
{
gameStart();
updateHandler.postDelayed(this, 1000);
}
}
};
updateHandler.post(UpdateThread);
public void update()
{
kollision();
ball.move();
}
public void gameStart()
{
if(i_start > 0)
{
tv_balls.setText("Spiel startet in " + i_start + " s!");
i_start--;
}
else
{
ball.reset();
isRun = true;
i_start = 5;
i_balls = 3;
tv_balls.setText("Bälle: " + i_balls);
}
}
public void kollision()
{
if(ball.getL() <= 0 || ball.getR() >= bg.getR())
{
ball.toggleX();
};
if(ball.getT() <= 0)
{
ball.toggleY();
}
else if(ball.getB() >= player.getT())
{
if(ball.getCx() >= player.getL() && ball.getCx() <= player.getR())
{
ball.toggleY();
}
else
{
i_balls--;
if(i_balls > 0)
{
tv_balls.setText("Bälle: " + i_balls);
ball.reset();
}
else
{
tv_balls.setText("Loose!");
isRun = false;
}
};
};
}
Zuletzt bearbeitet: