首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏架构和方法(屏幕/效果)

游戏架构和方法(屏幕/效果)
EN

Stack Overflow用户
提问于 2012-01-27 09:37:22
回答 1查看 606关注 0票数 0

我正在研究如何设计我的游戏在管理/转换不同的“屏幕”以及影响时间。我目前正在安卓系统上使用AndEngine,它没有明确的游戏循环,不过我想知道这些问题是如何处理的,不管是用还是不带游戏循环。

  1. 我已经编写了一个临时系统,用于处理游戏中的不同“屏幕”(splash、菜单、游戏、选项等),该系统基于AndEngine中的“场景”。我有三个基本的“场景”,作为层的背景,内容和弹出窗口。每个屏幕都有onTransitionIn()和onTransitionOut()方法,这些方法在调用自己的方法(比如closePopup()之类的东西)时由ScreenManager调用。但是,转换方法中的所有代码显然都将立即运行,这意味着所有动画、屏幕状态等都将立即执行。为了克服这个问题,我在Android类中使用了postDelayed(runnable )方法。这样,我就可以在转换动画完成后更改屏幕状态,然后一个接一个地运行动画。现在整个系统基本上是基于通过处理程序运行延迟代码。不出所料,它是粗糙的,不是特别稳定和一般业余。
  2. 关于“效果时间”的第二个问题与我对Handler类的使用密切相关。让我们简单地说,当用户完成任务时,我想要创建一个效果,在这个任务中播放一些动画,在屏幕上增加一个数字。目前,一个接一个运行的唯一方法是使用Handler。如前所述,在我看来,这似乎是一种粗糙/不稳定/业余的方法。

我真的很想知道这些问题通常是如何在游戏中处理的(无论是有/没有显式循环)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-27 10:36:26

从你的描述来看,听起来好像当你想要触发一系列动作时,你基本上是一次把它们全部引爆,每个动作都有固定的延迟。这是相当脆弱的--如果你改变其中一个动作的持续时间,它可能就不再和它之后应该发生的事情同步了。

一种更健壮的方法是使用观测器模式。每个动作都可以有一个onCompleted()事件(和/或其他各种事件,这取决于操作的性质),可以用来触发下一个操作的开始。

例如,假设当用户按下选择菜单项时,您需要以下事件序列:

  1. 播放选定项目的动画。
  2. 当1完成时,将当前屏幕关闭。
  3. 当2完成时,切换下一个屏幕。

听起来你在做这样的事:

代码语言:javascript
复制
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 (履行“观察者”角色)来链接事件:

代码语言:javascript
复制
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()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9031335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档