2010-04-13 12 views
7

Pensavo di aver capito questa domanda, ma qui qualcosa non va. Quando l'utente (io, finora) cerca di premere i tasti, non succede nulla, e sto avendo molti problemi a capire cosa mi sia perso.Quali sono le basi per gestire gli eventi di input dell'utente in Android?

Considerare questo prima di presentare un codice per chiarire il mio problema: sto utilizzando l'esempio di Lunar Lander di Android per realizzare il mio primo "vero" programma Android. In questo esempio, ovviamente, esiste una classe LunarView e la classe nidificata in LunarThread. Nel mio codice gli equivalenti di queste classi sono rispettivamente Graphics e GraphicsThread.

Inoltre posso creare animazioni sprite in 2D su Android. Ho una lezione di giocatore, e diciamo che GraphicsThread ha un giocatore chiamato "giocatore". Questa classe ha quattro coordinate - x1, y1, x2 e y2 - e definiscono un rettangolo in cui deve essere disegnato lo sprite. L'ho risolto per poterlo gestire perfettamente. Ogni volta che viene richiamato il metodo doDraw (Canvas canvas), si guarderanno i valori di tali coordinate e si disegnerà lo sprite di conseguenza.

Ora diciamo - e questo non è proprio quello che sto cercando di fare con il programma - Sto provando a fare in modo che il programma in cui tutto ciò che fa sia visualizzare lo sprite di Player in una posizione dello schermo fino alla fine PRIMA volta che l'utente preme il pulsante sinistro del Dpad. Quindi la posizione verrà modificata in un'altra posizione impostata sullo schermo e lo sprite verrà disegnato in quella posizione per il resto del programma invariabilmente.

Si noti inoltre che il membro GraphicsThread in Graphics è denominato "thread" e che il membro SurfaceHolder in GraphicsThread è denominato "mSurfaceHolder".

Quindi considerare questo metodo nella classe Graphics:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent msg) { 
    return thread.keyDownHandler(keyCode, msg); 
} 

anche perche questo metodo nella classe GraphicsThread:

boolean keyDownHandler(int keyCode, KeyEvent msg) { 
    synchronized (mSurfaceHolder) { 
     if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { 
      player.x1 = 100; 
      player.y1 = 100; 
      player.x2 = 120; 
      player.y2 = 150; 
     } 
    } 
    return true; 
} 

Ora assumendo quindi le coordinate di quel giocatore inizia come (200, 200, 220 , 250), perché non farà nulla di diverso quando premo Dpad: Sinistra?

Grazie!

+2

mettere giù alcuni punti di rottura ed essere sicuri che il vostro raggiungere le linee di codice in cui si imposta la posizione del giocatore. Se i valori vengono impostati, è molto probabile che il metodo di disegno non venga chiamato dopo aver impostato la posizione. In caso contrario, o stai controllando il codice chiave sbagliato o hai un problema di threading. –

+1

sei sicuro di riverniciare la tela in modo appropriato? chiama invalidate() per forzare la visualizzazione di una vista – YGL

risposta

1

Prima che io mi preoccuperei movimento reale e simili vorrei prendere in considerazione Log ...

Qualcosa di simile:

Log.d("lunar", "keyCode = ["+String.valueOf(keyCode)+"] // msg = ["+String.valueOf(msg)+"]"); 

In così posso capire cosa sta registrando il sistema prima di preoccuparmi di ciò che faccio con i dati registrati ... Dopo di che puoi decidere se stai anche inviando le cose giuste e puoi quindi preoccuparti del thread, ecc.

Speriamo che può aiutare a diagnosticare ecc (Tutto questo è stato scritto a mano libera, può contenere degli errori)

Problemi correlati