首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个基于网格的布局游戏及移除项目

一个基于网格的布局游戏及移除项目
EN

Stack Overflow用户
提问于 2011-02-24 23:14:06
回答 4查看 396关注 0票数 1

假设我收集了一组入侵者(简单的网格):

在这张图片中,只有C型入侵者才能射击。

有人开枪,入侵者被摧毁:

现在,第二行第三列中的入侵者类型B也可以触发。请注意,同时屏幕上只能有三个随机入侵者镜头。因此,在集合{C,C,B,C,C}中只有三个入侵者可以射击。

我将如何实现这一目标?我正在考虑两种解决办法:

  1. 使用数组(或,)。当入侵者被击中时,入侵者所在的位置被设置为null。然后,当入侵者开火的时候,第一行就会有一个循环。遇到空时,它会检查空号上方的空格。是空的吗?然后对上面的空格做同样的处理。最上面一行的空格是空的吗?转到第一行的下一列。
  2. 每个入侵者类型都有一个位置(我使用Point表示)。为每个位置分配行号(所使用的集合将是某种字典)。所以,当看到图像时,所有的C都得到了1,所有的B得到了2,所有的A得到了3。

在这张图中,位置(2,2)处的C被破坏。然后它应该从它减去点的Y值,这将是(2,1)。如果集合中有这样的位置,那么将位于该位置(2,1)的入侵者分配给被破坏的入侵者的位置(2,2).。像这样,我不需要有一个包含一串空的锯齿状数组。

我的想法是,当游戏开始时,第一组应该是{ C },然后是{C,B,C,C}。从这一组中,随机选择三人开火。

有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-25 09:02:49

在游戏开发中,特别是在像C#这样的托管语言中,特别是在Xbox 360上,一般来说,您的首要任务应该是在游戏运行时避免分配内存。节省内存和减少操作计数是次要的问题。

null (以32位为单位,XNA在其中运行)仅为4个字节!

包含指向入侵者的指针的2D数组([,])似乎完全合适。特别是因为它允许您通过数据结构中每个入侵者的位置来使其位置隐式化。(您甚至需要创建单个入侵者对象并指向它们吗?只需使用一个数字来表示入侵者的“类型”。)

循环数据结构(以您建议的方式)将是如此惊人的快,它很可能是一个“免费”的操作。因为处理器本身可以更快地处理数据,而不是将其带入缓存。

而且你甚至没有做到每一帧-只有当你的入侵者开火!我愿意打赌,每当入侵者被摧毁时,计算和存储数据,然后在入侵者开火时加载数据,将是更慢的。

(基本上,您建议的是缓存/预计算数据。一种有用的性能优化技术--但只在实际需要的情况下。

你应该更加担心每一帧的成本,而不是那些只是偶尔由计时器和用户输入触发的帧。

不要使用锯齿数组([][])。这基本上是一个数组。它使用更多的内存,并包含一个额外的间接层,这反过来也可能降低数据的局部性(这意味着您的数据可能不会以一次命中的方式在缓存中结束--这就是“慢位”)。它还增加了GC必须考虑的对象的数量。不要出于同样的原因使用Dictionary

在游戏开发中,至少在你工作的时候(在任何其他地方,这都是完全不成熟的优化),保持这种性能是很有帮助的。

但是,对于像太空入侵者这样简单的东西,你几乎可以做你喜欢做的任何事情!所以,做最简单的事情,可能是可行的。

票数 0
EN

Stack Overflow用户

发布于 2011-02-25 03:00:10

我不同意Mirkules的观点。我建议您不要为能够射击的入侵者保留单独的数据结构。一般来说,坚持使用干型来防止后面的逻辑问题是个好主意。对于一个简单的应用程序,您可以将整个程序保存在脑海中,这可能不是什么大事。但是,当您开始处理更大的项目时,当您修改任何一个关联的结构时,都很难记住您需要更新多个数据结构。

过早的优化是万恶之源。您可能甚至不需要担心在如此微小的级别上进行优化。我的经验是,当您花费大量时间处理这些类型的问题时,您最终会得到很好的代码,但是您没有什么可展示的。相反,我更喜欢花时间让我的应用程序去做我想做的事情,然后在以后的某个时间重构它。看到我的应用程序正常工作,我就有了继续编写更多代码的动力。

祝你的比赛好运。Xna写游戏太有趣了!

票数 1
EN

Stack Overflow用户

发布于 2011-02-24 23:31:57

我会保存所有入侵者的二维阵列。此外,如果您维护一个单独的数据结构,仅指向可以触发的入侵者,而不必每次必须触发时循环整个数组(导致程序在开始时非常慢,因为会有更多的入侵者),那么速度会更快。因此,在第一个图中,数据结构将包含所有"C",而在第二个图中,{C,C,B,C,C,C}。当需要启动时,您只需引用此数据结构,获取它们的指针,然后只对任何入侵者调用" fire ()“。

你没有解释如何选择三个可以开火的入侵者,所以我猜它是随机选择的--在这种情况下,你所要做的就是在0(包括)和n-1之间选择一个随机数(其中n是数据结构中入侵者的数量,在本例中是6)。

最后,当到了摧毁入侵者的时候,如果你有2D阵列并且你知道位置,那么就很容易将被杀死的入侵者从“行刑队”数据结构中弹出,并将他上面的一个分配给行刑队(即入侵ArrayKilinvader.row-1)。

希望这是有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5111745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档