我正在制作一款2D游戏,没什么奇特的,它与对象(从现在开始称为实体)应该与海誓山盟和地形碰撞。现在,检测碰撞不是问题,问题是实体与地形碰撞。需要关于碰撞处理的建议
我有一个简单的.png,在加载游戏时,我会浏览此图像的所有像素,并将所有黑色图像添加到列表中,这些图像是可以相互碰撞的像素。从实体类
碰撞代码:
int ceiling = Integer.MAX_VALUE;
int floor = 0;
int rightPoint = 0;
int leftPoint = Integer.MAX_VALUE;
for(Point p : main.terrain.points)
if(getHypoRect().contains(p))
{
if(p.x > rightPoint && right)
rightPoint = p.x;
if(p.x < leftPoint && left)
leftPoint = p.x;
if(p.y < ceiling && up)
ceiling = p.y;
if(p.y > floor && down)
floor = p.y;
}
if(rightPoint != 0)
xCoord = rightPoint - sprite.getImage().getWidth();
else if(right)
xCoord+=speed;
if(leftPoint != Integer.MAX_VALUE)
xCoord = leftPoint;
else if(left)
xCoord-=speed;
if(ceiling != Integer.MAX_VALUE)
yCoord = ceiling;
else if(up)
yCoord-=speed;
if(floor != 0)
yCoord = floor - sprite.getImage().getHeight();
else if(down)
yCoord+=speed;
在for循环我经过的地形所有点(黑色像素),然后检查实体的collisionbox包含它们(速度在增加这种方法,或者说“假设”添加,这就是为什么它有奇怪的名字)。 现在,如果该点的x值大于“rightpoint”,并且实体正在向右走,则会被覆盖。 leftPoint(“leftest”点),天花板和地板也是如此。 然后我检查这些点是否有变化,如果它们意味着我们与地形发生碰撞,所以我们将它们反弹回来。例如,假设实体正在向右行走,并且我们与地形发生碰撞,RightPoint已写入与我们碰撞的“最右”点,然后我们设置坐标,以便实体恰好在与它碰撞的点旁边。
如果一次只能朝一个方向行进,这可以很好地工作,但在考虑多个输入时会发生“奇怪”的事情。
示例:实体走向平坦的地面,朝向右侧的窗台,当实体位于窗台的一半时,它想要向下,因此向右和向下都被按下,我的代码将执行什么操作检查输入,将实体放置到想要的位置,然后在它触及地形时将其弹回,这样就可以看到我按右键并将实体弹回到窗台的末端。
这是我自己的想法terraincollision如何工作,除了如何检查碰撞发生,但我没有找到任何东西,但没有涵盖这一点。 任何想法可以让我的解决方案起作用,或指示terraincollision应该如何完成?
谢谢,即使我保持弹跳回来的想法,实际上工作得很好,但仍然有点古怪。如果我不反弹,如果实体速度足够高,它将保持与地形的尴尬距离。 – XistenZ 2013-02-10 15:53:17