Cara acho que não da as classes são muitos extensas possuem mais de 1000 linhas.
Eu possuo uma classe principal chamada de FuryBlastView.java ( é tipo uma engine do jogo, faz renderização gráfica, atualização física, possue a thread em que o jogo roda, lê as entradas feitas no teclado ) e outra que se chama MySprite.java( classe que quero utilizar para criar objetos Sprite e vincula-los a imagens, para poder ter uma automação maior para lidar com o protagonista e os inimigos ).
Eu crio os objetos MySprite dentro da classe principal que é a FuryBlastView e nele eu tenho acesso a alguns métodos como o moveSprite() que é da classe MySprite.java.
O moveSprite() é chamado dentro da função que pega a movimentação que é o doKeyDown().
/**
* Handles a key-down event.
*
* @param keyCode the key that was pressed
* @param msg the original event object
* @return true
*/
boolean doKeyDown(int keyCode, KeyEvent msg) {
synchronized (mSurfaceHolder) {
boolean okStart = false;
if (keyCode == KeyEvent.KEYCODE_SPACE || keyCode == KeyEvent.KEYCODE_DPAD_UP ) okStart = true;
//mX = mAxelSprite.getX();
//mY = mAxelSprite.getY();
if (okStart
&& (mMode == STATE_READY || mMode == STATE_LOSE || mMode == STATE_WIN)) {
// ready-to-start -> start
doStart();
return true;
} else if (mMode == STATE_PAUSE && okStart) {
// paused -> running
unpause();
return true;
} else if (mMode == STATE_RUNNING) {
if ( keyCode == KeyEvent.KEYCODE_J ) {
setPunching( true );
keyPressed( 1 );
return true;
} else if (mMode == STATE_RUNNING) {
if ( keyCode == KeyEvent.KEYCODE_K ) {
setKicking( true );
keyPressed( 2 );
return true;
} else if ( keyCode == KeyEvent.KEYCODE_L ) {
setJumping( true );
keyPressed( 3 );
return true;
// left/a <- left
} else if ( keyCode == KeyEvent.KEYCODE_A ) {
mAxelSprite.setLeft( true );
mAxelSprite.setRight( false );
status( 2 );
//mAxelSprite.loadAxel( mContext );
mAxelSprite.moveAxel( mAxel_walkingBack, 1, 0 );
mX = mAxelSprite.getX();
//moveSprite( mDX, mDY );
return true;
// right/d -> right
} else if (keyCode == KeyEvent.KEYCODE_D) {
mAxelSprite.setLeft( false );
mAxelSprite.setRight( true );
status( 1 );
//mAxelSprite.loadAxel( mContext );
mAxelSprite.moveAxel( mAxel_walking, 1, 0 );
mX = mAxelSprite.getX();
//moveSprite( mDX, mDY );
return true;
// up -> pause
} else if (keyCode == KeyEvent.KEYCODE_ENTER) {
pause();
return true;
}
}
}
return false;
}
}
O mAxelSprite é o objeto da classe MySprite.java, conseguir fazer a movimentação não é o problema o problema é que como possuo duas imagens na tela a do inimigo e a do protagonista eu preciso tratar elas de forma diferentes porque senão quando ocorre a movimentação do protagonista o inimigo se move também. Era necessário um jeito no método moveSprite() de ele receber uma imagem para mover como eu tentei fazer acima e mover somente aquela imagem. Aqui vai o código do moveSprite() método da classe mySprite().
/**
* Custom method that moves a Sprite
*/
public void moveAxel( Bitmap bmp, double dx, double dy ){
// deve de algum modo receber a imagem que ele deve mover
bmp = this.myBitmap;
mDX += dx;
mDY += dy;
// Catch the back movement
if ( mLeft ){
mX += -mDX;
if ( mDX > -5 ){
mDX = 5;
}
}
else{
mX += mDX;
//Log.d( TAGFBV, "" + mDX );
if ( mDX > 5 ){
mDX = 5;
}
}
//Screen Limit
if(mX < -40)
mX = -40;
if(mX > 370)
mX = 370; }
João Pedro