2007年12月10日星期一

单片机游戏应用设计(全部文档可以下载)

1.概念
对于大部分单片机+LCD的游戏设计,基本采用前后台方式,就是一个台中断,一个台循环
(哪个前哪个后忘了),LCD部分基本是以固定点阵形式设计,什么叫固定点阵 首先先
明确,我们设计的游戏不是什
么魔兽争霸或CS,而是黑白形式的固定点阵游戏,例如常见著名游戏贪吃蛇或俄罗斯方
块.他们的每个点
都是预先就固定下来的,而且是比较大的点,这类专门的游戏机玻璃是经过厂家开模出来
的,有固定的COM,SEG线,然后接到专门的单片机上,例如常用的6502指令集合的单片
机,呵呵,我以前就用6502设计过一个.
对于业余设计的游戏,我们一般用如128*64的LCD来显示,那么我们设计的时候首先应该把
这个128*64的LCD分块,也就是分出固定点阵出来.LCD的基本点阵是128*64,就是・
$##$总之就是好多个点啦,但我们事实上不一定要运算这么多个点,除非你做的游戏很
有看头.例如你只用左边64*64的地方来做贪吃蛇,那么你打算你的贪吃蛇的活动空间是多
少呢 如果是8*8个点的话,算一下就是每个点64/8,64/8,也就是8*8个基本点阵,不过
想好玩一点,当然就是要有16*16个点的活动空间啦,那么每个固定点阵就要占4*4的基本
点阵了.要注意,这些4*4的东西在64*64LCD上共16*16个,每个都要用来独立运算.
2.时钟
这个其实是游戏的速度,对于一般的弱智类游戏机,他也代表了难度,物体在每个时钟到
达的时候就传动一次,例如俄罗斯方块没个时刻向下跑一层.赛车游戏每个时刻想前走一
步.一般这类时钟的时间在0.X秒到1秒之间,物体有规律地匀速运动,让人看到感觉是连
动.
3.运动
在这里,我先介绍两种比较普遍的弱智游戏机的物体运动规则:柔体传动,刚体传动.
刚体传动
代表作是俄罗斯方块,所谓刚体,就是硬硬的一个东东,运动的时候也不怎么旋转(注
意,俄罗斯方块是会旋转,但其实他是没有经过算法的旋转,纯提取数组的方式,也就是
把一个放块做成4个模式的点阵结构,其实就是4个方向,呵呵)对于刚体的传动,在每个
时钟到达的时候向一个方向(很可能是用户输入的)运动一个固定点阵.如果以坐标来表
达,就是物体的所有基本点阵同时向一个方向(X或Y)移动一个单位.
柔体传动
代表作是贪吃蛇,贪吃蛇跑动的时候并不是整条蛇向一个方向动的(呵呵,蛇蛇身体僵硬
了),而是在每个时钟的到来,物体由能量头带动(如蛇头),每个点的方向都向下一个
点传播,然后自己向新的方向走动一步,走动后,下一个点由于得到了上一个点的方向并
同样地运动一步,所以,他会马上填补上一个点的地方,如此类推.
说的好象没说,看不懂没关系,因为实际的算法可以简化(傻瓜才会一个个点来走的),
实际上在设计贪吃蛇的时候,只需要把蛇尾巴的那个点阵去掉,然后在蛇头的新方向放一
个点阵就是了.期间需要记录下每个蛇身的固定点阵的位置,并且在每个运动时刻过后刷
新一次每个点的位置.
4.显示接口
我们用的一般是点阵式LCD,就是一大片点点,128*64,132*64,240*128等等等等啦,这
些又叫条屏,就是一写就写一条――8个点(有的也提供写一个点的功能,但贵,至少我没
有),那么如果你只想写一个点怎么办 那就得先把这个点所在的条读出来,然后通过
与,或,的运算后,再放回到LCD上,这时候就要涉及到一个读LCD的问题了,有的LCD提供
读的功能,你写过什么在上面他记的很清楚(就好象老丁实验板上的LCD),但有的便宜货
就不行了,那么我们怎么办 没关系,你在内存中提取出一片空间,虚拟一个LCD出来,每
次写在真实LCD上面的时候,也同时写到内存的哪个虚拟LCD上,那么你要读出LCD的值的时
候实际就是读出虚拟LD上的数据,然后与或后,再重新写到LCD上,记得也要写到虚拟LCD
上哦.你可以把这片缓冲叫做显存(COOL吧 )
5.流程

下载该文档
这是成功设计游戏的灵魂,你在设计游戏之前必须能正确构思到一个基本模型出来.这个
基本是菜鸟和虾米的一个区别,有了构思,其他的其实都是时间问题了.
以贪吃蛇为例,我们需要有这样的基本思路:(普通手机上的那种)
蛇运动处理,吃到食物的处理,放新食物的处理,死亡的处理.
以上是基本的思路,至于那些记录分数,音乐效果,玩到一定分数会自动加速度等不是游
戏的必须,可以在后期处理!
分析下来:

运动:根据用户输入按键进行柔体传动.
吃到食物:置没有食物标志了,蛇长大一个点阵.
放新食物:判断食物标志,如果没有食物,就要放食物,判断放的食物是否和蛇身重叠,
重叠了要重放.
死亡处理:判断是否撞中自己或撞墙.
这就是基本要做的东西,实际上就是程序要做的东西,那么把上面的东西连成一个流程是
怎样的呢 我以文字表达:
蛇向一个固定方向进行柔体传动,没个运动时钟到达要做:1.判断食物标志,没有食物了
就放一个,放的时候判断,不能和蛇身重叠 2.得到用户按键值,蛇走一步,并判断是否
撞死了,没撞死,再判断是否吃到东西了,没有吃到,就等下一个运动时钟,吃了 就增
长一点.置一个没有食物的标志.然后等待下一个时刻的来临.
呵呵,其实程序就是这么简单,基本设计只有LCD部分和按键部分是和单片机有关的,其他
都是程序思维和算法.对于菜鸟来说,难度在于思维,而不是单片机.
说了屁话一堆,还得放上个能玩的,这里我介绍我的贪吃蛇程序,在丁丁的DX实验板上跑
的,很久以前就写的了,老丁也玩过,基本和手机上的那个区别不是很大.
程序注意:这是在DX51板子上跑的程序,有些函数部分采用了丁丁写的底层:例如键盘
扫描,汉字显示,LCD显示等,为了保障老丁的利益,我没有完全给出所有的底层部分,其
实他们和贪吃蛇本身没有太大关系.贪婪者别以为拿来就用,我只希望大家用来交流学
习.其实改改就能玩的了.
注释应该很详尽,有不懂自己想啦.
还有,我有点反感有些人公布程序了,但却把很多注释去掉,这个不知道是什么心态
呢 希望大家能大方点,要给,就要给最好的!!

没有评论:

Sticky