【问题标题】:Java Collision detection between different classes不同类之间的Java碰撞检测
【发布时间】:2023-03-24 00:55:01
【问题描述】:

我正在制作一个关于射击敌人和避开障碍物的简单游戏,但我在检测碰撞时遇到了问题,因为我为每种类型的游戏对象(玩家、敌人、障碍物、掉落、子弹、等等)。

class Player { Vector3 pos; ... }
class Enemy { Vector3 pos; ... }
class Obstacle { Vector3 pos; ... }
...

boolean doCollide (Object a, Object b)
{

    if ( a.pos.x + a.size.w >= b.pos.x ) { ... }

    ...
}

它不会工作,因为 a 没有“pos”等,所以我该怎么做才能让它适用于每个班级?我读过关于接口的文章,但我真的不知道它对我有什么帮助。

【问题讨论】:

  • 没有。不要使用Object,不好的做法。创建一个基类,我设计了一切,总有办法。
  • 花 2 小时阅读“游戏编程模式”(Nystrom,2014)的相关部分。他讨论了一些关于游戏对象类及其交互的概念,您可能会发现这些概念非常有用。

标签: java collision


【解决方案1】:

您可以将Object 类型转换为您自己的类型,但是考虑到有多种自定义对象类型,尝试采用这种方法效率不高,因此您可以使用接口。

接口声明:

public interface IsomeName{
      public Vector3 getPosition();
}

你的班级:

class Player implements IsomeName{ @Override public Vector3 getPosition(){...}};
class Enemy implements IsomeName{ @Override public Vector3 getPosition(){...}}
class Obstacle implements IsomeName{ @Override public Vector3 getPosition(){...}}

那么您的doCollide 将变为:

boolean doCollide (IsomeName a, IsomeName b)
{      
    ...
    ...
    ...
}

另一种选择是使用抽象的getPosition() 方法创建一个抽象基类,并让每种类型都提供自己的实现。

【讨论】:

  • Enemy、Player 和 Obstacle 类可能有很多共同点,像 getPosition() 这样的方法很可能只是返回位置,可以在父类中实现,并且只有特定的方法可以进行渲染/更新/移动或任何动作都应该在这些类中实现。
【解决方案2】:

好吧,如果你愿意,你可以这样做来获取对象的pos.x

((Player)a).pos.x

但是,同样,虽然这可能满足您的需求,但我建议制作一个界面,例如

public interface GameObject{
    public Vector3 getPosition();
}

并让所有的“游戏对象”实现它,然后做

boolean doCollide (GameObject a, GameObject b)

不仅第一种方法是不好的做法,而且会使编译时的调试更加困难,这通常是一个不好的迹象。

【讨论】:

    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 2015-10-07
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多