在Android上设计简单游戏的决策/建议

Lev*_*von 8 android

我需要你在简单游戏中实现可滚动游戏场的最佳方法的建议.该字段由多行组成,每行有9个单元格.可以在游戏过程中动态添加和删除行.每个单元格中都有一个数字,并且可选地有几个重叠的图像,如选择,选择器,划掉,等等(参见下面的图片).用户应该能够单击一行中的单个单元格来选择/取消选择/跨越触摸的单元格.在游戏中的任何点,可以有0到3000个单元格(0到大约333行).该字段应平滑上下滚动.

替代文字

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

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

还有其他方法吗?

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

我是Android新手.谢谢你的建议.

Jos*_*osh 4

您可以通过“游戏循环”/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 方向上偏移分数行高度而不是整行。