Android翻译了画布的矩形碰撞

时间:2015-07-09 09:02:00

标签: java android canvas collision game-physics

我试着开发一款类似Zelda的游戏。到目前为止,我正在使用位图,一切顺利。此时,英雄的相机是固定的,这意味着他可以在屏幕上的任何地方。

问题在于缩放。支持每个设备并保持每个设备的完美尺寸看起来并不那么容易:D 为了防止我需要移动相机。我可以在每台设备上扩展所有尺寸相同的尺寸。第一步,英雄不会出现在屏幕中间。

工作解决方案是

xCam += hero.moveX;
yCam += hero.moveY;
canvas.translate(xCam,yCam);
drawRoom();
canvas.restore();
drawHero();

我是这样做的,因为我没有魔杖重新排列游戏中的每一块瓷砖。我想在某些设备上处理可能太多了。正如我所说,这很好用。英雄在屏幕中间,整个房间都在移动。 但问题是碰撞检测。 这是一个简单的例子:

wall.rect.intersects(hero.rect);

假设墙最初打开(0/0)且英雄打开(screenWitdh / 2 / screenHeight / 2),它们应该碰撞某些点。 问题是,wall.rect的x和y永远不会改变。它们在画布翻译的任何一点都是(0/0),因此它们永远不会发生碰撞。

我知道,我可以使用canvas.getClipBounds(),然后使用返回的rect的坐标来更改每个tile,但正如我上面提到的,我试图避免加上,返回的rect只适用于int值,而不是float。

你们知道这个问题的任何解决方案,或者有没有人修这样的东西?

期待您的回答!

2 个答案:

答案 0 :(得分:1)

您可以分离模型逻辑和视图逻辑。假设您的窗口的开发维度是WxH。在这种情况下,如果模型中的精灵是100x100并且放置在0,0,它将覆盖0,0到100,100的区域。让我们在105,0处添加下一个精灵(相同的100x100维度)(基本上略微在第一个的右侧),其覆盖面积从105,0到205,100。很明显,在模型中它们不会发生碰撞。现在,至于目标设备是否恰好是WxH,您只需按原样绘制模型。如果您的设备的屏幕w = 2 * W,h = 2 * H,那么每个方向的屏幕都是两倍。你只需分别乘以the x and y by w / W and h / H。因此我们得到x和y的2倍,它在屏幕上成为第一个对象 - 从0,0到200,200,第二个对象 - 从210,0到410,200。可以看出它们仍然没有碰撞。总而言之,将游戏逻辑与绘图(渲染)逻辑分开。

答案 1 :(得分:0)

我认为你应该让变量在“地图”上保持玩家的位置。因此,您可以使用它来确定与不变墙的碰撞。它应该看起来像(取决于你的其余代码):

canvas.translate(-hero.rect.centerX(), -.rect.centerY());
drawRoom();
canvas.restore();
drawHero();

通常你应该在地图坐标中进行计算,而不是在屏幕上进行计算。对于渲染,只需使用(负)玩家位置进行翻译。