制作手札---RPG是怎样做成的 (三)

制作手札---RPG是怎样做成的 (三)
发表日期:2007-01-17作者:[转贴] 出处:

-

三月二十九日 至四月一日:场景显示及行走系统

如果说‘消息处理’是整个程序的核心!那么‘场景显示及行走系统’就是整个游戏的核心。因为作为RPG游戏,其所有事件的发生几乎都是和场景有关,例如:不同的地方会碰到不同的敌人、与不同的人对话得知不同的事情、在特定的地点才能找到宝物等等,所有的这一切都说明‘场景’在一个RPG游戏中的重要地位。鉴于这部分的重要性,我们可再将它划分为:背景显示、行走 事件发生 三个子模块,分别处理各自的功能。要注意这可是一个RPG游戏制作的难点哦!下面进行具体分析。

(一)背景显示

通常RPG游戏的场景是采用拼图方式生成的(如《仙剑奇侠传》、《金庸群侠传》等),拼图的好处是节省内存消耗、运行速度快和容易实现滚屏操作等。同时也减轻了美工的工作量,这点对我尤其重要J

我们将计算机屏幕当成拼板,先把屏幕分辨率设为640x480x256色,然后用32x32大小的方格来划分它,这样整个屏幕就分成了15行乘20列的小格子(如图3所示),这就是我们用来表现游戏的舞台了。



舞台搭建好之后,就可以在上面放我们需要的‘道具’,如:树木、石头、房子等等,将它们的大小都统一定为32x32,这样一个格子正好可以放下一个‘道具’;不过你一定会问:难道所有的道具都一样大吗?当然不一样,如果那样就太不真实了,我们把32x32作为最小的道具单位,比较大的道具可以占多个格子。如:一座山的大小为96x64,那么用3x2的格子来放置它就可以了。要注意的是所有道具的长和宽都必须是32的整数倍,这些需要你事先将它们处理好。



请记住每个道具都要有它唯一的编号(如:树木=100、石头=101、房子=102、大山的编号是200~2056个,因为它占6个格子)。这样当场景布置好后,我们的地图数据也就自然而然的产生了,如图4

以上就是场景编辑器的原理了(我在游戏制作前先写了一个场景编辑器,用来生成游戏中要用到的场景。场景编辑器附带在程序之中:MapEdit.exe),用场景编辑器设计好场景后先存在磁盘中,以便在游戏中调用。注意:道具的图片应事先制作好并存于另外的图形文件中。这里需要存储的仅仅是对应的数据,而不是真正的图片。

搞清楚原理之后,要在游戏中生成场景就非常简单了,其实就是场景编辑的逆过程,一个是根据场景生成数据,而另一个是根据数据生成场景。我的算法如下:

MapData[20][15]//事先用场景编辑器生成的地图数据
Picture[nums]//道具的图片 nums表示道具的总数


void MakeBackGround() //
生成场景函数
{

int n;

for( int i=0; i<15; i++) //15
for( int j=0; j<20; j++) //20
{
n=MapData[ i ][ j ]; //取得该位置的道具编号
Blt( j*32, i*32, Picture[n]); //在此位置(j*32,i*32)画道具
}
}

一切就是这么简单,看着像图4一般的游戏场景,你的心情是不是非常激动?我想你一定和我一样吧!不过可别先忙着高兴,下面的内容会更精彩的。

(二)行走

舞台搭建好了,终于轮到我们的主角出场了(注意了!灯光、奏乐……),要让小飞刀在场景中自由自在的行走可不是一件容易的事,算算一共有上、下、左、右四个行走方向,每个方向3幅图(站立、迈左腿、迈右腿),所以要事先做好12幅图,如下:



游戏中一定要将图片的背景设为透明,这样在画人物的时候就不会覆盖上背景色了(这一技术在
DirectDraw中非常容易实现,只要将背景色定为ColorKey就行了)。

其实让角色在场景上移动并不困难,只须改变他的屏幕坐标(x,y)就可以了,但是,一般的地图都比屏幕大的多,如果仅仅改变屏幕坐标的话,小飞刀不是就会走到屏幕外面去了吗?所以我们要让主角位置不动,而使场景移动。你是否注意到了《仙剑》中李逍遥一直就在屏幕的正中间?他行走时场景向着相反的方向移动。对,这就是滚屏技术的效果。

地图是一张很大的画,而屏幕就是我们用来观察的窗口。利用我们先前讲的拼图方法就可以很容易的实现滚屏操作。只须引入一个相对坐标(SXSY),表示当前屏幕左上角相对于整张地图左上角的位置。那么,生成场景时加入这个相对坐标就可以了,看看改进后的算法:

//场景生成算法

int W=100,H=80; //假如地图的大小为100*80个格子
MapData[W][H]; //事先用场景编辑器生成的地图数据
Picture[nums]; //道具的图片nums表示道具的总数

void MakeBackGround() //生成场景函数
{

int n;

for( int i=SY; i<SY+15; i++) //共15行
for( int j=SX; j<SX+20; j++) //共20列
{
n=MapData[ i ][ j ]; //取得该位置的道具编号
Blt( j*32, i*32, Picture[n]); //在此位置(j*32,i*32)画道具
}
}

怎么样?变化不大但是却很有效,这也正是游戏编程的魅力!这时要让角色移动就只须往相反的方向重绘背景就可以了,而角色一直保持在屏幕的正中间,需要做的工作只是根据行走方向和步伐不停变换图片而已。

还要注意的是行走时的障碍物判断,因为有一些道具是不可跨越的,比如树木、房屋等。那么我们在行走时,应该先计算出下一步是否会碰到障碍,如果有障碍就取消移动。在这个程序中就是判断下一个格子中数据是否为0,因为0代表地面。

好了,到现在为止,一套完整的行走系统就基本上出来了。运行一下,看看自己做的RPG游戏,感觉也不比别人的差嘛!看来只要是用了心,就会有好的心情!

(三)事件发生

不要忘了,这部分还有一个非常重要的功能,那就是事件发生了。其实原理非常简单,就是把相应事件的编号放在地图的某些格子中,那么,当主角一踏入这个格子就会触发对应事件。例如:

我们设定游戏一开始时,小飞刀是在他的房间里。那么他要是想出去的话,就需要执行场景切换这个处理函数,但是应该在什么时候执行呢?这就需要触发一定的事件了。我们假定该事件的编号为1000,那么在地图上把门口处的格子值设为1000。这样无论小飞刀在房间里怎么走动都没有关系,而一旦他走到门口时,编号为1000的场景切换函数就会被触发,于是小飞刀便从屋内来到了屋外。

类似的事件还有很多,踩到陷阱、碰到敌人、发现宝物等等……都可以用同样的方法进行处理,所不同的只是调用的函数。

OK!最艰苦的时段终于熬过去了,现在就让我们以无比轻松的心情来回顾一下这几天的工作成果吧!

首先,我们用拼图的方式建立了游戏的场景显示系统。

然后,以滚屏技术实现了角色在场景上的移动。

最后,了解了事件发生的一般原理。

到目前为止,我们已经拥有了一个可以实实在在运行、真真切切感受的RPG了。不过现在的她才刚刚学会走路,还需要你用大量的营养来浇灌。这样就可以使她迅速成长,变的更加美丽动人!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值