易码技术论坛

 找回密码
 加入易码
搜索
查看: 451663|回复: 11

[工具] [下载]动物园历险引擎学习器

 关闭 [复制链接]
发表于 2004-11-13 22:02:00 | 显示全部楼层
不错,好贴呀!
发表于 2004-11-14 16:15:00 | 显示全部楼层
说明。TXT好象有问题
 楼主| 发表于 2004-11-29 12:18:00 | 显示全部楼层
什么问题?
发表于 2004-12-9 01:28:00 | 显示全部楼层
恩!支持一下.。[em01][em01][em01]
发表于 2005-2-8 21:58:00 | 显示全部楼层
不错
顶~~
这是个经典
发表于 2007-6-23 18:35:49 | 显示全部楼层
dddddddddddddddddddddddddddddddddd
发表于 2007-6-23 19:28:24 | 显示全部楼层
很不错的引擎!!!
发表于 2007-6-25 21:21:53 | 显示全部楼层
引用第6楼tuyang2007-06-23 18:35发表的“”:
dddddddddddddddddddddddddddddddddd

汗。。。
要注意啊
你又挖老贴
又严重水
挺恶劣

等版主们来了就不好了
发表于 2007-6-25 21:39:19 | 显示全部楼层
引用第8楼behaizi2007-06-25 21:21发表的“”:


汗。。。
要注意啊
你又挖老贴
.......
有这么个意思。。。
发表于 2007-6-25 21:53:50 | 显示全部楼层
甭管啥意思
顶一下先
发表于 2007-6-26 10:13:08 | 显示全部楼层
帖子很老了,先锁上了.掘尸者已处决.
 楼主| 发表于 2004-11-3 17:37:50 | 显示全部楼层 |阅读模式


很早以前自己做的,没想到这台机器还存着,所以就发上来了

请到我的网站:WQX.0575.COM(星文联盟)
按键说明:
方向:移动
wsad:跳转地图
空格:查看屏幕信息
Q:游戏系统

配合下面的文章学习
RPG引擎原理讲解
杨芹勍[Coolsoft(R)]

   当我在发布“动物园历险记”之前,我在许多文曲星网站都发了游戏的剧情、内容和规模预告的帖子。可想而知,当你在没有玩这个游戏的时候肯定也不会相信GVBasic能处理那么复杂的剧情。和大家一样,那些回帖的人都说不可能有那么强的引擎能撑得住。但是当游戏发布时……这主要是归功于我花了一个星期才研究出来的“对象处理思想”。这个思想的用途是处理RPG剧情的前后关系。首先试用在《逃离校园》上,然后是《医院惊魂》,最后才与《动物园历险记》玩美地结合。如果想知道这个思想的具体函意,请往下看。
这个思想的灵感主要是来源于PC上许多编程软件的“面象对象”的思想。它可以把一个窗体、一个控件、一段代码等都看成是一个对象,每个对象都有自己的属性、事件和方法。一个对象可以激活另外一个对象,同时也可以终止一个对象。同样,文曲星屏幕上任何一个图形都可以看成是一个对象,这就是所谓的“对象处理思想”。当然我们并不是把屏幕上每个图形都看成是一个对象,而是处理一些和剧情有关的图形,那些图形所包含的信息就是我们要处理的剧情。我们可以把信息保存在数据文件里面,然后在主程序里面处理它们,这样就节省掉很多主程序的字节。

1、剧情信息格式
   大家在地图安装文件“ZOOSC.BAS”里面是不是发现许多形如“ABTBCMBSA”这种奇怪的字符串?这就是地图上面的对象所包含的信息。下面让我们来详细分析一下这些信息所保存的格式:
   首先,我们令A等于1,B等于2……Z等于26等等(用ASCII码表示就是CHR$(T+64),T=1,2,3……),为什么要那么做呢?是因为由于RPG包含的元素很多,如果这些元素大于或等于10的话处理起来会很麻烦,且保存起来很不方便。等一下你就会理解啦!
   然后来看一下剧情信息包含的元素和保存的格式:
   屏幕X坐标 屏幕Y坐标 条件 条件值 字幕 处理1 处理值1 处理2 处理值2
   一共有9个元素,每个元素占位一个字节。
   “屏幕Y坐标”就是屏幕上的1~5行,“X坐标”与我们平常习惯的不同,它算的是汉字的相对坐标,如果在屏幕上有一行字“一二三四”,那么“三”的实际X坐标是5,相对坐标是3。
   “条件”就是你要实现这个剧情需要的条件识别符,如用“L”代表等级、“S”代表道具。“条件值”就是条件所对应的值,如多少等级、什么道具。如“SA”表示条件为必须要有第一个道具(“A”代表“1”!)剧情才能继续。
   “字幕”就是你完成某个条件以后屏幕上弹出的对话字幕。通常RPG有很多人物对话,由于“字幕”这个元素只占一格,如果用1、2、3来表示那么只能有9条对话。那怎么行啊?所以我们可以用A、B、C~~代替。“~”的ASCII码值为126,那么从“A”~“~”中间有64个空位,比9大多啦!现在你可以理解为什么用这些东西代替了吧!
   “处理”和“条件”大同小异,只不过“处理”是得到什么东西而不是条件那样需要什么东西罢了。
   注意:在这些元素中不是每个元素都会用到,如果不用的元素请用“@”代替,因为“@”代替“0”。
