2011-07-25 2 views
0

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!

Répondre

0

Vous ne pouvez pas diffuser votre ApplicationContext sur votre Activity principal (GameName) car ce n'est pas le même objet. D'une certaine manière, getApplicationContext() ne correspond pas au premier Activity lancé mais à l'application elle-même.

Pour moi, vous devriez essayer d'avoir des activités distinctes au lieu d'essayer de changer la disposition et le comportement d'un seul Activity. Ce serait plus simple pour vous et cela éviterait le genre de problèmes auxquels vous êtes confrontés. En fait, chaque setContentView() que je vois dans le code devrait correspondre à un commutateur.

De cette façon, vous auriez quelque chose comme:

  • WelcomeActivity (probablement GameName ici): sélectionnez les options du jeu et commencer à
  • PlayingActivity: le jeu lui-même. C'est là que le gameplay est.
  • GameOverActivity: affiche le score, ou tout ce que vous voulez montrer une fois le jeu terminé

Ce sans savoir quel type de jeu que vous faites, mais ce squelette devrait bien fonctionner avec arcade/action, jeu de rôle/aventure ou même labyrinthe/jeux de Dieu.

+0

donc je pourrais juste changerContentView à une activité différente? de toute autre activité? – sirmdawg

+0

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

+1

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é. –

0

Je recommanderais d'utiliser Handlers. Il vous permet de communiquer en toute sécurité avec le thread de l'interface utilisateur sans vous soucier du thread sur lequel vous êtes actuellement.