gpt4 book ai didi

android - 在 AndEngine 中使用相机追逐玩家并限制世界范围

转载 作者:行者123 更新时间:2023-11-29 14:51:12 27 4
gpt4 key购买 nike

使用 AndEngine for Android,我希望我的场景看起来像这样:

enter image description here

红色框是必须限制在给定大小的世界,比如 2000px*450px

蓝色框是Camera,它也有限制(像往常一样),例如750px*450px

对于整个场景,我有一个恰好 450px 高的背景图像。所以我的 Camera 可以缩放到任何合适的大小,但背景必须完全适合高度。 Camera 的宽度可能是可变的。

玩家(圆圈)必须始终位于中心(水平),但不能离开世界边界。

为此,我尝试添加两种尺寸:

  • 相机尺寸(CAMERA_WIDTHCAMERA_HEIGHT)
  • 世界大小(WORLD_WIDTHWORLD_HEIGHT)

这个函数是为世界添加边界,以便物理引擎阻止玩家离开这些边界:

private void createWorldBoundaries() {
Body body;
final Rectangle wall_top = new Rectangle(0, WORLD_HEIGHT-5, WORLD_WIDTH, 10, mVertexManager);
final Rectangle wall_bottom = new Rectangle(0, 5, WORLD_WIDTH, 10, mVertexManager);
final Rectangle wall_left = new Rectangle(5, 0, 10, WORLD_HEIGHT, mVertexManager);
final Rectangle wall_right = new Rectangle(WORLD_WIDTH-5, 0, 10, WORLD_HEIGHT, mVertexManager);
body = PhysicsFactory.createBoxBody(mPhysicsWorld, wall_top, BodyType.StaticBody, new PhysicsFactory.createFixtureDef(0.0f, 0.5f, 0.5f));
wall_top.setUserData(body);
body = PhysicsFactory.createBoxBody(mPhysicsWorld, wall_bottom, BodyType.StaticBody, new PhysicsFactory.createFixtureDef(0.0f, 0.5f, 0.5f));
wall_bottom.setUserData(body);
body = PhysicsFactory.createBoxBody(mPhysicsWorld, wall_left, BodyType.StaticBody, new PhysicsFactory.createFixtureDef(0.0f, 0.5f, 0.5f));
wall_left.setUserData(body);
body = PhysicsFactory.createBoxBody(mPhysicsWorld, wall_right, BodyType.StaticBody, new PhysicsFactory.createFixtureDef(0.0f, 0.5f, 0.5f));
wall_right.setUserData(body);
attachChild(wall_top);
attachChild(wall_bottom);
attachChild(wall_left);
attachChild(wall_right);
}

但不幸的是,这不起作用。 (查看编辑)

设置相机追逐玩家对我来说是错误的结果:玩家确实一直停留在屏幕中央,但我希望玩家只在水平方向而不是垂直方向停留在屏幕中央。

我做错了什么,我可以改变什么?基本问题是:如何让世界比相机视野更宽,而高度等于相机视野。结果应该是你可以水平地穿过你的世界(移动相机)并且你总是可以看到完整的高度。

编辑:

当您定义Rectangle 的中心坐标而不是它的左上角时,您必须这样做,看起来:

final Rectangle wall_top = new Rectangle(WORLD_WIDTH/2, WORLD_HEIGHT-1, WORLD_WIDTH, 2, mVertexManager);
final Rectangle wall_bottom = new Rectangle(WORLD_WIDTH/2, FIELD_BASELINE_Y+1, WORLD_WIDTH, 2, mVertexManager);
final Rectangle wall_left = new Rectangle(1, WORLD_HEIGHT/2, 2, WORLD_HEIGHT, mVertexManager);
final Rectangle wall_right = new Rectangle(WORLD_WIDTH-1, WORLD_HEIGHT/2, 2, WORLD_HEIGHT, mVertexManager);

但是,我在几个教程中找到了其他解决方案。这些作者是否在编写教程之前没有测试他们的代码,或者行为是否从 GLES1 更改为 GLES2 或任何最新版本?

最佳答案

我认为你关于世界边界的问题是 self 回答的,不是吗?

物理世界边界

要进一步研究,您可以从 Play 商店下载 nicolas 的 AndEngine Examples App,并在此处查看不同的示例(GLES_2,尚未寻找 AnchorCenter):https://github.com/nicolasgramlich/AndEngineExamples/tree/GLES2/src/org/andengine/examples

取自 PhysicsExample,如果边界设置为相机边界,则矩形的代码应如下所示。在您的情况下,您可以根据需要扩展宽度(3 倍 CAMERA_WIDTH?)

    final Rectangle ground = new Rectangle(0, CAMERA_HEIGHT - 2, WORLD_WIDTH, 2, vertexBufferObjectManager);
final Rectangle roof = new Rectangle(0, 0, WORLD_WIDTH, 2, vertexBufferObjectManager);
final Rectangle left = new Rectangle(0, 0, 2, CAMERA_HEIGHT, vertexBufferObjectManager);
final Rectangle right = new Rectangle(WORLD_WIDTH - 2, 0, 2, CAMERA_HEIGHT, vertexBufferObjectManager);

相机跟随玩家为了相机跟随你的玩家,你可以查找 BoundCameraExample 的代码 https://github.com/nicolasgramlich/AndEngineExamples/blob/GLES2/src/org/andengine/examples/BoundCameraExample.java

对你来说有趣的部分应该是底部的 addFace 方法

private void addFace(final float pX, final float pY) {
final FixtureDef objectFixtureDef = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);
final AnimatedSprite face = new AnimatedSprite(pX, pY, this.mBoxFaceTextureRegion, this.getVertexBufferObjectManager()).animate(100);
final Body body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
this.mScene.attachChild(face);
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true));

this.mBoundChaseCamera.setChaseEntity(face);
}

此方法为“您的玩家”(在本例中为方框脸)创建一个物理体 + Sprite ,并将 Sprite 设置为摄像机要跟随的追逐实体。由于相机有边界,它不能超过并且你的相机将有你的 PhysicWorld 边界的高度,你可以使用它让你的相机在 x 方向跟随玩家,而不是在 y 方向。

如果您(我不知道为什么)不想使用这些边界,您可以覆盖 Sprite 的 onUpdate 方法并仅在 x 方向而不是 xy 坐标上重新定位相机

face.registerUpdateHandler(new IUpdateHandler() {
@Override
public void onUpdate(final float pSecondsElapsed) {
float[] coord = face.getSceneCenterCoordinates();
this.mBoundChaseCamera.setCenter(sceneCenterCoordinates[0], CAMERA_Y_POSITION);
}
}

CAMERA_Y_POSITION 是带有 y 位置的静态最终字段。

我希望这能回答您的问题。 :-)

edit: 哎呀,我忘了说,如何实现相机绑定(bind),我将编辑上面的世界宽度:

    this.mBoundChaseCamera.setBounds(0, 0,
WORLD_WIDTH, CAMERA_HEIGHT);

所有设置就像你给定的图像(除了脸部的确切位置,必须给 addFace(px, py))

编辑:Andengine GLES2 与 GLES2-AnchorCenter 场景边界之间的差异

据我了解这个问题,我认为您会使用 GLES2,我想到了 AndEngine 的(较旧的)默认 GLES2 分支并发布了边界。正如您之前发现并在评论中所述,您使用另一种方法来设置矩形 - 您需要将矩形中心设置为 pX 和 pY。这样做的原因实际上是,使用 AnchorCenter 分支,您将不再设置实体的左上角位置,而是使用它的中心位置。

关于android - 在 AndEngine 中使用相机追逐玩家并限制世界范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17496205/

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