我正在制作我的第一个自由移动(不受瓷砖限制)2d游戏,并且想知道如何使用碰撞检测。 我有三种可能的方法,但不确定最有效的方法是什么:
地图上的每个对象都具有比图像本身更小的纹理(例如,树将具有代表其基础的较小纹理),该纹理不会发生碰撞。为此,我将使用第二个不可见的纹理来标记该区域。
每个对象都有一个矩形或圆形区域用于碰撞。可能每个纹理都需要一个辅助文件,其中应该有多大的碰撞(树例再次)。
我创建了一个平铺地图,其中瓷砖足够小,让玩家几乎触摸到对象。
如果有人能帮我决定使用x.x的方法,我真的很感激。提前谢谢。
(如果你玩旧游戏,我试图遵循Mana游戏运动风格,如果有帮助的话)
答案 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)
为什么不组合这些?像素完美碰撞是相当昂贵的,所以你应该分步做。如果你的世界很大,我还会通过将你的世界分成几块来增加另一步。
首先,当一个块包含一个移动实体或与一个移动实体相交时,它开始用廉价的矩形/半径检查该块内的碰撞。当发生单个碰撞时,您可以检查此物体的像素完美碰撞。
使用这些方法,您可以确保不会计算远离屏幕外的物体的碰撞,并且只在物体非常接近时才进行像素完美碰撞。