2014-01-20 2 views
0

Я новичок в andengine. Я попробовал в качестве основного упражнения сделать игру, в которой, когда вы нажимаете одну кнопку, спрайт идет влево, а когда я нажимаю другую кнопку, спрайт идет вправо. Спрайт должен идти влево или вправо. В то время как любая из кнопок . При этом, используя мой текущий код, когда я нажимаю любую кнопку, спрайт идет влево или вправо на 10 пикселей, а затем останавливается независимо от того, как долго я держу кнопку. Итак, вот код.Как сделать что-то, когда нажата TouchArea

package com.example.and_tryout; 

import org.andengine.engine.camera.Camera; 
import org.andengine.engine.options.EngineOptions; 
import org.andengine.engine.options.ScreenOrientation; 
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy; 
import org.andengine.entity.modifier.MoveXModifier; 
import org.andengine.entity.scene.Scene; 
import org.andengine.entity.sprite.Sprite; 
import org.andengine.input.touch.TouchEvent; 
import org.andengine.opengl.texture.ITexture; 
import org.andengine.opengl.texture.bitmap.BitmapTexture; 
import org.andengine.opengl.texture.region.ITextureRegion; 
import org.andengine.opengl.texture.region.TextureRegionFactory; 
import org.andengine.ui.activity.SimpleBaseGameActivity; 
import org.andengine.util.adt.io.in.IInputStreamOpener; 
import org.andengine.util.debug.Debug; 

import java.io.IOException; 
import java.io.InputStream; 

public class MainActivity extends SimpleBaseGameActivity { 
    private static int CAMERA_WIDTH = 800; 
    private static int CAMERA_HEIGHT = 480; 
    private ITextureRegion mtexture; 
    private ITextureRegion mleft,mright; 

    @Override 
    public EngineOptions onCreateEngineOptions() { 
     // TODO Auto-generated method stub 
     Camera camera = new Camera(0,0,CAMERA_WIDTH,CAMERA_HEIGHT); 
     return new EngineOptions(true,ScreenOrientation.LANDSCAPE_FIXED,new RatioResolutionPolicy(CAMERA_WIDTH,CAMERA_HEIGHT),camera); 
} 

    @Override 
    protected void onCreateResources() { 
    // TODO Auto-generated method stub 
     try{ 
      ITexture texture = new BitmapTexture (this.getTextureManager(), new IInputStreamOpener(){ 

       @Override 
       public InputStream open() throws IOException { 
        // TODO Auto-generated method stub 
        return getAssets().open("png/ring2.png"); 
       } 

      }); 
      ITexture leftt = new BitmapTexture(this.getTextureManager(),new IInputStreamOpener(){ 

       @Override 
       public InputStream open() throws IOException { 
        // TODO Auto-generated method stub 
        return getAssets().open("png/left.png"); 
       } 
      }); 
      ITexture rightt = new BitmapTexture(this.getTextureManager(),new IInputStreamOpener(){ 

       @Override 
       public InputStream open() throws IOException { 
        // TODO Auto-generated method stub 
        return getAssets().open("png/right.png"); 
       } 
      }); 
      texture.load(); 
      leftt.load(); 
      rightt.load(); 
      this.mtexture = TextureRegionFactory.extractFromTexture(texture); 
      this.mleft = TextureRegionFactory.extractFromTexture(leftt); 
      this.mright = TextureRegionFactory.extractFromTexture(rightt); 

      }catch(IOException e){ 
       Debug.e (e); 
      } 

    } 

    @Override 
    protected Scene onCreateScene() { 
     Scene scene = new Scene(); 
     scene.getBackground().setColor(0.09804f, 0.6274f, 0.8784f); 
     final Sprite spr = new Sprite(0,0,mtexture,getVertexBufferObjectManager()); 
     Sprite left = new Sprite(0,420,60,60,mleft,getVertexBufferObjectManager()){ 
      @Override 
      public boolean onAreaTouched(TouchEvent event,float X,float Y){ 
       spr.registerEntityModifier(new MoveXModifier(0.5f,spr.getX(),spr.getX()-10)); 
       return true; 
      } 

     }; 
     Sprite right = new Sprite(740,420,60,60,mright,getVertexBufferObjectManager()){ 
      @Override 
      public boolean onAreaTouched(TouchEvent event,float X,float Y){ 
       spr.registerEntityModifier(new MoveXModifier(0.5f,spr.getX(),spr.getX()+10)); 
       return true; 
      } 
     }; 
     scene.attachChild(spr); 
     scene.attachChild(left); 
     scene.attachChild(right); 
     scene.registerTouchArea(left); 
     scene.registerTouchArea(right); 
     return scene; 
    } 

} 

Я не могу понять любой solution.I've поиск Google много, и это не дает мне ничего об этом.

ответ

1

место условия приземлится, подкраски и сенсорный шаг в onTouchArea спрайта следующим образом:

  public boolean onAreaTouched(TouchEvent event,float X,float Y){ 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        spr.registerEntityModifier(new MoveXModifier(0.5f,spr.getX(),spr.getX()-10)); 
     } 
     if (event.getAction() == MotionEvent.ACTION_UP) { 
} 
    } 
0
Try this 

    Sprite left = new Sprite(0,420,60,60,mleft,getVertexBufferObjectManager()) 
    { 
       @Override 
       public boolean onAreaTouched(TouchEvent event,float X,float Y) 
       { 

        if (event.getAction() == MotionEvent.ACTION_DOWN) 
        { 
         spr.clearEntityModifiers() 
         spr.registerEntityModifier(new MoveXModifier(0.5f,spr.getX(),spr.getX()-10)); 
        }     
        return true; 
       } 
    }; 
    Sprite right = new Sprite(740,420,60,60,mright,getVertexBufferObjectManager()) 
    { 
       @Override 
       public boolean onAreaTouched(TouchEvent event,float X,float Y) 
       { 
        if (event.getAction() == MotionEvent.ACTION_DOWN) 
        { 

Blockquote 

         spr.clearEntityModifiers() 
         spr.registerEntityModifier(new MoveXModifier(0.5f,spr.getX(),spr.getX()+10)); 
        }  
        return true; 
       } 
    }; 
0

Лучше использовать PhysicsHandler для перемещения спрайта с velocity.Modifiers а не до тех пор, пока они не закончатся, поэтому ваш спрайт снова не пойдет дальше, даже нажав кнопку.

Иначе, если вы хотите просто простую непрерывную Движение u можете просто увеличить положение спрайта.

@Override 
       public boolean onAreaTouched(TouchEvent event,float X,float Y) 
       { 

        if (event.getAction() == MotionEvent.ACTION_DOWN) 
        { 
         spr.setPosition(spr.getX()+1, spr.getY()); 
        }     
        return true; 
       } 

сделать то же самое для левого движения с spr.getX() - 1

Смежные вопросы