我从事Java游戏已有几个月了,遇到了一个问题。
我的Player
在一个Environment
中走来走去,它由都具有自己的CollisionBox
的图块组成。简而言之:当Player
的CollisionBox
与另一个CollisionBox
(如盒子之类的东西)碰撞时,播放器将无法移动。该部分已得到处理。
我正在尝试介绍InteractiveTile
,其中Player
如果与特定的CollisionBox
碰撞,例如楼梯或门,则会导致某些事情发生。具体来说,如果要命中特定的* InteractiveTile *,我希望能够过渡到新的Environment
。
我具有过渡和重绘碰撞图的功能,但是我不知道如何使碰撞事件告知环境(在碰撞事件的代码层次结构中不方便)。
我对观察者模式很熟悉,在其中Environment
可以“听到”这种碰撞,但是我不确定如何在这里实现它,即使这是正确的设计模式!
更简单的是...
调用Player.IsCollidingWithDoorLeadingToNewEnvironment(newEnvironment)
时,应调用Environment.TransitionToNewEnvironment(newEnvironment)
,但是它们在代码结构中彼此分开。
更广泛地讲:如何在两个类之间发送消息,而又不会在方法/构造函数注入的每一层上进行分层?
最佳答案
您听说过Model-View-Controller模型吗?没什么花哨的,但也许可以帮上忙。基本上,您的程序将包含三个部分:
模型-这些是问题中所有斜体字,它们代表程序中与之交互的部分。
查看-显示;在这里不相关,就像在屏幕上绘制事物一样
财务总监-我认为这会对您有所帮助。这是一个贯穿整个节目的课程。此类控制在程序的Model组件中生成的所有零件,因此可以进行通讯。我想环境类可能适合您的情况。
您的控制器类可能包含包含游戏中生成的所有部分的数组/ ArrayList,例如CollisionBoxes。每个CollisionBox(我仅以此为例)都可以有一个实例变量(也许叫id),它表示其在数组中的位置(可以像索引一样简单,一个int)。当两个Box发生碰撞时,您可以在控制器类中调用采用两个ID的方法,并且方便地,这些ID将引用它们在数组中的位置。当然,您可以使用其他数据结构,但是我希望这可以为您提供基本的概念。