Andengine,如何使用触摸屏移动精灵

3
我开始使用Andengine,但在触摸屏幕(而不是精灵)时移动精灵时遇到了困难。我真的需要你的帮助,非常感谢。
这是我的代码:
    @Override
protected Scene onCreateScene() {
    final Scene scene = new Scene();
    Sprite backgroundSprite = new Sprite(0, 0, this.mBackgroundTextureRegion, getVertexBufferObjectManager());
    scene.attachChild(backgroundSprite);
    Carl carl = new Carl(1, 30, 361, this.carl, getVertexBufferObjectManager()){

        };

    scene.attachChild(carl);



    this.mStack1.add(carl);
    carl.setmStack(mStack1);
    scene.registerTouchArea(carl);
    scene.setTouchAreaBindingOnActionDownEnabled(true);


    return scene;
}
public boolean onTouchEvent(MotionEvent event, Carl carl) {

    carl.setPosition(carl.getX() +2,carl.getY() );
    return true;
}
2个回答

3
您可以实现 IOnSceneTouchListener 接口,然后重写 onSceneTouchEvent 方法,在该方法中您可以对您的球进行操作。
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
     carl.setPosition(carl.getX() +2,carl.getY() );
    return false;
}

但不要忘记在protected Scene onCreateScene()中添加scene.setOnSceneTouchListener(this);

编辑:

boolean canGo = false;

@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
    if (pSceneTouchEvent.getAction() == MotionEvent.ACTION_DOWN)
        canGo = true;
    if (pSceneTouchEvent.getAction() == MotionEvent.ACTION_UP)
        canGo = false;
    return false;
}

这将添加到您的public Scene onCreateScene() {

scene.registerUpdateHandler(new IUpdateHandler() {
    @Override
    public void reset() {}
    @Override
    public void onUpdate(float pSecondsElapsed) {
        // TODO Auto-generated method stub
        if (canGo)
            ball.setPosition(ball.getX() + 2, ball.getY());
    }
});

好的,非常感谢。现在onSceneTouchEvent函数正常工作了:D,但是精灵的位置刷新没有生效,应该怎么做? - Alexandre Nicolas
奇怪,例如我做了这个:ball.setPosition(pSceneTouchEvent.getX(), pSceneTouchEvent.getY()); 它将球设置到被点击的位置。你能描述一下,你想让球做什么吗? - Aleksandrs
这不是一个球,而是一个角色,我只想让它在我们触摸屏幕时向右移动。 - Alexandre Nicolas
很高兴能帮到你。祝你在游戏开发中好运。 - Aleksandrs

0

你也可以使用移动修饰符向上或向下移动。

 public class MainActivity extends BaseGameActivity implements IOnSceneTouchListener {

    private static final int CAMERA_WIDTH = 800;
    private static final int CAMERA_HEIGHT = 480;

    private BitmapTextureAtlas characterTextureAtlas;
    private ITiledTextureRegion characterTiledTextureRegion;
    private AnimatedSprite characterAnimatedSprite;

    boolean canGo = false;

    public static final String TAG = "Cowboy#";


    private Scene scene;

    @Override
    public EngineOptions onCreateEngineOptions() {
        Camera camera = new Camera(0,0, CAMERA_WIDTH, CAMERA_HEIGHT);
        return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new FillResolutionPolicy(), camera);
    }

    @Override
    public void onCreateResources(OnCreateResourcesCallback pOnCreateResourcesCallback) throws IOException {
        BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
        characterTextureAtlas = new BitmapTextureAtlas(mEngine.getTextureManager(), 640, 320, TextureOptions.BILINEAR);
        characterTiledTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(characterTextureAtlas, this, "walkman640x320.png", 0, 0, 8, 1);
        characterTextureAtlas.load();

        pOnCreateResourcesCallback.onCreateResourcesFinished();
    }

    @Override
    public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback) throws IOException {
        scene = new Scene();
        scene.setOnSceneTouchListener(this);

        characterAnimatedSprite = new AnimatedSprite(120, 120, characterTiledTextureRegion, mEngine.getVertexBufferObjectManager()){


            @Override
            protected void onManagedUpdate(float pSecondsElapsed) {
                super.onManagedUpdate(pSecondsElapsed);
//                Log.d(TAG, "onManagedUpdate: counting#");
            }
        };
        characterAnimatedSprite.animate(50);

        scene.attachChild(characterAnimatedSprite);
        scene.setBackground(new Background(Color.CYAN));
        scene.registerUpdateHandler(new IUpdateHandler() {
            @Override
            public void reset() {}
            @Override
            public void onUpdate(float pSecondsElapsed) {
                // TODO Auto-generated method stub
                //moves character 2 steps forward along x-axis
//                if (canGo){
//                    characterAnimatedSprite.setPosition(characterAnimatedSprite.getX() + 2, characterAnimatedSprite.getY());
//                }
                //moves character 8 steps upward along y-axis and back
//                if (canGo){
//                    characterAnimatedSprite.setPosition(characterAnimatedSprite.getX(), characterAnimatedSprite.getY()+30);
////                    characterAnimatedSprite.setPosition(characterAnimatedSprite.getX(), characterAnimatedSprite.getY()-8);
//                }

                if (canGo){
                    final float duration = 1;
//                    final float duration = 3;
                    final float fromX = characterAnimatedSprite.getX();
                    final float toX = characterAnimatedSprite.getX();
                    final float fromY = characterAnimatedSprite.getY();
                    final float toY = characterAnimatedSprite.getY() + 80;


                    //you can move in on axis using MoveYModifier or MoveXModifier
//                    MoveYModifier mod1=new MoveYModifier(constanttime,fromY,toY);
//                    sprite.registerEntityModifier(mod1);

                    final MoveModifier downMoveModifier = new MoveModifier(0.4f, fromX, toY, toX, fromY, new IEntityModifier.IEntityModifierListener() {
                        @Override
                        public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem) {
                            characterAnimatedSprite.stopAnimation(0);
                        }

                        @Override
                        public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) {
                            characterAnimatedSprite.animate(50);
                        }
                    });

                    final MoveModifier upMoveModifier = new MoveModifier(0.2f, fromX, fromY, toX, toY, new IEntityModifier.IEntityModifierListener() {
                        @Override
                        public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem) {
                            characterAnimatedSprite.stopAnimation(0);
                        }

                        @Override
                        public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) {
                            characterAnimatedSprite.registerEntityModifier(downMoveModifier);
                        }
                    });

                    characterAnimatedSprite.registerEntityModifier(upMoveModifier);
                }
            }
        });
        pOnCreateSceneCallback.onCreateSceneFinished(scene);
    }

    @Override
    public void onPopulateScene(Scene pScene, OnPopulateSceneCallback pOnPopulateSceneCallback) throws IOException {
        pOnPopulateSceneCallback.onPopulateSceneFinished();
    }

    @Override
    public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {

        if (pSceneTouchEvent.getAction() == MotionEvent.ACTION_DOWN)
            canGo = true;
        if (pSceneTouchEvent.getAction() == MotionEvent.ACTION_UP)
            canGo = false;
        return false;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接