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

8
我需要您就如何在一个简单的游戏中实现可滚动的游戏区域向您征求建议。该区域由多行组成,每行有9个单元格。在游戏过程中,可以动态添加和删除行。每个单元格都有一个数字,并且可以叠加多个覆盖图像,例如选择、选择器、划去等(请参见下图)。用户应该能够点击一行中的单个单元格来选择/取消选择/划掉所触摸到的单元格。在游戏的任何时刻,单元格数量可以从0到3000个(大约333行)。游戏区域应该平稳地上下滚动。
我正在考虑使用ListView,其中每一行都是游戏区域中的一行。这样,在游戏过程中我就可以动态添加/删除行。但是,我应该如何准确地实现一行:有一个位图表示一行,然后当用户触摸它时--获取触摸区域的坐标,并找出哪个单元格受到影响,然后采取相应的行动。是否可能获取ListView中一行的触摸坐标?如果不行,我应该在每一行中放置9个虚拟图像占位符,然后对用户触摸这些占位符进行操作?性能方面怎么样?
或者,我应该有一个代表整个游戏区域的巨大位图/画布,将其放置在ScrollView中,然后随着用户与其交互而计算所有坐标并更新它?这会比ListView更快还是更慢?
还有其他解决方案吗?
我希望这是一种“常规”类型的应用程序游戏,而不是基于循环的游戏,因为我认为我不需要每秒重新绘制30次。
我对Android还比较新。谢谢您的建议。
2个回答

4
您可以通过“游戏循环”/ SurfaceView组合轻松快速地设置此类应用程序。这意味着没有ListView,只有自定义绘图和事件处理。幸运的是,事件处理并不那么困难,而且您将获得比使用一堆自定义视图和布局更多的界面控制权,因此最好避免使用www.droidnova.com教程中不必要的HashMaps,这会影响性能。以下是我建议的步骤:
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方向上的分数行高度进行偏移,而不是整个行。

谢谢Josh,你的建议非常有帮助。我已经在实施它了。 - Levon

1

我不确定你是否能够创建一个像你描述的游戏,并且具有良好的性能。我建议你研究基本的瓷砖游戏编程。

但是,避免使用标准视图组件并且需要自己编写所有逻辑需要相当多的工作。例如,处理不同行上的“点击”事件需要根据瓷砖位置相对于游戏摄像机进行计算。因此,在学习以较低级别开发游戏时,有很多新东西需要掌握。

你还需要将游戏的渲染掌握在自己手中,通过开发一个游戏循环来不断更新和绘制你的瓷砖,以反映游戏的滚动/状态。你可以在以下网址获取有关游戏循环基础知识的更多信息:

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

这些内容可以让您深入了解在低级别上为安卓开发游戏的过程,从而可以进行性能微调。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接