gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:50:37 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com