分享
 
 
 

怎样在游戏设计制作中实现脚本控制

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

一个游戏引擎做好了,最重要的是缺什么?脚本。打个比方,游戏引擎是一部电脑,则脚本就是电脑的软件。既然脚本这么重要,那该怎样实现呢?下面我就来说说我的做法。

首先理解一下消息循环

一个好的游戏离不开好的消息循环。它是游戏实现很重要的一部分。下面我就来说说我的游戏《宿命传说》的做法。

首先,我定义了一个全局变量extern int GameState;

在游戏中定义了许多当前的游戏状态例如

#define GAME_STATE_CUSTOM 0 //这代表在战斗中玩家可以控制游戏

#define GAME_STATE_TALKING 1

等等。

好了,下面在WinMain里面的while(1)循环中有个UpdateScreen()函数

原型为

void UpdateScreen()

{

延时

switch(GameState)

{

case GAME_STATE_CUSTOM:

画出地图

画出所有精灵

画出天气(如果有的话)

如果玩家选中了敌人的话(打个比方DrawFlag=DrawEnemyState)就显示敌人的移动范围和敌人状态

break;

case GAME_STATE_TALKING:

GameDialogProc();

break;

case GAME_STATE_SCRIPTCONTROLLING:

ScriptControlProc();

break;

….//其他的消息在这里处理

}

将缓冲表面的图象显示到屏幕;

}

每个游戏状态都需要一个独立的函数来写。这样在每次切换游戏状态时都不会出现无法处理的情况。

在处理键盘消息的时候我也用一个个独立的函数来写

如处理回车键我用了 KeyReturnProc()来控制

在这个函数里同样也少不了switch(GameState)这一句,为什么?

答案很简单,比如说在精灵行走时回车键就没有用,这是我没有处理精灵行走这个状态的键盘消息。而在战斗场景里按下回车键,如果有精灵在选择框里的话,就会处理相应的东西。

例如选择了敌人则使DrawFlag=DrawEnemyState;这样在更新屏幕时就会画出敌人的移动范围和状态。

明白了吗?好了,如果你明白了消息循环的原理,下面的东西就很容易理解了。

下面谈谈脚本控制

要实现这个,就必须在UpdataScreen()这个函数中拦截一个“脚本控制”的消息,并调用相应的处理函数:ScriptControlProc();

那么怎样得到“脚本控制”这个消息呢?

我是这样约定的:新游戏-调用脚本

"战斗结束"-调用脚本

“前往下一个地点”-调用脚本

好了,就只有这几种情况下才调用,调用脚本的函数为BeginScriptControl();

这个函数做了三个工作:

1.首先读取舞台(场景)角色的数据(没一关都是一个不同的舞台)

2.打开脚本文件(注意要用全局的文件指针)(虽然我在源程序中没直接打开,但是原理是一样的)

3.将游戏状态设定为“脚本控制”以便在下一次UpdateScreen()中调用的是ScriptControlProc();(怎么样?知道消息循环的作用了吧?)

ScriptControlProc()这个函数其实也很简单:

读取脚本文件中的参数直到文件结束

读取脚本文件需要一个解释脚本的函数LoadParam(FILE*fp);

这个函数负责解释脚本中的东西:是函数调用还是函数参数

然后找到相应的函数执行即可

比如说脚本里有一段代码MovePlayerTo(1,1,1);

意思就是把第1个玩家移动到1,1处

怎样做呢?

我是按照以下几步做的

1.保存当前的游戏状态

2.把当前游戏状态设定为“移动精灵”

当引擎得到“移动精灵”这个函数后,在UpdataScreen()中调用的是

MoveRoleProc()这个函数

当移动结束后,MoveRoleProc()调用EndMoveRole(),这个函数的作用就是

读取先前的游戏状态

怎么样?又回到读脚本了吧?记住在移动角色的时候脚本文件的指针没有改变,

所以回到读脚本的这个函数后不是重新读取而是继续读取!

同理其他的脚本指令如LoadDialog也是一样的道理!

当文件要结束的时候,别忘了告诉引擎该停止了,这时候我们必须更新游戏状态

脚本里的SetGameState就是负责这项工作的。

好了,先讲到这里,如果你有什么不明白的地方请联系我

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有