Je crée un jeu Android simple écrit en Java.setContentView() dans un thread
J'ai mon activité ...
public class GameName extends Activity{
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
l'intérieur de la mise en page "principale" J'ai un bouton qui appelle une méthode appelée "startTheGame":
public void startTheGame(View v) {
theGame = new Panel(this);
setContentView(theGame);
}
Voici le code du panneau (simplifiée)
class Panel extends SurfaceView implements SurfaceHolder.Callback {
public GameThread _thread;
public Panel(Context context) {
super(context);
getHolder().addCallback(this);
setFocusable(true);
}
...
@Override
public void surfaceCreated(SurfaceHolder holder) {
_thread = new GameThread(getHolder(), this);
_thread.setRunning(true);
_thread.start();
}
...
}
comme vous pouvez le voir, j'ai une classe « GameThread » qui a commencé ... ici il est ci-dessous:
class GameThread extends Thread {
private SurfaceHolder _surfaceHolder;
private Panel _panel;
private boolean _run = false;
public GameThread(SurfaceHolder surfaceHolder, Panel panel) {
_surfaceHolder = surfaceHolder;
_panel = panel;
}
public void setRunning(boolean run) {
_run = run;
}
@Override
public void run() {
Canvas c;
while (_run) {
c = null;
try {
...
if (health <= 0) {
_run = false;
//change views?
setContentView(R.layout.over);
}
c = _surfaceHolder.lockCanvas(null);
synchronized (_surfaceHolder) {
_panel.onDraw(c);
}
...
} finally {
// do this in a finally so that if an exception is
// thrown
// during the above, we don't leave the Surface in an
// inconsistent state
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
try {
Thread.sleep(60);
} catch (Exception e) {
}
}
}
}
Espérons que vous pouvez voir que si la santé est < = 0, il arrête le fil et je suis en train de passer à une autre disposition que j'ai créé appelé « sur ».
Il arrête simplement l'écran de mise à jour (dessin), mais je ne vois jamais le nouveau panneau.
J'ai essayé:
GameName cs = ((GameName)getApplicationContext())
cs.setContentView(R.layout.over);
Mais je reçois un ClassCastException ...
S'il vous plaît aider!
donc je pourrais juste changerContentView à une activité différente? de toute autre activité? – sirmdawg
Oui, et chaque activité serait liée à une vue de contenu unique. Ou deux d'entre eux devraient vous différencier du portrait et du paysage: tant que le changement n'est que technique, ça va.La chose à éviter est d'avoir une activité qui a plusieurs rôles. – Shlublu
Si votre cible est de niveau API 5 ou supérieur, vous pouvez appeler 'overridePendingTransition (0, 0)' avant de commencer votre nouvelle activité pour vous débarrasser de l'animation d'activité. –