1

我正在使用 DigitalOnScreenControl 来移动玩家精灵。但问题是我的玩家精灵离开了模拟器屏幕。我希望玩家精灵被限制在特定范围内移动,并且当我的精灵继续移动时,相机也可以专注于玩家精灵。

我正在尝试这段代码:

public Scene onLoadScene() {

    // Auto-generated method stub
    this.mEngine.registerUpdateHandler(new FPSLogger());
    final Scene mScene=new Scene();
    mScene.setBackground(new ColorBackground(0.09804f, 0.6274f, 0.8784f));



     final int centerX=(CAMERA_WIDTH-this.mPlayerTextureRegion.getWidth())/2;
     final int centerY=(CAMERA_HEIGHT-this.mPlayerTextureRegion.getHeight())/2;

     final Sprite player=new Sprite(centerX, centerY, this.mPlayerTextureRegion);

    this.mCamera.setChaseEntity(player);
     final PhysicsHandler physicsHandler=new PhysicsHandler(player);
     player.registerUpdateHandler(physicsHandler);

     mScene.attachChild(player);

     this.mDigitalOnScreenControl=new DigitalOnScreenControl(0,CAMERA_HEIGHT-mOnScreenControlBaseTextureRegion.getHeight(),this.mCamera,this.mOnScreenControlBaseTextureRegion,this.mOnScreenControlKnobTextureRegion,0.1f,new IOnScreenControlListener() {

        @Override
        public void onControlChange(BaseOnScreenControl pBaseOnScreenControl,
                float pValueX, float pValueY) {
            // TODO Auto-generated method stub
            physicsHandler.setVelocity(pValueX*100, pValueY*100);

        }
    });


     this.mDigitalOnScreenControl.getControlBase().setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
     this.mDigitalOnScreenControl.getControlBase().setAlpha(0.5f);
     this.mDigitalOnScreenControl.getControlBase().setScaleCenter(0, 128);
     this.mDigitalOnScreenControl.getControlBase().setScale(1.25f);
     this.mDigitalOnScreenControl.getControlKnob().setScale(1.25f);
     this.mDigitalOnScreenControl.refreshControlKnobPosition();

     mScene.setChildScene(this.mDigitalOnScreenControl);


    return mScene;
  }

老实说,我是andEngine开发中的新手,请提前帮助我。

4

1 回答 1

0

将播放器绑定到相机

您要求的是一种碰撞处理形式。本质上,当您将播放器移出场景时,您希望将播放器移回场景中,并且您希望在移动播放器后立即执行此操作,因此场外位置永远不会被渲染。

让我们把我刚才说的分开。您将播放器移动到此处:

physicsHandler.setVelocity(pValueX*100, pValueY*100);

使用physicsHandler 移动玩家是完全合理的,并且考虑到可变帧率,所以到目前为止,做得很好。现在,如果它们在场景之外,您希望将它们移回场景中。所以我们需要一种新方法。让我们在移动播放器后立即调用一个方法(我们将其称为“adjustToSceneBinding()”,这样你就有了:

physicsHandler.setVelocity(pValueX*100, pValueY*100);
adjustToSceneBinding(player);

旁注,我宁愿在播放器上使用此方法(即 player.adjustToSceneBinding()),但您的播放器对象只是一个精灵。我建议您将其更改为扩展 sprite 的自定义对象,以便您可以在那里输入您自己的代码。无论如何,让我们创建 adjustToSceneBinding() 方法。

public boolean adjustToSceneBinding(Sprite player) {

    // Correct the X Boundaries.
    if (player.getX() < 0) {
        player.setX(0);
    } else if (player.getX() + player.getWidth() > CAMERA_WIDTH) {
        player.setX(CAMERA_WIDTH - player.getWidth());
    }
}

看看我做了什么?如果玩家的 X 坐标小于零,则将它们移回零。如果玩家的 X PLUS 玩家的宽度大于相机宽度,则将它们移回相机宽度减去玩家宽度。不要忘记玩家 X 坐标代表精灵的左侧。这就是为什么我除了计算右侧的位置之外还要考虑宽度。

上面的代码只涉及左/右移动,但我将让你推断如何为 up down 做同样的事情。

而是将播放器绑定到地图大小

现在,我们到目前为止所做的实际上是针对地图“大小”不大于屏幕的情况。但通常你会想要一张比屏幕尺寸更大的地图和一个追逐玩家的摄像机。为此,只需替换上面的代码,其中我将 CAMERA_WIDTH 称为代表“地图”宽度的数字。换句话说,地图可以比相机大得多。如果您在此处使用更大的数字(例如,相机的宽度),并且您将相机设置为追逐玩家实体(就像您所做的那样),那么您将拥有一张地图,玩家可以在其中移动直到他们击中地图的边界。

希望这可以帮助!:)

于 2013-02-23T19:57:33.547 回答