0

我正在使用开源游戏平台 andEngine。我有一个在屏幕上连续移动并在与屏幕边界碰撞时改变方向的精灵。现在,我想将其方向更改为屏幕上的玩家触摸点。我无法管理这部分。我使用PhysicsHandler以一定速度移动精灵。我知道我必须实现IOnSceneTouchListener才能接触点并在精灵上设置方向。但是现在什么都没发现。这是我的代码:

Pilot aPilot;
PhysicsHandler mPhysicsHandler;

    aPilot = new Pilot(222, 333, pilotTexures, vbom) {
        @Override
        protected void onManagedUpdate(float pSecondsElapsed) {
            /*
             * change direction when collides with boundary wall of Screen
             */
            if (this.mX < 0) {
                mPhysicsHandler.setVelocityX(AtomicEngine.DEMO_VELOCITY);

            } else if (this.mX + this.getWidth() > ResourcesManager.CAMERA_WIDTH) {
                mPhysicsHandler.setVelocityX(-AtomicEngine.DEMO_VELOCITY);
            }

            if (this.mY < 0) {
                mPhysicsHandler.setVelocityY(AtomicEngine.DEMO_VELOCITY);
            } else if (this.mY + this.getHeight() > ResourcesManager.CAMERA_HEIGHT) {
                mPhysicsHandler.setVelocityY(-AtomicEngine.DEMO_VELOCITY);
            }
            super.onManagedUpdate(pSecondsElapsed);
        }

    };
    /*
     * initialize mPhysicsHandler
     */
    mPhysicsHandler = new PhysicsHandler(aPilot);
    registerUpdateHandler(this.mPhysicsHandler);
    mPhysicsHandler.setVelocity(AtomicEngine.DEMO_VELOCITY,
            AtomicEngine.DEMO_VELOCITY);
    attachChild(aPilot);
    aPilot.setScale(3f);

而我的覆盖onSceneTouchEvent方法是这样的:

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

    if (pSceneTouchEvent.isActionDown()) {

        // need some idea here
    }else if (pSceneTouchEvent.isActionMove()) {

    }
    return false;
}

等待你的超级敲门声。

4

1 回答 1

2

您必须计算飞行员当前位置之间的差异(例如,通过调用getSceneCenterCoordinates()您的飞行员精灵,您可以获得场景中的坐标)和触摸事件的位置 - 考虑到这种差异,您可以计算角度(在UnitCircle)或使用 max_velocity 和距离长度之间的百分比因子,然后使用您的物理处理程序并设置新的速度。该因子用于将速度限制为最大速度。

所以,你的代码应该看起来像这样(没有测试,询问它是否不起作用)

@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
    MainActivity.this.mCamera.convertCameraSceneToSceneTouchEvent(touchEvent);//see edit
    float touchX = touchEvent.getX();
    float touchY = touchEvent.getY();
    float[] pilotCoord = aPilot.getEntity.getSceneCenterCoordinates();
    float pilotX = pilotCoord[0];
    float pilotY = pilotCoord[1];
    float xDiff = touchX - pilotX;
    float yDiff = touchY - pilotY; // could be wrong with AnchorCenter branch

    // use the max velo divided by the distance to get the velo factor for x & y, 
    // but perhaps calculating angles is faster, dunno
    float veloFactor = MAX_VELO/sqrt(xDiff^2 + yDiff^2); 
    float xVelo = xDiff*veloFactor;
    float yVelo = yDiff*veloFactor;
    mPhysicshandler.setVelocityX(xVelo);
    mPhysicshandler.setVelocityY(yVelo);
    return true;
}

到目前为止,将速度设置为手指方向的计算。如果你想要某种(去)加速(比如:只要手指向下,飞行员(去)加速到手指的方向,否则他会坚持他的速度,你必须setLinearVelocity(xVelo, yVelo)改为设置当前速度作为速度(保持速度)

编辑

将 touchEvent 从 CameraScene 转换为 SceneTouchEvent 仅在将您添加onSceneTouchListener到 HUD 时才有用。它将基于当前摄像机位置(在场景上)的事件 x/y 值转换为 xy 值,就像它们在场景中发生的一样。

否则,如果您将侦听器直接添加到场景中,则无需转换触摸事件并且可以删除该行。

于 2013-07-08T01:40:13.580 回答