On The Road
(cond ((less 'code) (less 'bug)))
C++博客
首页
新随笔
联系
聚合
管理
随笔 - 119 文章 - 290 trackbacks - 0
博客搬家了哦,请移步
叫我abc
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(12)
给我留言
查看公开留言
查看私人留言
随笔分类
《GAME PROGRAMMING GEMS6》读书笔记(4)
《UNIX编程艺术》读书笔记(4)
month-flow(5)
mysql入门(3)
垃圾收集(4)
我的博客
叫我abc
博客搬家啦
搜索
积分与排名
积分 - 301936
排名 - 84
最新评论
1. re: C++ std::fstream open mode
i'am got
--hdj
2. re: cppcheck的使用
你好,你会使用cppcheck吗?@robert
--wqq
3. re: 垃圾收集的那点事(H)
非常感谢
--7Qing_
4. re: 高效调用lua函数
为什么提示没有findLuaItem这个函数?
--sdfasf
5. re: android ndk调试知识[未登录]
博主你好,请问如果没有.so的源代码,应该如何进行arm的汇编级调试呢?
--dennis
阅读排行榜
1. cppcheck的使用(16932)
2. 十步精通新语言(10624)
3. 内存池实现(9864)
4. 高效调用lua函数(9201)
5. 在lua脚本中使用unicode(8157)
RPG程序框架探讨
此前曾思考过脚本如何同程序结合,虽然有所悟,但却发现连惯的执行某个脚本的时候,某些指令要挂起游戏的行动逻辑,比如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)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理