On The Road
圣光之下,先知说: 不要写程序; 写小程序; 别把程序写大。
C++博客
首页
新随笔
联系
聚合
管理
随笔 - 92 文章 - 206 trackbacks - 0
<
2006年12月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
《GAME PROGRAMMING GEMS6》读书笔记(4)
《UNIX编程艺术》读书笔记(4)
month-flow(2)
mysql入门(3)
垃圾收集(3)
随笔档案
2009年7月 (1)
2009年6月 (1)
2009年5月 (1)
2009年4月 (2)
2009年3月 (3)
2009年1月 (2)
2008年11月 (1)
2008年10月 (3)
2008年9月 (11)
2008年7月 (2)
2008年6月 (1)
2008年5月 (2)
2008年4月 (1)
2008年3月 (1)
2008年1月 (1)
2007年11月 (5)
2007年10月 (1)
2007年9月 (2)
2007年8月 (1)
2007年7月 (2)
2007年6月 (1)
2007年5月 (2)
2007年3月 (1)
2007年2月 (2)
2007年1月 (2)
2006年12月 (5)
2006年10月 (6)
2006年9月 (4)
2006年8月 (8)
2006年7月 (6)
2006年6月 (6)
2006年5月 (5)
技术
梦想风暴
千里马肝
云风
朋友
Innocence Space
搜索
积分与排名
积分 - 104348
排名 - 28
最新评论
1. re: month-flow[6]
同一个模块的话,还不如委托来得实际。。
--guest
2. re: 乌班图 ubuntu
评论内容较长,点击标题查看
--LOGOS
3. re: 乌班图 ubuntu
评论内容较长,点击标题查看
--abettor
4. re: 在lua脚本中使用unicode
@xiaoxiao
脚本保存为utf-8更好
--LOGOS
5. re: 在lua脚本中使用unicode
函数名字应该是mb_to_utf16吧
--xiaoxiao
阅读排行榜
1. 如何在游戏机制中使用AI/剧情脚本----基于LUA(2587)
2. 乱谈CEGUI(2583)
3. 垃圾收集的那点事(A)(2330)
4. 聊内存池技术(2322)
5. 高效调用lua函数(2222)
评论排行榜
1. 通用网络消息包(12)
2. wxWidget的HelloWorld(10)
3. MVC模式理解——当年给我一个browser多好(10)
4. 滥用assert(10)
5. 谈谈不一样的singleton(9)
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
阅读(856)
评论(0)
编辑
收藏
引用
标题
姓名
主页
验证码
*
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
.NET频道
博客园社区
闪存
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理