下面让我们来看看一些常规的“条件”和“处理”分别对应的识别码。
条件:
H:有某道具;
L:达到多少等级;
T:几点钟;
Z:需要某特殊剧情;
N:不需要某特殊剧情。
处理:
C:跳转地图;
M:遇到某敌人;
S:得到某道具;
Z:处理某特殊剧情。
   什么叫特殊剧情呢?特殊剧情就是指不改变玩家状态(道具、时间、等级),而只改变游戏进度的剧情。如在动物园历险记中,一开始有个小孩,你必须请教他才能钻狗洞进动物园。而你请教那个小孩,没有改变你任何状态,它只会给一个特殊变量附值,表明已经问过了。然后到狗洞前信息会引导程序去判断这个特殊变量的值,看看你是否问过小孩。如果小孩对应的处理信息为ZA,那么狗洞对应的条件信息为ZA。如果你想搞一个问过小孩就不能进狗洞,那么狗洞对应的条件信息应改为NA。
   大家在玩动物园的时候肯定会有进某所房子或出某所房子的时候。这就是跳转语句起的作用。每一个跳转值都对应一个跳转字符串,这个等一下再说。
下面我们来进行举例分析:
   在屏幕的第一行、第三格有一个图形,碰到它会遇到一号敌人,会出现第二个对话,打赢了得到第三个道具,怎么表示?很简单:CA@@BMASC。注意,由于没有条件,条件那两栏用@填充。
   如果有某种道具时显示一段字幕,没有时显示另外一段字幕时怎么表示?这时,我们应该把符合条件的字幕放在“处理值2”栏目里面,把不符合条件的字幕放在“字幕”栏目里面。打个比方,在屏幕上第四行、第五格有一个图案,碰它需要有第二个道具,如果有则显示第二段对话,且得到三号道具,没有则显示第三段对话:DESBCSC@B。注意,如果使用了这种信息的格式就不能使用处理元素2。
   如果一幅地图里面有多个图形关系到剧情,那么可以把这些信息连起来,如“AB@@CCM@@CD@@DSA@@”,表示在地二行第一格和第四行的第三格都有剧情信息。注意,每一幅地图中所包含剧情信息的图形不能超过7个,否则引擎程序会出错!
   2、跳转信息格式:
   好了,了解了剧情信息格式之后,让我们来了解一下前面提到的“跳转地图”的含意。动物园一共有9*10幅地图。底下两行存放的是室内的地图,上面则存放的是外景地图:

──门─│┌─植─
─猴└─停│┌┬虎
┌┴─熊│└饲└┐
│游┌─水┐─出┘
└┤│鸟─┤┌─┐
鳄│卖┬─│└┐厕
│桥─┤象┴┐入│
医──饭──办─┘
*********
*********

   同样,我们把整个地图看成是一个大集合,每一幅地图看成是一个元素。比如说,把“门”这幅地图看成是一个元素,它在大地图里的第二行的第三格,一行一行地数,每一行有九格,那么它在集合里为第十二个元素,再取元素号+32的ASCII码值(注:这里有别于前面的+64,因为RPG地图很多,127-64幅地图远远不够),再加上需要跳转到的那幅地图的屏幕X、Y轴坐标就可以啦!如“ABC”代表第33幅(“A”对应65号ASCII码,65-32=33)地图屏幕上第三行的第二格。由于RPG的跳转信息很多,所以我们可以在安装程序中拿一个字符串一个接一个地保存跳转信息,把第一个用“A”代替……如:“ACDBEFJIC”为跳转信息字符串,那么第二个跳转信息为“BEF”,在剧情信息中可以用处理值“CB”来实现。

