作者NDark (溺於黑暗)
看板GameDesign
标题[心得] 沙漠商旅C的游戏设计(4)
时间Thu Mar 18 17:58:10 2010
作者:NDark
时间:201001
沙漠商旅C的游戏设计(4)-主流程与事件
http://wp.me/pBAPd-b3
游戏主流程说明
主要流程在stage paragraphing已经说明过了。这边针对比较值得一提部分再详细说明。
1.FPS计算:计算FPS以及检查目前FPS状况作出相对应的反应。
2.网路处理:未完成预留。
3.3D动画:未完成预留。
4.更新位置:依照物体的速度更新物体的位置,当然是传入了FPS
5.2D动画:未完成预留,保留给Sprite Engine。
以上三个流程是在进行动画的部分,
之所以网路放在更前面是希望先得到动画状态有没有改变。
6.输入事件:也就是InputHandle函式
这里检查滑鼠左键,右键,滑鼠目前位置(滑过),键盘按键等事件。
这些事件是从windows form的事件中产生进来游戏流程的。
如同我们在stage paragraphing中所提到的,内部都是以stage分段。
这些输入事件除了比较特别的之外,
大多使用点选系统检查有无点选到2D或3D场景。然後呼叫gLeftClickOnUID()函式。
gLeftClickOnUID函式的功用是列出并检查所有会被点选到的物件然後进行事件的触发。
这是我在事件处理该节说明沙漠商旅C是三层式的原因。
7.碰撞侦测:在物体都更新完毕之後来检查碰撞侦测。
目前沙漠商旅C有作的碰撞侦测很简单,只有算距离。
判断城市与商旅有无碰撞,触发进入城市的事件。
判断商旅与商旅之间有无碰撞,触发进入战斗的事件。
我不进一步撰写碰撞侦测的原因也就是这是一般游戏引擎应该要有的基本功能。
8.环境变化(读档,游戏事件处理,更新3D视野,更新2D选单)
事件触发完毕之後,会进入环境变化函式,依据不同的stage会有不同的工作要作。
最重要的是在初始/进入其他模式的阶段进行资料读取的动作。
第二个最重要的工作就是处理游戏事件。这里已经在事件处理该节描述过。
此外环境变化还负责像是战场胜负判断,游戏时间进行检查,
更新3D视野(如同前述,这个步骤已经简化为让摄影机依据目标来自己移动),
更新选单(依据目前的stage与启动的选单来检查是否有资料要更新)等工作。
9.人工智能:
虽然AI是我很有兴趣的一个部分,
但是目前沙漠商旅并没有针对这块流程进行开发。
因为没有AI虽然使得游戏有缺陷,但是整个游戏还是可以动起来。
目前沙漠商旅有建构一个简易的AI平台,用来纪录玩家角色与电脑角色的行动顺序。
我希望未来能有机会完成一定程度,让电脑角色会动会攻击。
10.绘图前处理:可能要做一些处理让不用画的物件关闭(未完成预留)。
11.绘图:设定3D视野,画3D物件,设定平面视野,画2D选单
游戏事件架构与扩充
虽然有关游戏事件已经在事件处理该节讨论了,
这边把整个架构再说明清楚,并且说明扩充时候要作的事情
在沙漠商旅C的事件处理如同前述是一个事件的串列。
事件处理时用一个while回圈与switch所组成。
while( 还有未处理事件 )
{
EventNow = EventList.front() ;
switch( 事件type )
{
case event_1 :
...
break ;
case event 2 :
...
break ;
}
EventList.pop_front() ;
}
系统与特色
事件处理的一个目的是集合不同的触发,达到相同的结果。
举例来说CME_ChangeState_StudioLogo就是进行自工作室宣告页切换下一页的事件。
虽然这个动作十分的简单但是,如果不这样设计,会变的十分不容易维护。
因为这个换页的动作可能是由很多地方所驱动
1. 滑鼠按任何钮:左键 右键
2. 键盘按任何键:全部按钮
3. 一个计时器,当工作室宣告出现一定时间,如1秒并fade out之後。
有了这个事件,我们就在以上这三种区域撰写事件的触发。
if( IE_TYPE_KEY == InputType )
{
switch( gpSystem->m_eGameStageNow )// 当然要检查一下stage
{
...
case GS_Stage_PreMainMenu :
{
...
// 假如工作室选单是开启状态,这个key会产生一个换工作室页的事件
if( true == gsMenuManager.GetStateActiveByName( STATE_StudioLogo) )
{
gEventAdd( CME_ChangeState_StudioLogo ) ;
}
...
而滑鼠与键盘也相同。
事件处理的内容就可以写在同一个地方,避免分开维护。
有些事件携带了一个变数,
譬如说按下读档清单的第几格产生了事件
gEventAdd( CME_ChangeState_LoadSlot , i ) ) ;
事件 第几格
事件处理的时候就要取出到底是要读第几个存档。
有些事件携带了不只一个变数,
譬如说打到敌人这个事件CME_Battle_HitEnemy就携带了
谁被打到 与 伤害值 两个变数。
携带的变数基本上是看事件需求而定,而基本上不会弄错,
要使用事件的时候当然会知道这事件带几个参数,
就跟硬体指令一样开发时必须列出清单让团队的人员都清楚。
另外某些事件造成的影响有时候必须经由某些变数存起来,
等待到选单或是某些流程执行的时候才使用,
这种变数资料暂存的机制也必须要谨慎分配清楚,
避免程式时期使用到相同变数的情形。
譬如说读档清单假如可以显示好几页,
那麽就会有一个变数SlotIndex是纪录目前第一个栏位是存档清单的第几个。
按下上一页时(事件),这个变数就会减少。
使得显示选单的时候会在第一栏位的空间显示SlotIndex的存档资料,以此类推。
同时真正读取该栏位确定时,如读取第三栏位,则真正读取的存档当然是
存档阵列中[ SlotIndex+3 ]的内容。
因此这个变数同时会影响到 控制 显示 读取(流程) 三个部分。
有关於事件的扩充,在沙漠商旅C中会需要作以下几件事情。
1. 在GameEvent.h中宣告这个事件
2. 事件发生,如果是一个新的选单按钮则在UIDDefine.h要新增这个选单
3. 在InputHandle()中撰写事件发生的程式
4. 在EventHandle()中撰写事件处理的程式
5. 用break point检查这个事件有没有被正确触发
6. 用正常模式检查事件触发的反应是否正确,如否,用break point再去各地检查。
有点罗唆是真的,尤其是当事情发生在不同地方的时候XD。
--
"May the Balance be with U"(愿平衡与你同在)
视窗介面游戏设计教学(
http://0rz.tw/V28It ),讨论,分享。欢迎来信。
视窗程式设计(Windows CLR Form)游戏架构设计(Game Application Framework)
游戏工具设计(Game App. Tool Design )
电脑图学架构及研究(Computer Graphics)论文代读(含投影片制作)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.96.77.176
※ 编辑: NDark 来自: 140.96.77.176 (03/18 17:58)
1F:推 silveriii:推! 03/18 21:26
2F:推 silveriii:再推一次XD 03/20 20:06