【100】如何用C语言玩超级马里奥这样的游戏?
大家好。今天有时间写点东西,主要是我做“超级玛丽”的经验和总结,可能对新手有用。这是我整理出来的,不是编程顺序。
我先解释一下编程语言。我用QB玩“超级马里奥”,用VB做地图编辑器。
确定游戏规模,我的设定是:没有怪物和金币,没有进出的水管,通关时没有动画。这样,程序的主要操作就是显示前景、背景和玛丽,并检测玩家与前景的碰撞。
资源:图片资源:我参考了一个C语言的“超级玛丽”,借用并修改了部分图片(感谢原作者)。声音:没有。
图像处理:图像分为前景和背景,都是十六个图像块,16*16像素;前景分为三组,分别用来显示不同的层次。每组的前两个图像块是通关标志(旗杆和水平水管)。为了使程序简单,我在程序中不考虑不同的前景,所以通过测试的程序不会分别判断旗杆和水管,我要横向判断,所以当我“站”在水管上时,我不会通过测试,但我必须横向走进水管才能通过测试,旗杆也是一样。图像是BMP格式,不是标准的十六色。必须转换成QB可以识别的格式,还必须设置调色板。我做了两个辅助程序,一个是VB程序,功能是读取颜色值和像素,写两个文本文件,一个是颜色值,QB通过它设置调色板,一个是图像传递文件;第二个辅助程序是QB程序,它读取刚才的图像传输文件,将图像块以GET格式二进制方式写入“tp.xp”文件。这样做的好处是游戏程序可以用数组存储GET格式的图像文件,不需要显示。
选择病例图像索引
案例1 put (x,y),p1%
案例2 put (x,y),p2%
……
",可以是" PUT (x,y),bj(0,图像索引值),PSET "一个语句。
map:map文件是一个文本文件,每行200字节长,21行高。前五行没用,因为玛丽可以跳得比屏幕高。为了避免碰撞检测的冗长,增加了这五行。然后第12行是地图内容,大写字母是背景,小写字母是前景,字母的ascii值与图像索引顺序相同。最后是前景号(有三组前景)和游戏开始时玛丽的位置。确认了这些就很容易做地图编辑器了,地图编辑器也没什么好讲的。制作地图时要注意游戏的趣味性和平衡性。
游戏程序:
输入要求可以检测同时按下的多个键。我从消防员那里下载了这部分。没有它我真的不行。
锻炼身体。模拟玛丽自由跳起和下落,费了一番周折,甚至想过用平方函数曲线(不是叫抛物线吗?),后来发现了更好的方法:重力因子。试试下面这个小程序,是抛物线吗?
屏幕12
将x,y,ty,zl标注为整数
Zl=1 '重力系数
Y = 100 '高度
Ty = 20 '跳跃时加上这个。
对于x = 100到200步骤2
ty = ty - zl
Y = y+ty '如果游戏程序中没有碰撞,执行这个。
PSET (x,480 - y),15
然后
它的优点是简单和真实。其特点是随时因重力而下落。人在跳的时候,高度会越来越小,到了顶上就会掉下来。当他们倒下的时候,差距会越来越大(就是越来越快),这是很真实的。当你掉下悬崖(不是跳楼)时,你会自由落体。但如果一个人走在地上,碰撞检测时会被检测到,不允许摔倒,这在游戏中是看不到的。当然,这只是模拟。
滚动屏幕。地图存储在数组中,每个数组元素代表一个地图块,只显示一部分(19个地图块宽,12个地图块高)。我设置了两个变量,一个是要显示的地图部分的第一个地址;另一个是地图上显示的位置。要流畅地滚动地图,你得小心,移动的距离越小,看起来就越流畅。
看程序:
如果x-pyl * 16 & gt;120和pyl & lt181那么wyl = wyl + 4
如果wyl & gt= 16,则wyl = 0: pyl = pyl + 1
x是地图上的人的横坐标,pyl是显示的地图的第一个地址,x-pyl * 16是显示器上的人的横坐标,120大约是屏幕的中心线,wyl是第一个显示的地图的显示位置。姑且称之为位移,取值为0,4,8,12。
第一条:人越过中心线向右走,没有到达终点时,位移增加四,每张地图向左显示四个像素。
第二条:移动16个像素时,显示的地图范围向右移动一格,位移设置为零。
这样循环实现了地图的平滑滚动。
碰撞检测。这部分很简单,依次检查人占据的四格图是否为空,如果人已经进入前景,就把他们拉回来。
字符图像的显示:
如果dz & lt3那么dz = dz+1 ELSE dz = 0 '正常行走时,交替显示三张行走地图。
如果gamekey (75) = 0且0 = gamekey (77)则dz = 0’当你不走路时,用脚站立。
如果跳跃时d = 0,那么dz = 5 ’,则显示跳跃的画面。
他们的顺序也是优先的。
加上方向,自然就好了。检测输入时设置方向。
刚才说了“tp.xp”文件和显示地图块,然后用源代码解释一下。我不知道GET image格式,但是我的助手程序是这样写文件的:
打开二进制文件“tp.xp”作为#2
对于……
f = 1
得到(,)-(,),一个
对于j = 0到130
把#2,f,a(j)
f = f + 2
然后
……下一个
关闭
游戏初始化时读取文件:
f = 1
打开二进制文件“tp.xp”作为#2
对于i = 0到15
对于j = 0到130
GET #2,f,bj(j,I)
f = f + 2
然后
然后
关闭#2
显示时:
PUT(,),bj(0,图像索引值),PSET
只有一个。
这才是最重要的。
这些只是我在编程的时候发现的,可能和一般的游戏开发不太一样。如有不当或不妥之处,请批评指正。
谢谢你。
作者:执着的男孩
QQ:47815463
E-MAIL:gxf03@tom.com