发信人: bb_boy()
整理人: nhyjq(2003-01-05 15:50:42), 站内信件
|
游戏制作之我见----我的RPG制作之路(八)
天眼
========================================================
条件分支我们可以采用类似汇编语言的方法,在解释机内设
置一个判断专用的标志变量(if_flag),根据if(...)括号内的
表达式设置这个变量。然后then(....)再根据这个变量的值决定
是否转向括号内指定的标号行(这些都是在前面讲过的函数 val
里实现),如:
if(cur_x<10) //条件成立设置判断标志为1,反之为0
xxxxxx
xxxxxx
then(label1) //判断标志位为1则转向label1否则继续
xxxxxx
xxxx
:label1
xxxxxx
我们在读入脚本进内存时时,同goto一样也要将then括号中
的标号转变为相应的行号。
这样我们就可以和汇编语言一样,结合其他变量实现循环。
s1=0 //给循环记数器设置初值
:label1
xxxxxxx //需要循环执行的语句
xxxxxx //需要循环执行的语句
s2=s1*10 //需要循环执行的语句
xxxxxx //需要循环执行的语句
s1+=1 //循环记数器自动增加
if(s1<10) //判断循环是否结束
then(label1) //如果没有结束跳转到label1
xxxxx //如果结束了继续执行下面这些行
另外还要说明的一点是,在RPG游戏时我们经常会遇到弹
出有多项选择。比如说在买东西的时候,会列出多个物品让你选
择。我们把这多项选择也做成函数:
int choose(char *str,int n,char *item,int must)
就拿前面买东西来说,你在一个武器店的地图中放置一个店
老板的NPC,他对应的脚本如下:
say(12,30,"您好,欢迎光临本店!")
:ask //询问您要什么
s1=choose("您要?",3,"买东西 卖东西 不要了",1)
if(s1==0)
then(buy) //跳转到买东西
if(s1==1)
then(sell) //跳转到卖东西
//不买也不卖
say(12,30,"不要了?您慢走!")
end
:buy //买物品
s1=choose("买什么?",5,"匕首 竹剑 钢剑 梭镖 铜锤",0)
xxxxxxxxxx //根据选择的选项s1
xxxxxxxxxxx //给玩家增加物品,减少金钱等等
xxxxxxxxx //
xxxxxxx //
xxxxxxxxxx //
if(s1==-1) //如果选择"买什么"时点了ESC退出
then(buy) //放弃买物品跳转到"您要什么"的选择
goto(ask) //买了一件物品后继续选择要买的物品
:sell //卖物品
s1=chooseobj() //从自己有的物品中选择一样
if(s1>100) //判断物品的种类
then(nosell) //决定是否跳转到nosell
xxxxxxxx //根据玩家选择的物品s1
xxxxxxxxx //减物品,加金钱等等
xxxxxx //
if(s1==-1) //选择要卖的物品时点了ESC键退出
then(ask) //放弃卖物品跳转到"您要什么"的选择
goto(sell) //卖完一件,选择还要卖的
:nosell //不收这种物品
say(12,30,"抱歉,这种东西我们不收!")
goto(sell) //继续选择要卖的物品
这其中的choose函数是我们在游戏程序中实现的一个多项选择的
函数,以s1=choose("您要?",3,"买东西 卖东西 不要了",1)为例
s1内放置的选项号码(第一个是0,第二个是1,依次类推)
"您要?"是多项选择时的提示
3是选项的个数
"买东西 卖东西 不要了"是三个供玩家选项,中间以' '分隔
1是强制玩家必须从这些选项中选择一个,不能按ESC键放弃
选择(此时返回-1给s1),如果是0则可以按ESC键放
弃选择。
另外 chooseobj()也是我们在游戏中实现的一个函数。从玩家的
物品中选择一样,返回它在玩家物品匣中的位置,它在地图行走、战
斗中的物品使用都可以使用。
============《待续》==============
-- 路漫漫其修远兮,吾将上下而求索。
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.100.17.241]
|
|