代码之家  ›  专栏  ›  技术社区  ›  Codejoy

Android中的活动、视图和对话框。正确的游戏应用结构

  •  1
  • Codejoy  · 技术社区  · 14 年前

    我在Android上做了些小调整,目标是要做一个小小的探索游戏。实际上,到目前为止,我已经有了相当多的进展:一个不错的sprite系统,一个标题屏幕,上面有一个主菜单,所有的菜单都是游戏代码(没有用户界面按钮或任何东西),可以启动各种活动。加载此酷地图视图的活动,单击此活动将加载地图中更详细的“放大”操作部分的另一个视图。一切都很好,但现在我想知道我在这方面做得有多好。

    (当您实例化一个视图,然后将设置上下文移动到一个新视图时,该视图会发生什么情况?我猜只要活动是活动的,活动使用的各种视图的所有实例化仍然是好的?在活动中,onpause是指当用户退出游戏时,ID必须保存在这些视图中更改的数据,以保持状态。?)

    游戏开始时我有三个菜单选项。主要是:

    新游戏

    • 新游戏,我启动主地图 可以启动三个视图的活动: 前两个是加载屏幕 第二个是地图屏幕。

    • 第三种观点是更详细的行动 使用此sprite的定向部分 我开发的发动机。

    这一切都很好地工作,就像在地图视图中单击一个单元格,它通过侦听器通知调用活动启动详细的操作视图,并传递单元格的ID(这样它就知道在详细视图中基于在第二个视图中单击的单元格加载哪些对象)。(这花了我一段时间才弄明白,但有人在另一个问题上帮了我。) here. 我也使用了这里的各种信息 ViewSwitcher .

    我甚至在第二个视图中有一个“是-否”对话框,当他们单击该单元格时,它会询问他们是否真的想转到该单元格,而“是”则会告诉调用活动设置新的视图。帮助我完成这项工作的是这份推荐信 here. 我还得拨弄电话 getContext 而且,我仍然不能百分之百确定什么 getResources 获取上下文 帮我吧。

    那么,从视图调用和加载对话框是一个坏习惯吗?如果是,那么我不明白如果视图中有一个事件需要弹出一个对话框,我该怎么做?回调活动并让活动处理对话响应,然后在视图上调用响应的方法?

    到目前为止,这一切都很好,我也有点了解线程。我为我的菜单视图(处理按钮点击和响应的检测)生成了一个不同的线程,我的Cellmap视图(处理用户可以点击以查看我的系统视图)处理酷的大地图。

    所以基本上,活动调用列表是这样的:

    home.activity->scrollmap.activity,当出现“是/否”对话框时(在Cellmap视图中),它将侦听Cellmap,如果问题的答案为“是”,则Ontouchevent将使用

    
        private CellMap.MapClickedListener onTouchEvent=
            new CellMap.MapClickedListener() {
            @Override
            public void onMapClick(int id) {    
                setContentView(new SolarSystem(theContext,id));                                     
            }
        };
    

    为了帮助其他人,必须在我的Cellmap类中定义该侦听器。然后在Scrollmap活动中,当我即将启动Cellmap时,我只调用一个方法来设置映射单击侦听器。到目前为止,这是我从一个对话框(在本例中是单击它以设置新视图)中获取数据的唯一方法。这是适当的做法吗?

    现在我最大的问题是,我有一个playerObject类,我想在新的游戏事件上初始化(我知道如何检测推送),然后在循环的整个生命周期内,它对任何活动中的任何视图都可用。到目前为止,游戏活动只有两个视图(如果计算加载进度条,则为3个)。我想知道玩家的名字,这是另一个活动还是视图?我找不到一个像样的教程,教你如何制作一个简单的输入对话框来返回一个字符串。

    我该怎么把这些东西传出去?在从要加载该编辑框的任何位置获取玩家名称后,我希望在类中设置玩家名称,并将该类实例传递到另一个视图或活动,以便他们可以获取该数据。我在这上面搜索的所有东西似乎都是多余的,或者不是正确的方式。什么是传递这个“playerclass”的最佳方式,这样我就可以从其他视图访问它(也就是说在每个视图中显示玩家的名字)。

    我还有我的家庭活动,它等待在3个按钮上单击一次,然后启动显示视图的活动。我意识到一个继续游戏和新游戏是相同的活动,只会改变从驱动器加载的数据来恢复一个保存游戏。单击“新建游戏”按钮时,我希望获得他们要使用的玩家名称,当然,请将playerclass的成员设置为该名称,以使其保持不变。

    我在哪里打电话(是编辑对话吗?)编辑对话框来自?(更多关于如何构建一个可以接受OK按钮和键盘等输入的按钮)。我还想让它漂亮,也许我可以有一个简单的视图,其中有一个编辑框和一个很好的图像背景(虽然我还没有找到如何放置编辑框,以很好地匹配我为它画的背景)。我想我喜欢一个编辑对话框,我可以皮肤看我想要它的样子和适合的游戏的外观)。

    事实上,我有点高兴到目前为止,它看起来还不错,只是不确定一些细节,如获取玩家姓名的用户输入。存储这些信息并将其传递给其他活动和视图。

    最好是有一个游戏主活动和大量的视图: 地图视图 字符表视图 库存视图等?

    还是应该在某个地方也有不同的活动?

    1 回复  |  直到 14 年前
        1
  •  1
  •   tlayton    14 年前

    你在这里写了很多东西,所以我会继续回答你想问的问题。

    首先,如何在活动和视图之间共享信息?如果您只是在单个活动的视图之间共享它,请将其存储在活动子类的实例中。

    活动之间的共享需要更多一些。您可以创建应用程序的子类,而不是使用默认应用程序类的实例。将数据放入该子类的字段中。要告诉应用程序使用子类,请按如下方式修改应用程序清单:

    <application
        ....
        android:name=".YourAppClassNameHere">
        ....
    </application>
    

    至于获取用户输入,简单的答案是使用内置的EditText视图。因为你似乎想给你的游戏一个更“自定义”的风格,不过,你可能需要创建自己的可编辑文本框。它和按钮应该允许大多数基本的用户输入。

    现在,对活动和观点进行良好的实践。我不知道这方面的标准,但在设计时,我通常会尝试将活动视为概念上更为独立的元素,而视图则是概念上相互交织的。两者之间的界限在某种程度上取决于应用程序的范围;一个焦点较窄的应用程序可以将更多的操作分解为不同的活动,而不是一个焦点更广的应用程序。

    你的“GameMain”例子有点站不住脚,但我认为你已经做出了正确的选择:活动是“玩游戏”,而不是菜单或高分表,并且视图呈现了正在玩的游戏的不同方面。