Java 游戏架构;方法(屏幕/效果)
我正在研究如何设计我的游戏,包括不同“屏幕”的管理/转换以及效果计时。我目前正在安卓上使用安卓引擎,安卓没有明确的游戏循环,尽管我很想知道这些问题是如何在有或没有游戏循环的情况下处理的Java 游戏架构;方法(屏幕/效果),java,android,architecture,methodology,Java,Android,Architecture,Methodology,我正在研究如何设计我的游戏,包括不同“屏幕”的管理/转换以及效果计时。我目前正在安卓上使用安卓引擎,安卓没有明确的游戏循环,尽管我很想知道这些问题是如何在有或没有游戏循环的情况下处理的 我已经编写了一个临时系统,用于处理游戏中的不同“屏幕”(闪屏、菜单、游戏、选项等),该系统基于AndEngine中的“场景”。我有3个基本“场景”,它们作为背景、内容和弹出窗口的层。每个屏幕都有onTransitionIn()和onTransitionOut()方法,当屏幕管理器调用自己的方法(例如closePo
我很想知道这些问题在游戏中通常是如何处理的(有/没有显式循环) 根据您的描述,听起来好像当您想要触发一系列动作时,您基本上是一次将它们全部触发,每个动作都有固定的延迟。这是非常脆弱的-如果你改变其中一个动作的持续时间,它可能不再与之后应该发生的事情同步 一种更稳健的方法是使用。每个操作都可能有一个
onCompleted()
事件(和/或各种其他事件,取决于操作的性质),可用于触发下一个操作的开始
例如,假设当用户按下选择菜单项时,您需要以下事件序列:
void onItemSelected(MenuItem menuItem) {
runNow(new SelectedItemAnimationHandler(menuItem)); // Takes 500ms
// Delay for 500ms to wait until end of selection anim.
postDelayed(new ScreenTransitionOffHandler(currentMenu), 500); // Takes 1000ms
// Delay for 1500ms to wait until end of transition off.
postDelayed(new ScreenTransitionOnHandler(nextMenu), 1500);
}
您可以通过创建动作(履行观察者模式中的“主体”角色)和动作观察者(履行“观察者”角色)来链接事件:
这样,在设置ScreenTransitionOffHandler时,您不需要指定SelectedItemAnimationHandler的持续时间
编辑:试图使观察者模式的实现更清晰。
编辑2:将runNow(action)更改为action.start()非常感谢您的帮助,听起来它可能已经是一种更好的方法了。但是,您是否建议我仍然使用Android处理程序类?您建议的方法仍然需要在通过处理程序运行代码之前手动设置每个效果的计时值。啊,好的,这更有意义!非常感谢,这是一个很大的帮助:)对不起,这有点误导。我已经更新了我的答案并更改了令人困惑的命名。我还试图使观测者模式的实现更清晰一些。我已经实现了一个名为Action的小型抽象类,它有一个观察器的ArrayList,并在自己的onCompleted()方法中调用了Observators onCompleted()方法。但是,在所有效果完成后,我仍然需要调用onCompleted()的问题。目前,没有任何延迟,因此一切都将立即运行。再次感谢您,另一个小更新更清晰。。。因此,现在您正在从操作的
start()
方法为操作的所有观察者调用onCompleted()
。你能看到那里的问题吗?
void onItemSelected(MenuItem menuItem) {
// Set up the actions
// Actions call onCompleted() on any observers when they complete.
SelectedItemAnimationAction sa = new SelectedItemAnimationAction(menuItem);
ScreenTransitionOffAction stoff = new ScreenTransitionOffAction(currentMenu);
ScreenTransitionOnAction ston = new ScreenTransitionOnAction(nextMenu);
// Add some observers to the actions
sah.addOnCompletedHandler(new ActionObserver() {
public void onCompleted() {
stoff.start();
}
});
stoff.addOnCompletedHandler(new ActionObserver() {
public void onCompleted() {
ston.start();
}
});
// Start the first action
sa.start();
}