碰撞检测方法

时间:2014-07-23 22:59:41

标签: java libgdx collision

我正在制作我的第一个自由移动(不受瓷砖限制)2d游戏,并且想知道如何使用碰撞检测。 我有三种可能的方法,但不确定最有效的方法是什么:

  1. 地图上的每个对象都具有比图像本身更小的纹理(例如,树将具有代表其基础的较小纹理),该纹理不会发生碰撞。为此,我将使用第二个不可见的纹理来标记该区域。

  2. 每个对象都有一个矩形或圆形区域用于碰撞。可能每个纹理都需要一个辅助文件,其中应该有多大的碰撞(树例再次)。

  3. 我创建了一个平铺地图,其中瓷砖足够小,让玩家几乎触摸到对象。

  4. 如果有人能帮我决定使用x.x的方法,我真的很感激。提前谢谢。

    (如果你玩旧游戏,我试图遵循Mana游戏运动风格,如果有帮助的话)

2 个答案:

答案 0 :(得分:0)

您可以创建一个存储不同实体形状的类,并具有查找重叠形状的方法。我的答案非常广泛,但如果您正在寻找的是真实的碰撞检测,这将是最佳解决方案。圆形或矩形也起作用,但不太现实**

**取决于你的物理。如果它只是一个侧卷轴,那么它可能没什么大不了的......

更新:

按形状我指的是带顶点的对象,而不是实体的像素精度图像!!!!!

示例EntityShape类:

public class YourEntityShape{

    private Point p1, p2, p3, p4, p5, p6;

    public YourEntityShape(Point p1, Poin...... etc.){
        this.p1 = p1;
        this.p2 = p2;
        //etc....
    }

    //Getter for private Points
    public Point getP1(){
        return p1;
    }
    //etc..

    public boolean overlaps(OtherEntityShape s){
        //Your collision detection code...
    }
}

根据用户1337的建议,您可以使用float []数组来存储x和y值。

示例:

float[] x;
float[] y;

然后,您可以使用相应的x和y值填充它们。

答案 1 :(得分:0)

为什么不组合这些?像素完美碰撞是相当昂贵的,所以你应该分步做。如果你的世界很大,我还会通过将你的世界分成几块来增加另一步。

首先,当一个块包含一个移动实体或与一个移动实体相交时,它开始用廉价的矩形/半径检查该块内的碰撞。当发生单个碰撞时,您可以检查此物体的像素完美碰撞。

使用这些方法,您可以确保不会计算远离屏幕外的物体的碰撞,并且只在物体非常接近时才进行像素完美碰撞。