【发布时间】:2013-07-05 20:09:08
【问题描述】:
使用 Android 版 AndEngine,我想让我的场景看起来像这样:
红色框是必须限制在给定大小的世界,例如2000px*450px。
蓝色框是Camera,也有限制(像往常一样),例如750px*450px。
对于整个场景,我的背景图像正好是450px 高。所以我的Camera 可以缩放到任何合适的大小,但背景必须完全适合高度。 Camera 的宽度可能是可变的。
玩家(圆圈)必须始终位于中心(水平方向),但不得离开世界边界。
为此,我尝试添加两种尺寸:
- 相机尺寸(
CAMERA_WIDTH,CAMERA_HEIGHT) - 世界大小(
WORLD_WIDTH,WORLD_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 或任何最新版本?
【问题讨论】:
-
长问题,长答案如下。答案应该很简单:使用
SmoothCamera而不是Camera,并设置绑定(使用setBounds())以满足您的世界维度。您可以设置相机移动速度(使用setMaxVelocity())以使其比被追逐实体的速度更快,因此被追逐实体将保持在中心,除非被追逐实体靠近边界。也可以暂时禁用绑定(使用setBoundsEnabled(false)),看看绑定是如何影响追击功能的。 -
感谢您的评论!尽管此评论较短,但它并没有为下面的答案添加任何内容,是吗?相反,如果您打算让它比被追逐的实体更快,为什么还要使用
SmoothCamera?在这种情况下,它将等于BoundCamera,不是吗? -
@MarcoW。你是对的,只要你不使用最大速度作为真正的限制,你会得到一个
ZoomCamera,直到你不想使用缩放,你会得到一个BoundCamera。 SmoothCamera 只是在 onUpdate 中添加了一些额外的计算来计算当前速度并将其限制为最大速度。变焦相机也会进行一些额外的计算以将变焦限制为最大和最小变焦系数 -
@MarcoW。如果我正确理解了您的问题(如果我没有正确理解,您真的可以忽略我上面的评论),您需要在相机上设置缩放系数,因为您说“相机的宽度可能是可变的”,这就是我建议的原因使用平滑相机。 (边界+缩放+移动速度控制)
-
啊,现在我明白你指的是什么了,为此,你的答案是完全正确的。但我的意思是不同的:如果您的设备比例与应用程序中的设置不匹配,AndEngine 通常会在左右(或顶部/底部)添加白/黑条。但我希望我的
Camera只展示更多的世界(水平),从而用内容填充栏。你看,我的应用程序只有高度是固定的,但是如果设备的左右两侧有一些未使用的空间,它可能只是扩大了Camera的视图。
标签: android opengl-es 2d andengine