2013-05-13 104 views
0

我正在尝试制作自己的俄罗斯方块游戏。到目前为止,我能够展示作品,旋转它们。但我坚持一点,不知道如何继续。制作俄罗斯方块时卡住

enter image description here

我有一个

  • BoardClass静态整数数组board为网格。用不同的整数数字显示不同的颜色。
  • Block类有它的方法来产生随机块和旋转它们。
  • Graphic类显示颜色基于board阵列上,并且
  • GameLogic类开始,暂停游戏。

对于当前片段我已经采取了4×4阵列和被放置在板中前四行board

所有的工作良好。但我该如何开始移动东西。如何建立块之间的关系是我卡住的地方。

我的问题

  • 上午我在正确的轨道工作?
  • 如何实现事物自动化,我的意思是块将如何自动出现。我知道我可以在tick事件中有一个DispatcherTimer和移动块,但绘制和重绘整个网格很慢。我只想要重绘游戏网格的一部分。
  • 如果我将棋子向左/向右/向下移动,则完整棋子阵列会移动,这意味着4x4棋子会移动,而不仅仅是可能在1x3或2x2中的棋子。
  • 如何知道这件作品是新作品还是旧作品。我知道我可以采用布尔值,但我认为10x20的布尔数组会很大。

我知道这些可能不是一个很好的问题要问,但我坚持和任何帮助,将不胜感激。问我是否想看任何代码。

回答

2

我在正确的轨道上工作吗?

我想你是。

如何实现事物自动化,我的意思是块将如何自动地相继出现。我知道我可以在tick事件中有一个DispatcherTimer和移动块,但绘制和重绘整个网格很慢。我只想要重绘游戏网格的一部分。

您是否测量了它?大多数游戏以每秒30帧的速度重绘整个场景。先做好工作,然后再进行优化。

如果我将棋子向左/向右/向下移动,则完整棋子阵列会移动,这意味着4x4棋子会移动,而不仅仅是可能位于1x3或2x2中的棋子。

您需要在每次移动前检查边界。你可以为每个方块做这个,你只有16个比较。这不是很困难,也不会很慢。

如何知道这件作品是新作品还是旧作品。我知道我可以采用布尔值,但我认为10x20的布尔数组会很大。

这并不大。

0

你到目前为止所做的工作对我来说听起来没有问题。至于你的其他问题去:

如何自动化的东西,我的意思是,块将如何自动出现 一个接一个。我知道我可以有一个DispatcherTimer 并在tick事件处移动块,但绘制和重新绘制完整的 网格很慢。我只想要重绘游戏网格的一部分。

  • 您可以使用脏重新计算来找出重新绘制的位置。但是,如果你真的有一个像俄罗斯方块游戏一样简单的应用程序的性能问题,我宁愿试图找出为什么你的绘图代码是如此之慢。在过去10年内生产的任何硬件上,即使您每帧重新绘制完整的电路板,您也应该轻松存档100 + fps。

如何知道这件作品是新作品还是旧作品。我知道我可以 采取布尔值,但我认为一个10x20的布尔数组将是 大。

很坦率地说没有。只需使用一个数组。阵列中10x20 = 200条目。 AFAIK bools将在每个阵列中占用1个字节,这意味着200个字节,所以对于在过去30年建造的机器来说不应该是一个问题。即使你使用整数,你仍然可以使用小于1 kb的内存。

+0

我的俄罗斯方块的实现的例子,但我将不得不作出的一举一动200个比较..那岂不是很大? – 2013-05-13 12:12:03

+0

不需要进行200次比较(尽管即使那样也肯定会表现良好)。你应该知道你的棋盘上你的活动部分在哪里,所以你可以对你的部分触及的字段进行比较。 – rincewound 2013-05-13 12:17:27

0

我在正确的轨道上工作吗?

如果你的愿望是学习游戏编程,而不是在每一个小细节都拉出你的头发,我会推荐使用像Box2D这样的库来处理世界空间和物体碰撞。

除了Box2D,我还建议使用一个游戏框架,处理许多游戏编程,频率,输入,声音等基础知识...... PlayN和LibGDX都很棒&免费框架让你跳跃开始。

使用这些工具,您的焦点将更多地放在您的游戏上,而不是基本的。

https://code.google.com/p/playn/

https://code.google.com/p/libgdx/

1

如何自动化事情/绘图,重划网格完整缓慢。我只想要重绘游戏网格的一部分。

当用户划一条线 - 你必须重画整个网格。 (降低线上的数字);

如果我将棋子向左/向右/向下移动,则完整棋子阵列会移动,这意味着4x4棋子会移动,而不仅仅是可能位于1x3或2x2中的棋子。

我认为错误在于当你实际需要1x4的块列表(对于每个俄罗斯方块图)时,为每个图制作4x4阵列;你使用4倍的内存和空间!

如何知道这件作品是新作品还是旧作品。我知道我可以采用布尔值,但我认为10x20的布尔数组会很大。

一个数组永远不会太大(如果我们不谈论数百万); 你可以采用我的方式:制作一个LIST,在其中存储游戏的所有“旧”部分。然后制作一个VARIABLE(数字对象),它将指向电路板上的“新”图形。在“新”人物落地之后 - 您只需将其放入您拥有“旧”物品的LIST中即可。并将VARIABLE指向您网格上的“新增”图形。

希望有所帮助。

您可以检查(在Java中)here

+0

请尝试用一个最小的例子总结你的论点。一段时间后,链接往往会打破。 – ilir 2014-10-20 21:57:18