登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
  立华软件园 - 安全技术中心 - 技术文档 - 入门基础 技术文章 | 相关下载 | 电子图书 | 攻防录像 | 安全网站 | 在线论坛 | QQ群组 | 搜索   
 安全技术技术文档
  · 安全配制
  · 工具介绍
  · 黑客教学
  · 防火墙
  · 漏洞分析
  · 破解专题
  · 黑客编程
  · 入侵检测
 安全技术工具下载
  · 扫描工具
  · 攻击程序
  · 后门木马
  · 拒绝服务
  · 口令破解
  · 代理程序
  · 防火墙
  · 加密解密
  · 入侵检测
  · 攻防演示
 安全技术论坛
  · 安全配制
  · 工具介绍
  · 防火墙
  · 黑客入侵
  · 漏洞检测
  · 破解方法
 其他安全技术资源
  · 攻防演示动画
  · 电子图书
  · QQ群组讨论区
  · 其他网站资源
最新招聘信息

制作手札---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了。不过现在的她才刚刚学会走路,还需要你用大量的营养来浇灌。这样就可以使她迅速成长,变的更加美丽动人!

我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 制作手札---RPG是怎样做成的 (三)

 ■ [欢迎对本文发表评论]
用  户:  匿名发出:
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。

最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接  
Copyright ©2001-2006 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00192