在Java中,什么';当B类中发生事件而B类不知道A类';谁的存在?

在Java中,什么';当B类中发生事件而B类不知道A类';谁的存在?,java,relationship,Java,Relationship,我正在做一个小游戏,我有一个游戏屏幕,有一个游戏世界,有一个玩家。现在,每当玩家触摸传送块时,我会调暗播放屏幕,然后玩家传送,然后播放屏幕再次变亮 目前为了实现这一点,我在播放器中添加了一个布尔inTeleportAnimation。然后,PlayScreen会检查update()中的每一帧,如果播放机处于传送动画中,则会开始使屏幕变暗。现在这看起来很好,因为它只检查1个布尔/触发器。但稍后可能会有许多不同的触发器用于播放屏幕执行某些操作(例如,使屏幕变暗)。让playScreen.update

我正在做一个小游戏,我有一个游戏屏幕,有一个游戏世界,有一个玩家。现在,每当玩家触摸传送块时,我会调暗播放屏幕,然后玩家传送,然后播放屏幕再次变亮

目前为了实现这一点,我在播放器中添加了一个
布尔inTeleportAnimation
。然后,PlayScreen会检查
update()
中的每一帧,如果播放机处于传送动画中,则会开始使屏幕变暗。现在这看起来很好,因为它只检查1个布尔/触发器。但稍后可能会有许多不同的触发器用于播放屏幕执行某些操作(例如,使屏幕变暗)。让
playScreen.update()
检查每一个触发器/每一帧的布尔值可能不是一个好主意,因为这意味着我需要为每个可能的触发器使用另一个if语句。我也不想让PlayScreen和玩家的关系变成双向的

实现这一目标的最佳或“正确”方法是什么?

我将利用解决这一任务。它应该可以解决您想要避免双向耦合的问题,因为游戏屏幕(本例中的观察者)会根据需要通知播放器(本例中的可观察者)的更改,但不会参考播放器或任何其他类型的紧耦合

如果您使用的是Java,正如本文的标签所示,这里有一个例子可以用来演示它的用法。

我会利用来解决这个问题。它应该可以解决您想要避免双向耦合的问题,因为游戏屏幕(本例中的观察者)会根据需要通知播放器(本例中的可观察者)的更改,但不会参考播放器或任何其他类型的紧耦合


如果您使用的是Java,正如本文的标签所示,这里有一个可以用来演示其用法的示例。

如果您的播放器设置了一个全局标志,并且在播放器中发生更新时打开该标志该怎么办(例如,当设置了inTeleportAnimation时,该标志也会被设置,其他标志也是如此)在PlayScreen.update()处理更新后关闭,这样玩家就不知道PlayScreen,并且可以避免在每个帧中进行不必要的检查。但是我看不到避免检查每个条件的方法(假设全局标志指示更新)。

如果您的播放机设置了一个全局标志,该标志在播放机中发生更新时打开(例如,当设置inTeleportAnimation时,该标志也会被设置,其他标志也会被设置),并且在PlayScreen.update()之后关闭,该怎么办处理更新,这样玩家就不知道PlayScreen了,你们可以避免在每一帧中进行不必要的检查。但是我看不到一种方法可以避免对每个条件进行检查(假设全局标志指示更新)。

观察者模式是否可能?图案实际上,在这一点上,观察者在你的情况下可能更好。那么在这种情况下,玩家就是可观察者,对吗?但是PlayScreen是主要的游戏循环类,它基本上每一帧都会更新整个游戏世界,所以它也会更新玩家。如果我让玩家成为可观察者,让PlayScreen成为观察者,这将本质上创造一种双向关系。不确定我是否遗漏了什么,所以如果我错了,请纠正我。也许吧?图案实际上,在这一点上,观察者在你的情况下可能更好。那么在这种情况下,玩家就是可观察者,对吗?但是PlayScreen是主要的游戏循环类,它基本上每一帧都会更新整个游戏世界,所以它也会更新玩家。如果我让玩家成为可观察者,让PlayScreen成为观察者,这将本质上创造一种双向关系。不确定我是否遗漏了什么,所以如果我错了,请纠正我。因此,使用此模式,可观察对象有其观察者的实例,但观察者也在其更新(可观察obs)方法中更新可观察对象?观察者从哪里得到可观察的东西?抱歉,我不熟悉这个模式,所以我仍然有点困惑。作为旁注,如果有一个静态类PlayScreen调光器和一个静态PlayScreen实例,这样我就可以从任何地方调暗PlayScreen,这会是一种不好的做法吗?observable在其类定义中不会包含对其观察者的任何实例的引用。唯一的(松散耦合的)关联是调用(参见参考示例)Observable#addObserver。这将创建一个观测者集合(PlayScreen,或您添加的实现观测者界面的任何其他内容),这些观测者有兴趣接收由可观察玩家发布的更新(通过可观察的notifyObservers方法)。至于您的旁注问题,为什么不在PlayScreen类中添加一个非静态的dim方法,当通过Observer更新方法接收到更新时调用该方法?好的,谢谢,我将进一步研究如何实现这个模式。是的,静态屏幕调光器更像是观察者模式的替代品。当然,使用观察者模式我不需要任何静态方法。所以使用这种模式,可观察者有其观察者的实例,但是观察者也会在更新(可观察obs)方法中更新可观察者?观察者从哪里得到可观察的东西?抱歉,我不熟悉这个模式,所以我仍然有点困惑。作为旁注,如果有一个静态类PlayScreen调光器和一个静态PlayScreen实例,这样我就可以从任何地方调暗PlayScreen,这会是一种不好的做法吗?observable在其类定义中不会包含对其观察者的任何实例的引用。唯一的(松散耦合的)关联是调用(参见参考示例)Observable#addObserver。这将创建一组观察者(PlayScree)