0

我已经在 J​​ava 游戏上工作了几个月,但我遇到了一个问题。

Player在一个里面走来走去Environment,里面是由都有自己的瓷砖组成的CollisionBox。简而言之:当Player'CollisionBox与另一个碰撞CollisionBox(如盒子或其他东西)时,玩家无法移动。那部分得到了照顾。

我正在尝试引入InteractiveTiles,Player如果它与特定CollisionBox的 (例如楼梯或门)发生碰撞,将导致某些事情发生。Environment具体来说,如果特定 *InteractiveTile* 被击中,我希望能够转换到新的。

我有转换和重绘碰撞贴图的功能,但我不知道如何让碰撞事件告诉环境(这在碰撞事件的代码层次结构中并不方便)。

我熟悉观察者模式,其中Environment可以“听到”这种冲突,但我不确定它会如何在这里实现,或者即使这是适合这种情况的正确设计模式!

更简单的...

Player.IsCollidingWithDoorLeadingToNewEnvironment(newEnvironment)被调用时,Environment.TransitionToNewEnvironment(newEnvironment)应该被调用,但它们在代码结构中彼此相距甚远。

更广泛地说:如何在没有层层方法/构造函数注入的情况下在两个类之间发送消息?

4

1 回答 1

1

你听说过模型-视图-控制器模型吗?这没什么花哨的,但也许会有所帮助。基本上,您的程序将包含三个部分:

  1. 模型 - 这些是您问题中的所有斜体字,它们代表程序中相互作用以构成它的部分。
  2. 查看 - 显示;在这里没有那么重要,就像事物被绘制到屏幕上一样
  3. 控制器 - 这是我认为会帮助你的。这是一个贯穿整个节目的课程。此类控制程序的模型组件中生成的所有部分,这就是允许它们进行通信的原因。我想在您的情况下,Environment 类可能对此有好处。

您的控制器类可能包含数组/ArrayLists,其中包含游戏期间生成的所有部分,例如 CollisionBoxes。每个 CollisionBox(我只是用这个作为例子)可以有一个实例变量(可能称之为 id),它代表它在数组中的位置(它可以像索引一样简单,一个 int)。当两个 Box 发生碰撞时,您可以调用控制器类中的方法来获取这两个 id,并且这些 id 可以方便地引用它们在数组中的位置。当然,您可以使用其他数据结构,但我希望这可以为您提供基本概念。

于 2013-03-27T04:13:35.673 回答