随笔 - 119  文章 - 290  trackbacks - 0

博客搬家了哦,请移步
叫我abc

常用链接

留言簿(12)

随笔分类

我的博客

搜索

  •  

积分与排名

  • 积分 - 301936
  • 排名 - 84

最新评论

阅读排行榜

此前曾思考过脚本如何同程序结合,虽然有所悟,但却发现连惯的执行某个脚本的时候,某些指令要挂起游戏的行动逻辑,比如TALK,在anykey按下前,整个场景都不能控制,而必须关注在人物对话上。
这里所说的行动逻辑,是指类似于ACT游戏的主逻辑/主循环,没有对话,没有菜单,也没有脚本。

先声明一个常用的术语,windows_game_loop(简称wgl),也就是windows下常用的游戏主循环代码:
while(run_game) {
  
while(PeekMessage) {
    
  }

  
if (actived) {
    impl_game_loop();
  }

  
else  WaitMessage();
}

好了,看看圣剑2所透露的RPG基本模块:
1,行动逻辑,也就是主循环game_loop,是一个wgl;
2,主菜单,CMenu类,包含状态,物品,魔法子系统。它的run()是一个wgl,因此菜单启动后,能够挂起行动逻辑;
3,脚本系统,会连惯的执行一个脚本文件;
4,消息队列,并不是winproc,消息队列每次每帧只执行一条消息,每帧并不能保证能完成执行,所以下一帧还会执行相同的动作,直到完成并删除该消息。重要的是,只要消息队列非空,就不会执行行动逻辑,暂时挂起它;
5,战斗系统,包含fight_menu,fight_good,fight_magic之类的东西,类似于一个mini_game。它的start()函数,是一个wgl;
6,对话系统,将由脚本系统和消息队列协作完成,对话时要挂起行动逻辑;

看行动逻辑,主菜单和战斗系统,它们都是wgl,因此可以单独封装成game_moudel,并注册到game_system下,由它驱动执行。

行动逻辑是非战斗时的逻辑,主要内容是控制player的运动,还有当player面向某个NPC并按下“对话键”后,触发该NPC执行其脚本。行动逻辑只能在空消息队列时才执行,这很重要。

对话系统。连续的对话,来源于NPC的脚本。NPC的脚本一口气的执行,但是对话必须一步步等待交互的来,如何做到?圣剑的解决方案是把对话指令转成消息,并放到消息队列中。
消息队列在wgl中挂起行动逻辑,使得player关注到对话上。消息队列执行一个NPC_TALK/PLAYER_TALK命令,显示对话文字,每帧不断的重复,直到player按下anykey,消息队列删除该消息,执行下一条消息,也许是NPC_TALK/PLAYER_TALK,这样对话就得到了延续。
看这样一个对话脚本,其中每个command都变成消息加入到消息队列,自然就能挂起行动逻辑完成对话了:
NPC_TALK "Hello, My friend"
PLAYER_TALK 
"Hello, What's up"
NPC_TALK 
"Maybe you need a sword"
PUT_ITEM sword
TALK 
"You get a sword"

但是,消息队列并不能很好的解决含选择项对话的问题,因为不期望脚本被阻塞(多数是由于图形引擎结构引起,不希望把刷新挂进某个函数内,虽然可以这么做),比如:
ret = NPC_CHOISE("You are Saber?" ,"YES" ,"NO")
if (ret == "YES")
  NPC_TALK 
"Hello, Saber"
  NPC_TALK 
"I think you need a sword"
  PUT_ITEM sword
  PLAYER_TALK 
"Thanks"
else
  NPC_TALK 
"Oh, byebye"
end 
if
以上,就是队列不能解决的脚本···除非NPC_CHOISE是一个wgl
posted on 2006-12-25 11:03 LOGOS 阅读(1249) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理