java - 将 Sprite 运动绑定(bind)到相机或场景(AndEngine)

标签 java android andengine collision

我正在使用 DigitalOnScreenControl 来移动玩家 Sprite 。但问题是我的玩家 Sprite 超出了模拟器屏幕。我希望限制玩家 Sprite 在特定范围内移动,并且当我的 Sprite 时相机聚焦在玩家 Sprite 上继续前进。

我正在尝试这段代码:

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 开发非常陌生 请用心帮助我 提前致谢。

最佳答案

将播放器绑定(bind)到相机

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

让我们拆开我刚才所说的。您将玩家移动到此处:

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

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

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

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

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 坐标代表 Sprite 的左侧。这就是为什么除了计算右侧的位置之外我还要考虑宽度。

上面的代码仅解决左/右移动问题,但我将让您推断如何对上下移动执行相同的操作。

将玩家绑定(bind)到 map 大小

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

希望这有帮助! :)

关于java - 将 Sprite 运动绑定(bind)到相机或场景(AndEngine),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15039614/

相关文章:

java - 请求过滤器在 Jersey 2 on Embedded Jetty 中不起作用

java - 将可选成员变量标记为 NonNull

android - 适用于 Android 的 Drive API 已损坏,对吧?

android - ItemDecoration 未在最后一个单元格上绘制

Android:将ImageView放置在布局之间的重叠上

java - AndEngine Box2d - 如何避免联合 "stretching"?

java - 创建视差背景

java - 构建将作为电子邮件发送的 HTML 消息的最佳实践? (使用Java)

java - 在某些Android设备上严重UDP数据包丢失

android - 使用 Andengine 的游戏中出现意外的 arrayIndexOutofBound 异常