我正在研究如何设计我的游戏在管理/转换不同的“屏幕”以及影响时间。我目前正在安卓系统上使用AndEngine,它没有明确的游戏循环,不过我想知道这些问题是如何处理的,不管是用还是不带游戏循环。
我真的很想知道这些问题通常是如何在游戏中处理的(无论是有/没有显式循环)。
发布于 2012-01-27 10:36:26
从你的描述来看,听起来好像当你想要触发一系列动作时,你基本上是一次把它们全部引爆,每个动作都有固定的延迟。这是相当脆弱的--如果你改变其中一个动作的持续时间,它可能就不再和它之后应该发生的事情同步了。
一种更健壮的方法是使用观测器模式。每个动作都可以有一个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);
}您可以通过创建操作(在观察者模式中实现“subject”角色)和ActionObservers (履行“观察者”角色)来链接事件:
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();
}这样,在设置SelectedItemAnimationHandler时不需要指定ScreenTransitionOffHandler的持续时间。
编辑:试图使观察者模式的实现更加清晰。编辑2:将runNow(操作)更改为action.start()
https://stackoverflow.com/questions/9031335
复制相似问题