我通过尝试一些小游戏来学习Java#34;这开始只是试图让球跳。我有3个班级(JumpingBall3,BallSprite3,& Floor),并且已经达到了一些重力,跳跃能够始终如一地运行,并且能够对地板进行探测以阻止球无限下降。最后一点,我发现了未来发展的潜在问题。现在我有两个楼层由JumpingBall3创建(" floor1"&" platform")我使用以下代码检测BallSpite3内的碰撞:
public boolean collision()
{
if (game.floor1.getBounds().intersects(getBounds()) || game.platform.getBounds().intersects(getBounds())) {
onFloor = true;
}
else
{
onFloor = false;
}
return onFloor;
}
如果我要继续添加更多的楼层或平台,那么"如果"在长度方面,状况很快就会失控。有没有办法创建一个循环遍历我的JumpingBall3类中创建的所有可见Floor对象的方法?
我已经在网上发布了完整的代码here,这篇帖子中包含的内容似乎有点冗长。
答案 0 :(得分:2)
最简单的做法是将所有要检查的对象保留在Collection
中,例如List
,然后迭代此List
。
因此,例如,一个很好的选择是使用Floor
的集合,我们在其上迭代检查我们是否与其中一个发生冲突。
public boolean collision() {
boolean onFloor = false;
Rectangle rectangle = getBounds();
for (Floor floor : floors) {
if (floor.getBounds().intersects(rectangle)) {
onFloor = true;
break;
}
}
return onFloor;
}
假设您使用 Java 8 ,您可以依靠Stream API
执行与下一步相同的操作:
public boolean collision() {
Rectangle rectangle = getBounds();
return floors.stream().map(Floor::getBounds).anyMatch(rectangle::intersects);
}
答案 1 :(得分:1)
创建包含所有对象的列表。然后在你要检测的所有对象上使用一个循环(除了那个进行检测的对象)
答案 2 :(得分:1)
这个问题的一个平易近人的解决方案是让你的“游戏世界”包含一个实体列表(一个实体可以是一个球或一个墙或任何其他游戏对象),并有一些机制可以检测哪些实体在附近其他实体。这最终会调用某种类型的entity.checkCollision(neighborEntity)
方法。
您仍然需要有不同的行为来与不同的实体发生冲突。您可以通过让基础Entity
类具有一些可以关闭或打开的常用属性来实现此目的,或者存储可以直接应用于冲突实体的行为。
// within some game loop, check for collisions
for (Entity entity : collidableEntities)
{
ball.checkCollision(entity);
}
您的课程可能看起来像编程行为。
public Entity
{
public void applyCollisionBehaviorTo(Ball ball) { // Override to do something}
public void onCollision() { // Override to do something }
public collidesWith(Entity neighbor) { // your collision math }
public void checkCollision(Entity neighbor)
{
if (collidesWith(neighbor))
{
onCollision()
}
}
}
public Wall extends Entity
{
@Overide
public void applyCollisionBehaviorTo(Ball ball)
{
ball.reverseDirection();
}
}
public Ball extends Entity
{
@Overide
public void onCollision(Entity collidingEntity)
{
collidingEntity.applyCollisionBehaviorTo(this);
}
}