我正在制作一个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循环中,我遍历地形中的所有点(黑色像素),然后检查实体的碰撞盒是否包含它们(在此方法中添加速度,或者更确切地说是“假设”添加,这就是为什么它有奇怪的原因名称)。 现在,如果该点的x值大于“rightpoint”,并且如果Entity向右行走,则会被覆盖。 leftPoint(“leftest”点),天花板和地板也是如此。 然后我检查这些点是否已经改变,如果它们有这意味着我们与地形相撞,所以我们将它们反弹回来。例如,假设Entity向右走,我们与地形相撞,rightPoint已写入我们碰撞的“最右”点,然后我们设置坐标,使实体正好在它碰撞的点旁边
如果一次只能朝一个方向前进,这将完美地工作,但是当您考虑多个输入时会发生“奇怪”的事情。
示例:实体走向,平放在地板上,朝向右边的壁架,当实体位于壁架的一半时,它想要向下,因此向右和向下按下,我的代码将做的是检查输入,将实体放在想要的位置然后如果它撞到地形则反弹回来,这样我就会看到我按下并将实体反弹回到壁架的末端。
这是我自己对terraincollision如何工作的想法,除了如何检查是否发生碰撞外,我在网上找不到任何东西,但没有任何内容可以解决这个问题。 知道什么可以使我的解决方案工作,或指向如何进行terraincollision?
答案 0 :(得分:2)
你反弹的想法可能会有问题。请尝试忽略与地形发生碰撞的移动:
如果玩家向下和向右移动,那么首先检查下行是否会发生碰撞,如果是,则忽略该移动,并检查是否正确,如果可能则右移,否则也阻止。