2013-02-10 34 views
1

我正在制作一款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应该如何完成?

回答

2

你反弹的想法可能有问题。尝试改为忽略与地形碰撞的移动:
如果玩家向下和向右移动,那么首先检查向下碰撞,如果是,则忽略该移动,并检查是否正确,如果正确可行否则也会阻止。

+0

谢谢,即使我保持弹跳回来的想法,实际上工作得很好,但仍然有点古怪。如果我不反弹,如果实体速度足够高,它将保持与地形的尴尬距离。 – XistenZ 2013-02-10 15:53:17