精灵在手指方向上以速度移动

时间:2013-07-07 12:07:08

标签: android andengine

我正在使用开源游戏平台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;
}

等待你的超级敲门声。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

修改

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

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