实例请叁看ZOOSC.BAS中第140~150行。

   3、地图的制作与显示:
   不止十个网友问我:为什么动物园的地图显示得那么快?而且还是在助手里面。答案是我在安装时就生成好了地图保存到随机文件中,玩的时候马上读出来整屏显示,浪费了安装时间而节约了游戏时间。看看ZOOSC.BAS的第170行到180行,这里保存了所有地图要用到的图形的总集合,把地一个图形命名为“A”……再在底下的数据中写下“ABSEHD...”之类的50(文曲星每一屏只能显示50个图形)个字节就可以了。如何让地图数据和剧情信息相结合呢??那么你就在地图数据上后面加一个“,”号,在加上剧情信息就可以了。如:

DATA "ASCDVDFEFGGGGBVVVFFFCCDAAAAACDFVGGDAAAAABBBFFAASAQ","AB@@CSA@@"

注意,如果一幅地图上没有一个图形和剧情有关,那么请用“@”代替剧情信息,引擎程序会自动识别,千万不能空着!

   由于我们是把地图先生成好再用随机文件形式写进文件(详见ZOOSC.BAS的第250行到第300行),所以在主程序中我们可以用随机文件的形式打开,令其长度为100,然后100个字地读取数据,在用余兄的批量法显示到屏幕上。由于NC系列和PC2ka系列不支持批量法,你可以用以下方法显示地图:

假定MP$为从地图文件读取的长度为100的字符串变量。

LOCATE 1,1RINT LEFT$(MP$,99);
POKE 803,ASC(MID$(MP$,100))
PRINT ;
万事大吉!这个方法对所有机型都试用,只不过速度比批量法稍微慢一点。

4、人物对话保存方法:
   在安装程序ZOOSA.BAS和ZOOSB.BAS中,大多数保存的都是人物对话,人物对话可以用DATA来保存和READ读取,详见ZOOSA.BAS。如果想实现两个人的对话,请在第一个人的话后加上一个“*”号,然后再加上第二个人的话。这样,引擎会在显示玩第一句话时停着,再显示下一句话。如果你觉得如果对话写不满的话,你可以重新写一段对话,然后在上一句对话的末尾加上这一句对话的索引号(A、B、C……),引擎会分析并且跳到这段对话来。

5、游戏引擎详解:
   激动人心的时刻到了!大家打好前面关于数据剧情方面的基础后,引擎方面就不成问题了!如果你想用我这个引擎发布RPG,你只要写数据文件,只改一点点引擎就可以做出很个性化的RPG,大家看好了!

在这里,我要以最稳定的“动物园历险记”的引擎ZOO.BAS做为叁考,请大家准备好。
打开ZOO.BAS,跳到第9510行,我们先看看变量的含义。
S$~屏幕内容字符串,用批送法声明;
MS$~剧情信息分析变量,用于玩家碰屏幕上的图形时存放当前图形所包含的剧情,长度为7,不包括X、Y坐标;
NG$()~游戏介绍字符串组,用于新游戏时介绍游戏起因;
WD$()~道具名称字符串组;
WI$()~道具图标字符串组;
DD$()~敌人名称字符串组;
DI$()~敌人图标字符串组;
S$()~人物对话(就是前面说的字幕)字符串组;
FN$()~剧情信息字符串组,引擎开始时会读取数据文件放到此字符串组中;
DD()~敌人生死状态数组,0代表生,1代表死;
MT()~玩家道具状态数组,0代表未找到,1代表未使用,2代表已使用;
MZ()~游戏特殊剧情处理数组,前面讲过的,如果符合条件就把这个数组里的某个变量存为1,然后由程序来读取该变量是否为1;
MX:玩家在屏幕上的相对X坐标;
MY:玩家在屏幕上的Y坐标;
MP:玩家所在地图为地图集合里的哪一幅地图;
MLV:玩家等级;
MEX:玩家经验值;
MB:玩家血量。

……

重要的处理代码对应的行号:

20:按键响应子程序;
150:人物对话(字幕)显示子程序;
400:道具列表及道具的选择和使用子程序;
2500:遇敌战斗和升级的子程序;
4600:游戏通关画面及评论代码;
5000:游戏开始标志;
5110~5240:玩家移动控制代码;
5230:随机遇敌代码;
5250~5320:剧情信分离代码,它可以把玩家人物碰到的图形的剧情信息分离出来,由于玩家碰时以确定了XY坐标,所以分离出的信息不含XY坐标元素;
5330~5720:剧情信息分析代码,用于分析我们前面提到的具有相同格式的RPG剧情信息;
5840:地图的读取以及显示代码;
5880:系统菜单选项代码。
好了,下面就让我们来分析一下这些代码中的重要的代码。这可能会让你很晕,但是,为了做出好玩的RPG,晕一些也无所谓了

