Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 游戏架构;方法(屏幕/效果)_Java_Android_Architecture_Methodology - Fatal编程技术网

Java 游戏架构;方法(屏幕/效果)

Java 游戏架构;方法(屏幕/效果),java,android,architecture,methodology,Java,Android,Architecture,Methodology,我正在研究如何设计我的游戏,包括不同“屏幕”的管理/转换以及效果计时。我目前正在安卓上使用安卓引擎,安卓没有明确的游戏循环,尽管我很想知道这些问题是如何在有或没有游戏循环的情况下处理的 我已经编写了一个临时系统,用于处理游戏中的不同“屏幕”(闪屏、菜单、游戏、选项等),该系统基于AndEngine中的“场景”。我有3个基本“场景”,它们作为背景、内容和弹出窗口的层。每个屏幕都有onTransitionIn()和onTransitionOut()方法,当屏幕管理器调用自己的方法(例如closePo

我正在研究如何设计我的游戏,包括不同“屏幕”的管理/转换以及效果计时。我目前正在安卓上使用安卓引擎,安卓没有明确的游戏循环,尽管我很想知道这些问题是如何在有或没有游戏循环的情况下处理的

  • 我已经编写了一个临时系统,用于处理游戏中的不同“屏幕”(闪屏、菜单、游戏、选项等),该系统基于AndEngine中的“场景”。我有3个基本“场景”,它们作为背景、内容和弹出窗口的层。每个屏幕都有onTransitionIn()和onTransitionOut()方法,当屏幕管理器调用自己的方法(例如closePopup()之类的方法)时,会调用这些方法。然而,转换方法中的所有代码显然都会立即运行,这意味着所有动画、屏幕状态等都会立即执行。为了克服这个问题,我在Android处理程序类中使用了postdayed(runnable,delay)方法。这样,我就可以在过渡动画完成后更改屏幕状态,并一个接一个地运行动画。现在,整个系统基本上是基于通过处理程序运行延迟代码。毫不奇怪,它是粗糙的,不是特别稳定,而且通常是业余的

  • 关于“效果计时”的第二个问题与我对Handler类的使用密切相关。假设我想在用户完成任务时创建一个效果,其中播放一些动画,并在屏幕上增加一个数字。目前,一个接一个运行的唯一方法是使用处理程序。如前所述,在我看来,这是一种粗糙/不稳定/业余的方法


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

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

    一种更稳健的方法是使用。每个操作都可能有一个
    onCompleted()
    事件(和/或各种其他事件,取决于操作的性质),可用于触发下一个操作的开始

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

  • 播放选定项目的动画
  • 完成1后,将当前屏幕转换为关闭状态
  • 完成2后,打开下一个屏幕
  • 听起来你在做这样的事情:

    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();
    }