Java & Slick2d - 对象交互
Java & Slick2d - Object Interaction
在我使用 slick2d 创建以学习 Java 的游戏中,我有多个关卡,每个关卡都有一个 Footballer
和我希望足球运动员能够与之互动的多个其他单位。我还希望其他单位彼此互动(例如多个 Ball
相互碰撞)(注意,其中一些单位有时 class 彼此相同 e/g多个 Defender
s)。但是我不确定如何检测这些交互并适当地更新单元。例如,我有 Footballer
:
public class Footballer extends Unit {
public Footballer(float x, float y){
super("res/ballerpicture", x, y)
}
}
并且在这个 class 中我有一个更新函数,它覆盖了单元 class 中的更新函数(允许我根据我的输入移动 Footballer
- 这是除了碰撞检测之外没有其他问题。
然后,例如,我可以在我的地图上加载 5 个球:
public class Ball extends Unit {
public Ball(float x, float y){
super("res/ballpicture", x, y)
}
}
例如,我想知道如何在与 Footballer
碰撞时更新任何一个球,每次碰撞时将它们移离玩家一格。
我的 Unit
class 包含一个 move
方法,该方法基于整数方向(左 = 1,右 = 2 等)移动单位。
抱歉,如果我这个问题过于饱和或没有包含足够的信息 - 我对 java 比较陌生。
您要找的是collision detection。
所有能够相互交互的物体都可以有一个碰撞盒,这是最简单的一种几何形状,代表物体的主体。例如,我们可以假设您的球有一个半径为 8 px 的圆形作为碰撞框,而您的足球运动员有一个宽度为 32 px 和高度为 32 px 的矩形碰撞框。
当两个物体都在移动时,你必须检查你的碰撞箱的边界是否相互交叉,如果是:做点什么,如果不是继续移动。
在 Slick2D 中,所有形状都有一个称为 intersects(Shape s) 的方法,如果两个形状的边界相交,它 returns 为真。所以基本上你只需要为你的对象实现碰撞箱(确保在你的对象移动时更新碰撞箱)然后检查是否相交。有很多不同的方法可以实现碰撞检测,并且互联网提供了大量关于该主题的资源。我还建议看一下 Slick2D 的 Shape documentation。很难为您编写解决方案,因为我不知道您的代码,但我相信您会弄清楚,Slick2D 为您使用相交方法的问题提供了一个简单的预实现解决方案。
它可能类似于以下内容:
编辑,多个球:
//in your update method
for(Ball ball : allBalls){
if(footballer.getHitbox().intersects(ball.getHitbox()){
//get direction of footballer
ball.move(...)
}
}
在我使用 slick2d 创建以学习 Java 的游戏中,我有多个关卡,每个关卡都有一个 Footballer
和我希望足球运动员能够与之互动的多个其他单位。我还希望其他单位彼此互动(例如多个 Ball
相互碰撞)(注意,其中一些单位有时 class 彼此相同 e/g多个 Defender
s)。但是我不确定如何检测这些交互并适当地更新单元。例如,我有 Footballer
:
public class Footballer extends Unit {
public Footballer(float x, float y){
super("res/ballerpicture", x, y)
}
}
并且在这个 class 中我有一个更新函数,它覆盖了单元 class 中的更新函数(允许我根据我的输入移动 Footballer
- 这是除了碰撞检测之外没有其他问题。
然后,例如,我可以在我的地图上加载 5 个球:
public class Ball extends Unit {
public Ball(float x, float y){
super("res/ballpicture", x, y)
}
}
例如,我想知道如何在与 Footballer
碰撞时更新任何一个球,每次碰撞时将它们移离玩家一格。
我的 Unit
class 包含一个 move
方法,该方法基于整数方向(左 = 1,右 = 2 等)移动单位。
抱歉,如果我这个问题过于饱和或没有包含足够的信息 - 我对 java 比较陌生。
您要找的是collision detection。 所有能够相互交互的物体都可以有一个碰撞盒,这是最简单的一种几何形状,代表物体的主体。例如,我们可以假设您的球有一个半径为 8 px 的圆形作为碰撞框,而您的足球运动员有一个宽度为 32 px 和高度为 32 px 的矩形碰撞框。
当两个物体都在移动时,你必须检查你的碰撞箱的边界是否相互交叉,如果是:做点什么,如果不是继续移动。
在 Slick2D 中,所有形状都有一个称为 intersects(Shape s) 的方法,如果两个形状的边界相交,它 returns 为真。所以基本上你只需要为你的对象实现碰撞箱(确保在你的对象移动时更新碰撞箱)然后检查是否相交。有很多不同的方法可以实现碰撞检测,并且互联网提供了大量关于该主题的资源。我还建议看一下 Slick2D 的 Shape documentation。很难为您编写解决方案,因为我不知道您的代码,但我相信您会弄清楚,Slick2D 为您使用相交方法的问题提供了一个简单的预实现解决方案。
它可能类似于以下内容:
编辑,多个球:
//in your update method
for(Ball ball : allBalls){
if(footballer.getHitbox().intersects(ball.getHitbox()){
//get direction of footballer
ball.move(...)
}
}