【问题标题】:sprite moving on finger directions with velocity精灵以速度在手指方向上移动
【发布时间】:2013-07-07 12:07:07
【问题描述】:

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

等待你的超级敲门声。

【问题讨论】:

    标签: android andengine


    【解决方案1】:

    您必须计算飞行员当前位置之间的差异(例如,通过调用您的飞行员精灵的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)而不是设置当前速度为velocity(保持速度)

    编辑

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

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

    【讨论】:

    • 感谢回复。可以获取 MainActivity.this.mCamera.convertCameraSceneToSceneTouchEvent(touchEvent);这一行。
    • @shihab_returns 看到我的编辑,这条线可能对你没用,只要你不使用 HUD 并将监听器添加到你的场景而不是 hud ;-)
    • 是的,它有效!现在想移动精灵的方向/角度。我必须找到两点的斜率并设置旋转(角度)吗?
    • @shihab_returns 您可以使用PhysicsHandler.setAngularVelocity(float radian) 直到body/sprite 具有正确的旋转(这将导致平滑的旋转运动),或者您可以使用body.setTransform(position, radians) 立即将body 移动到角度你要。角度本身应使用Math.atan2(yDiff/xDiff) 计算,要使用浮点值而不进行强制转换,您可以直接使用andengine 包中的MathUtils.atan2(yDiff/xDiff)
    • 当我使用 PhysicsHandler.setAngularVelocity(float radian) 但它连续旋转。为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多