Android 如何在按下触摸区域时执行操作

Android 如何在按下触摸区域时执行操作,android,andengine,sprite,Android,Andengine,Sprite,我是新来安德林的。 作为一个基本练习,我尝试制作一个游戏,当你按下一个按钮时,精灵向左移动,当我按下另一个按钮时,精灵向右移动。当按下任何按钮时,精灵应该向左或向右移动。但是,根据我目前的代码,当我按下任何按钮时,精灵向左或向右移动10像素,然后不管我按住按钮多久都会停下来。 这是代码 package com.example.and_tryout; import org.andengine.engine.camera.Camera; import org.andengine.engine.op

我是新来安德林的。 作为一个基本练习,我尝试制作一个游戏,当你按下一个按钮时,精灵向左移动,当我按下另一个按钮时,精灵向右移动。当按下任何按钮时,精灵应该向左或向右移动。但是,根据我目前的代码,当我按下任何按钮时,精灵向左或向右移动10像素,然后不管我按住按钮多久都会停下来。 这是代码

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;
    }

}

我想不出任何解决方案。我在谷歌上搜索了很多次,但它没有给我任何关于这方面的信息。

将条件触地、触地和触地移动放置在精灵的触地区域中,如下所示:

         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) {
}
    }

最好使用PhysicsHandler以一定速度移动精灵。修改器在完成之前无法访问,这就是为什么即使按下按钮,精灵也不会再移动得更远

否则,如果你想要简单的连续运动,你可以简单地增加精灵的位置

@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对左运动执行相同的操作

@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;
                }