先来看一下剧情分离代码,从5250行开始。先了解一下原理。由于每一幅地图对应相应的剧情信息(包括“@”空信息)保存在数据文件里,进入引擎一开始会读取它,且每一幅地图的剧情信息用FN$()这个字符串组来保存,由于每一幅地图对应相应的FN$,所以很容易可知道玩家所在地图的FN$,再加以分析就可以了。引擎不是玩家每走一步都判断一次,这样会慢得让你发晕(像天之剑一样),而是如果玩家碰到了障碍物时才读取相应的信息判断。那么如何从该地图的剧情信息中分离出该障碍物所对应的剧情呢?前面我们讲过剧情信息保存的格式,为9个字节,一个连一个地组成该地图包括的剧情。这样,我们可以先读取FN$()前面两个XY的值,看看与玩家所在XY坐标是否相符,如果不相符则跳过这个剧情信息再读取下一个信息的XY,直到相符为止。如果读玩了整段信息还没有找到与玩家XY相同的坐标,BEEP,表示玩家所碰到的图形与剧情无关。

下面来看看代码:

5250 FOR T=1 TO LEN(FN$(MP)) STEP 9

5260 IF ASC(MID$(FN$(MP),T))-64<>TX THEN 5280

5270 IF ASC(MID$(FN$(MP),T+1))-64=TY THEN LSET MS$=MID$(FN$(MP),T+2,7):5300

5280 NEXT

5290 GOTO 5170

5300 TJD=ASC(LEFT$(MS$,1)):TJ=ASC(MID$(MS$,2))-64:SH=ASC(MID$(MS$,3))-64

5310 CLD1=ASC(MID$(MS$,4,1)):CL1=ASC(MID$(MS$,5))-64

5320 CLD2=ASC(MID$(MS$,6,1)):CL2=ASC(MID$(MS$,7))-64

5210~5220行为判断信息中的XY值与玩家所碰的XY是否相等,等的话给临时信息字符串MS$赋除了XY信息之外的其它7个字节信息值,注意这里要用到“LSET”。原因是你用常规方法给一个字符串重新赋值后,GVB会重新分配缓冲区保存且不清除原来的值,多次之后会影响到其它固定的变量的缓冲区,导致其它变量的变化。就像“逃离校园”和“医院惊魂”那样玩久了会出乱码一样。而用LSET可以不移动缓充区直接在原来的缓冲区写。

下面来介绍一下5300行到5320行变量的意思:

TJD~条件标识对应的ASC数值;
TJ~条件值;
SH~字幕值;
CLD1~第一个处理标识对应的ASC值;
CL1~第一个处理值……
注意:在动物园的测试版中,标识符用字符串变量代替,在正式版改为用数变量代替,原因以经讲过了,就是为了防止缓冲区溢出。

从5330行开始就是剧情分析代码了:

5300:分析特殊剧情条件;
5370:分析等级条件;
5375:分析需要某道具的条件;
5420:分析时间条件(如在动物园中不到时间不能进水族馆);
5430:分析没有某特殊剧情的条件……
只要你把标识值变成对应的ASCII码,你就可以知道是什麽意思啦!
那麽进小卖部、芝麻开门怎麽写呢?你只要先把这些代码写入引擎,在用特殊的标识符写进剧情就可以了。如5520~5560行。
从5590~5650行为跳转地图的处理代码,注意读取跳转地图信息时为3个字3个字地读出来(5600行),在加以分析。
让我们再来看看引擎刚开始所需要读取的东西,看9500~9640行。
9530:声明批送法和向缓冲区申请7个字节的剧情分离变量MS$;
9540~9545:声明变量;
9550~9630:读取游戏相关信息,道具图标、道具名字、敌人图标、敌人名字、游戏介绍、人物对话、地头蛇对话、芝麻开门、剧情信息、跳转地图信息。
读取这些东西按照先後顺序附与标识值,如一号道具的图标为WI$(1)。
9640行为用随机方式打开地图文件,因为一个屏幕可以放下100个字符,所以可以令它的读取长度为100,然後100个字100个字地读取任何地图显示到屏幕上,这就是随机文件的好处。这个文件不要关闭,便於可以在程序里面随时读取。

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-19 19:43 , Processed in 0.011415 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表