~$ 存档

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

观察这个图,发现它并不是全屏的,而是某个固定大小,背景是由30*30的小砖块铺成的,整个背景14行16列,这里所说的14行和16列所在的区域是用户区,而不是整个窗口。

现在计算整个窗口的高度,应该等于14*30+上边非客户区的一段+最下面一段非常小的边框。窗口计算专门写一篇记录,参看:
http://www.cnblogs.com/tinaluo/p/5439891.html

第二步,窗口计算完成之后,接下来是铺图的问题,。如上图所示,怎么能让这些墙,背景,人物按照规则排在指定好的位置呢?
其实整幅图是由一个一个小图块组成的,比如:

一共有8幅小图,把这几个小图编成一个序号,比如,0,1,2,3....,再将整幅图的信息记录在一个文件中,可能的形式如下:

0000000000000000
0000000000000000
0000000000000000
0000011100000000
0000013100000000
0000012111100000
0001114243100000
.....(截选)

这是一个二维数组,里面的信息已经人为的固定好了,也就是每一关的地图。当程序启动的时候,首先读取这个文件,每读一个数,就将相对应的图块画在DC上,读完整个二维数组,则整幅地图也就画完了。
这个思路概括一下就是:用二维数组操纵地图

关于位图操作的问题,同样写一篇详细的记录,参看:
http://www.cnblogs.com/tinaluo/p/5439965.html

关于读取文本文件地图的问题,也写了一篇详细的记录,参看:
http://www.cnblogs.com/tinaluo/p/5442176.html

 

 

算法
问题提出:玩家需要回退一步

根据上面的分析,地图的状态完全是由地图的二维数组控制,走一步刷新一步,如果要回退,自然就会想到把每一步的地图状态都存储起来。比如说,移动四步:
初始状态->A->B->C->D,每次在移动之前,都把整个地图状态存储起来,对于这个例子,就是记录 初始态-A-B-C,一共四个记录,当玩家从C->D要回退的时候,就读取C的状态重画地图,这个是不难理解的。

这个数据结构可以通过链表(栈)来完成,每次移动前,就建立一个结点存储当前的地图状态(入栈),当回退的时候就读取尾结点(出栈),然后重画地图。假设一个玩家推了上百步也没有过关,这个链表的结点就得有上百个。(这是目前我的设计)

具体实现,有两种办法,第一种:自己写链表,第二种:使用STL。STL的使用,也写了一篇记录,参看:
http://www.cnblogs.com/tinaluo/p/5442939.html

 

游戏中更细节的逻辑

游戏中的细节逻辑很重要,所以很多游戏需要内测,就是多测几次看看会出现什么问题。还是以这个小游戏为例。当一关完成之后到下一关,就得清空栈。不然链表会一直记录,比如说,到了第二关,玩家要回退一步,结果又回到第一关的末尾。还有,重新开始也得清空栈,比如玩家玩了一半发现没路了,要求重新开始这一关,一样得清空栈,不然链表还记录以前的内容。也就是说,要注意链表的清空时机。

游戏完整代码(只能用作字面上的参考)

posted on 2016-04-22 09:53  LuoTian  阅读(520)  评论(0编辑  收藏  举报