【问题标题】:Design decisions / advice for a simple game on AndroidAndroid 上简单游戏的设计决策/建议
【发布时间】:2010-12-21 08:14:21
【问题描述】:

我需要您就在简单游戏中实现可滚动游戏区域的最佳方式提出建议。该字段由多行组成,每行有 9 个单元格。在游戏过程中可以动态添加和删除行。每个单元格中都有一个数字,以及可选的几个叠加图像,如选择、选择器覆盖、划掉等(见下图)。用户应该能够单击一行的单个单元格以选择/取消选择/交叉触摸的单元格。在游戏中的任何时候,都可以有 0 到 3000 个单元格(0 到大约 333 行)。该字段应该可以平滑地上下滚动。

我正在考虑有一个 ListView,它的每一行都是字段上的一行。这样我就可以在游戏过程中动态添加/删除行。但是,我应该如何实现一行:让一个位图代表一行,然后当用户触摸它时——获取触摸区域的坐标,找出受影响的单元格,然后采取行动。是否可以在 ListView 中获取一行的触摸坐标?如果不是,我应该在每行放置 9 个虚拟图像占位符,然后对用户触摸这些占位符采取行动吗?性能怎么样?

或者我应该有一个代表整个字段的巨大位图/画布,将它放在 ScrollView 中,然后计算所有坐标并在用户与之交互时更新它?它会比 ListView 快还是慢?

还有其他解决方案吗?

我更喜欢它是一个“常规”应用类型的游戏,而不是基于循环的游戏,因为我认为我真的不需要每秒重绘 30 次。

我对 Android 还是很陌生。谢谢你的建议。

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以通过“游戏循环”/SurfaceView 组合轻松地使这种设置快速运行。这意味着没有 ListView,只有自定义绘图和事件处理。幸运的是,事件处理并没有那么困难,而且您稍后会赢,因为与使用一堆自定义视图和布局相比,您对界面的控制权要大得多。

    我会避免使用 www.droidnova.com 教程,它不必要地使用了 HashMap,这只会降低性能。

    下面是我的做法:

    1. 创建一个对象来保存您的单元格数据。在本例中,我将使用一个带有 id 的对象(用于打印),以及一个 x 和 y 用于在屏幕上绘制的位置。
    2. 确定适合您的屏幕且无需滚动的板尺寸,例如 10x10。稍后您将添加滚动。
    3. 创建长度为 boardSize x boardSize 的单元格对象的二维数组。用屏幕上的 id 和 x 和 y 位置填充对象。
    4. 在您的自定义 onDraw 中,遍历单个数组的每个“行”和“列”,并以其存储的 x 和 y 值绘制对象。

    所以现在您的屏幕上显示了一个对象网格。现在您想要限制当前显示的行数并添加一些功能来更改哪些行可见。这样做如下:

    1. 在初始化期间,将一些全局整数设置为 mCurrentRow = 0 和 mNumVisibleRows = 3。这些定义了您的“视图窗口”。
    2. 修改您的绘图代码以仅绘制从 mCurrentRow 开始并以 mCurrentRow + mNumVisibleRows 结束的行。这样做的结果应该是您只看到 mNumVisibleRows 行,而您看到的行组取决于您将 mCurrentRow 设置为什么。
    3. 在网格图的右侧添加一些三角形,并将这些区域中的点击触摸事件映射到 mCurrentRow 的增量/减量。显然,您不应允许该值超出您的行数范围。
    4. 如果您想变得优雅,请在三角形之间画一条线作为滚动区域,并将那里的触摸事件映射到 newCurrentRow = (touch.y / canvas.height()) * boardSize; 之类的东西,这需要一些调整,但您明白了。

    这种方法的缺点是一次只显示一组完整的行,因此滚动不会很流畅。但是,您可以完全控制画布和绘制的内容,因此通过更多的数学运算,您可以实现平滑滚动机制,该机制将在 y 方向上偏移一小部分行高,而不是整行。

    【讨论】:

    • 谢谢乔希,您的建议很有帮助。我已经在实施了。
    【解决方案2】:

    我不知道你是否能创造出像你描述的那样表现出色的游戏。我会研究基本的瓷砖游戏编程。

    但是通过避免标准视图组件必须自己编写所有逻辑需要相当多的工作。诸如处理不同行上的“点击”事件之类的事情需要通过相对于游戏摄像机的图块位置来计算。因此,在学习开发游戏方面有很多新东西。

    您还必须通过开发一个游戏循环,不断更新并从后台线程绘制您的图块以反映游戏的滚动/状态,从而将您的游戏渲染掌握在自己手中。 您可以在以下位置获取有关游戏循环基础知识的更多信息:

    http://www.rbgrn.net/content/54-getting-started-android-game-development

    如果您想了解更多信息,您应该看到以下来自 android 的主题演讲。

    http://developer.android.com/videos/index.html#v=U4Bk5rmIpic http://developer.android.com/videos/index.html#v=7-62tRHLcHk

    这些为您在开发 Android 游戏时提供了非常好的洞察力,您可以在其中微调性能。

    【讨论】:

    • 感谢您的建议和链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多