正如 Johnn Blade 在对该问题的评论中留下的那样,使用观察者模式可能是在应用程序的不同部分之间传达状态更改的好方法。
作为一个具体的例子,您可以将玩家的移动分解为几个离散的步骤(或事件),这些步骤(或事件)可以被应用程序的其他部分观察到。
例如,如果您将以下事件添加到播放器:
- BeforeMove(坐标 oldCoordinate, 坐标 newCoordinate, out bool canMove)
- 移动(坐标旧坐标,坐标新坐标)
- HealthChanged(int newHealth)
场景中的其他对象可能会发生以下事件:
- DamagePlayer(int 伤害)
- HealPlayer(int 治疗)
当您要移动玩家时,您将触发 BeforeMoved 事件 - 如果没有响应canMove = false
(例如锁着的门),则允许移动。然后更新玩家的位置,并调用 Moved。
所以,你的 Spike 可能会监听玩家 Moved 事件:
void Moved(Coordinate oldCoordinate, Coordinate newCoordinate)
{
if (newCoordinate.Intersects(this.Location))
{
DamagePlayer(50);
}
}
相应地,您的播放器将监听 DamagePlayer 事件。
void DamagePlayer(int damage)
{
this.Health -= damage;
HealthChanged(this.Health);
}
有些东西(可能在玩家本身)会监听 HealthChanged 事件,当它达到零或更少时,会杀死玩家。
使用这种模式,添加新功能(例如检测跌倒)相对简单。只需创建 Moved 事件的新观察者:
void Moved(Coordinate oldCoordinate, Coordinate newCoordinate)
{
decimal deltaY = oldCoordinate.Y - newCoordinate.Y;
if (deltaY < -100) // If fell 100 units or more, take 10 damage per unit.
{
DamagePlayer(10 * Math.Abs(deltaY));
}
}