2017-10-12 134 views
0

在我用slick2d创建的游戏中学习Java,我有多个层次,每个层次都有一个Footballer和多个其他单位,我希望足球运动员能够与之交互。我还希望其他单位彼此互动(例如多个Ball与彼此碰撞)(注意,其中一些单位有时与另一个单位相同)。我不确定,但是如何检测这些交互并适当地更新单元。例如,我有我的FootballerJava&Slick2d - 对象互动

public class Footballer extends Unit { 
    public Footballer(float x, float y){ 
     super("res/ballerpicture", x, y) 
     } 
    } 

这个类我有它覆盖在单元类更新功能的更新功能中(让我根据我的输入移动一个Footballer - 这是工作不除碰撞检测以外的问题)。

然后我可以,例如,已经装上我的地图5球:

public class Ball extends Unit { 
    public Ball(float x, float y){ 
     super("res/ballpicture", x, y) 
     } 
    } 

举一个例子,我想知道如何在碰撞与Footballer更新球中的任何一个,移动他们每次碰撞时都离开玩家一块。

我的Unit类包括一个move方法,该方法基于整数方向移动单元(左= 1,右= 2等)。

道歉,如果我超饱和这个问题或没有包含足够的信息 - 我是相对较新的Java。

回答

1

你在找什么是collision detection。 所有能够相互作用的物体都可以有一个hitbox,这是最简单的一种代表物体的几何形状。举例来说,我们可以假设你的球有一个圆圈作为半径为8px的hitbox,你的足球运动员有一个宽度为32px和高度为32px的矩形的hitbox。

当两个对象都在移动时,你必须检查你的hitbox边界是否相互交叉,如果是的话:做一些事情,如果不继续移动。

在Slick2D中,所有形状都有一个名为intersects(Shape s)的方法,如果两个形状的边界相交,它将返回true。所以基本上你只需要为你的对象实现点击框(确保当你的对象正在移动时更新点击框),然后检查相交。有很多不同的方式来实现碰撞检测,互联网正在为这个话题提供大量的重新定位。我也建议看看Slick2D的Shape documentation。很难为您编写解决方案,因为我不知道您的代码,但我相信您会发现它,Slick2D为交叉方法的问题提供了一个简单的预先实现的解决方案。

它可能看起来有点像下面这样:

编辑,多球:

//in your update method 
for(Ball ball : allBalls){ 
if(footballer.getHitbox().intersects(ball.getHitbox()){ 
//get direction of footballer 
ball.move(...) 
} 
} 
+1

谢谢!这是在球员还是球的更新方法?有可能在某些级别会出现多个球 - 我该如何解决这个问题? –

+0

这取决于你的游戏架构。我会执行到玩家。您可以将所有球存储在列表中检查每个元素的交集(注意,这是计算密集型的)。但它基本上取决于你的球如何存储在你的游戏世界。您也可以将其应用到球的更新方法中,并调用游戏中每个球的每个更新方法。 –

+0

我编辑了我的帖子,通过遍历列表来向你展示我的意思。 –