Modelagem de classe

8 respostas
B

Minha dúvida é quanto a modelagem de uma classe. Eu fiz um jogo e até agora ele trabalha com apenas duas classes. Uma que serve como engine que possui a thread principal do jogo dentro de si e a outra que simplesmente executa outras coisas importantes. Eu fiz o personagem principal se mover com um método que eu criei chamado moveSprite(). Quando eu coloco o sprite do inimigo este método esta movendo os dois sprites na tela ao invés de mover apenas o do protagonista.

Preciso encontrar um meio de tratar esses dois objetos Sprites de forma diferente. Para que quando o jogador mova o protagonista as ações deste personagem não interfiram no inimigo.

João Pedro

8 Respostas

ViniGodoy

Ué, mas vc não criou duas instâncias de sprites diferentes?

Ou você é daqueles onde tudo no programa é static?

B

Sim até criei duas instâncias com uma classe Sprite que eu fiz, um objeto para o protagonista e outro para o inimigo. Mas o método moveSprite() acaba movendo tudo que esta na tela e isto inclui o inimigo.

ViniGodoy

Então posta o código.

B
// Here we create sprites for the game
            mAxelSprite = createSprite( mAxel_walking, 69, 113 );
            mEnemySprite = createSprite( mEnemyState_01, 69, 113 );

       /**
         * Generic function to create a sprite         
         */
        public SpriteCloak createSprite( Bitmap bmp, int x, int y ){
      	   try{
      		SpriteCloak s = new SpriteCloak ( bmp, 69, 113 );
      		 return s;
      		}catch( Exception e ){
		        	   Log.e( TAGFBV, "Create Sprite error: " + 
		        			   e.getMessage() );
		    return null;
		           }
      }
        
        /**
         * Custom method that moves a Sprite
         */
        public void moveSprite( int dx, int dy ){
        	long now = System.currentTimeMillis();
        	
        	// Base accelerations -- 0 for x, gravity for y
            double ddx = 10.0;
            double ddy = 0.0;
 
            double elapsed = (now - mLastTime) / 1000.0;
    
            // figure speeds for the end of the period
            mDX += ddx;
            mDY += ddy;	

            // Catch the back movement
            if ( mLeft ){
            	//mX +=  -elapsed * (mDX + dxOld);
            	mX +=  -elapsed * (mDX);
            }
            else{
            	mX +=  elapsed  * (mDX);
            }
       
           
            if(mX < -40)
          	     mX = -40;
           if(mX > 370)
          	     mX = 370;
        }

      /**
         * 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;
                
                mPositionX = mAxelSprite.getX();
        		mPositionY = 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 ) {
                    	setLeft( true );
                    	setRight( false );
                    	status( 2 );
                    	moveSprite( mDX, mDY );
                    	return true;
                        // right/d -> right
                  } else if (keyCode == KeyEvent.KEYCODE_D) {
                    	setLeft( false );
                    	setRight( true );
                	    status( 1 );
                	    moveSprite( mDX, mDY );
                        return true;
                        // up -> pause
                   } else if (keyCode == KeyEvent.KEYCODE_ENTER) {
                        pause();
                        return true; 
                    }
                }
              }
              return false;
            }
        }

Ai estão os métodos principais, em cima crio o sprite com aquele método que é da classe SpriteCloak, depois tem o método de movimento feito pelo personagem e depois o método que capta o movimento ou seja quando o usuário apertar D ou A ele se move para direita e para a esquerda. Lembro de ter tentando chamar o método moveSprite() com um objeto da classe SpriteCloak para tentar mover apenas o protagonista, mas não deu certo também.

B

Minha dúvida mesmo é como vincular o moveSprite() ao sprite do protagonista para assim eu poder tratar ele diferente do sprite do inimigo.

João Pedro

M

Poste as 2 classes que você está usando para que possamos nos encontrar.

B

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

M

Agora eu entendi seu problema, mas para que possamos ajudar, insisto que coloque aqui o código (por ser grande, compacte as duas classes e mande o arquivo compactado como anexo para podermos abrir isso em uma IDE).

Criado 8 de dezembro de 2009
Ultima resposta 13 de dez. de 2009
Respostas 8
Participantes 3