游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6111|回复: 20

迷茫了,是否要使用数据驱动.

[复制链接]

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2007-2-1 14:25:00 | 显示全部楼层 |阅读模式
刚刚整好图形引擎,开始设计游戏的框架了.
游戏类型,设计目的很明确,但是我却在犹豫是采用半数据驱动,还是采用全数据驱动的框架.

前者开发时间会有些节省,但是同样的框架结构无法应用到其他游戏类型上,最多只能应用与同类型游戏.
后者开发时间/难度会增长,但是却可以应用于一个平台的任意类型上.

第一次做console game,想了解一下,对于console平台来说,是项目开发时间重要,还是底层的可重用性重要?
就当讨论讨论也好,任何看法都好啊....

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
发表于 2007-2-1 16:21:00 | 显示全部楼层

Re:迷茫了,是否要使用数据驱动.

全数据驱动框架。然后给数据结构分层,然后从上到下驱动时,提供手动驱动接口,和完全自动驱动接口。好处多多。

半数据驱动节省不了多少时间的。如果以后做其他游戏,搞不好就因为数据驱动问题,然后重复很多很多工作。

我以前在坛子上贴过底层驱动框架。现在我贴一下高层数据驱动。直接和游戏数模挂钩。
因为正在改数据驱动的结构,现在我已将肖像库的取消了,将肖像和底层模型捆绑在一起。这样比较体现OO思想。

因为还在做ARPG的流程框架,所以这些高层数据很少,只有必须的数据。像力量,敏捷,等等,很多属性没有给。

这个脚本全是常量,传值,基本上没有程序。所以不存在能不能看懂的问题。供参考。望对你引擎有帮助。

//

uses ChrBaseData;

{
角色驱动样板
角色驱动样板是在角色的MDL动画层以上的,直接面向游戏的角色驱动,该驱动为标准样板。
使用方法,先Ctrl+V过来,然后改改名字。可参考ARPG的Demo,来具体了解角色驱动样板

功用:初始化角色的数模,技能,特长,肖像,
如果角色是NPC,还要指定NPC的对话数据,既QA数据源
如果角色是中立,或则敌方,在角色驱动样板中还应指定AI驱动的模块
}

//*****************************************************************************************************
//变量
//*****************************************************************************************************

var
  //TriggerTarget中的类接口
  _Obj:TDummyCube;
  {
  //如果在核心规则的世界编辑环境中驱动(利用核心规则驱动),TargetSource为当前OX目录
  _StreamList:TRULEStreamList;
  
  //如果是使用核心规则的,LoadModelFromStream,那么TargetSource则是空
  //如果是手动装载角色驱动样板,如:在游戏运行中,用脚本动态的创建角色,那么手动指定TriggerSource
  //TriggerSource为不固定的,在使用角色样板的时候,应和游戏的上层协商好标准
  }
  _StreamList:TRULEStreamList;
  
//*****************************************************************************************************
//常量
//*****************************************************************************************************
const
  //角色模型
  C_MDL_Model='BlackDragon.MDL';
  //最大生命
  C_ChrMaxLife=80;
  //当前生命
  C_ChrLife=80;
  //最大魔法
  C_ChrMaxMana=30;
  //当前魔法
  C_ChrMana=30;
  //移动速度(公式: 每秒的移动速度)
  C_ChrMoveSpeed=300;
  //转弯时的移动速率(公式: 速率 * 移动速度)   
  C_ChrRollMoveRadio=0.7;
  //转弯速率(公式: 速率 * 360)   
  C_ChrRollRadio=0.7;
  //命令延迟(当发出命令给该角色时,角色的发呆时间,单位:秒)   
  C_ChrCommandDeltaTime=0.1;

//*****************************************************************************************************

{
  如果角色是NPC,则会触发该事件,否则可忽略
  TriggerObject是玩家
}
procedure NPCEvent(EventItem: TRULEBaseEventItem; TriggerObject: TOBJECT; EventInformation: string);
var
  Player:TDummyCube;
begin
  Player:=TDummyCube(TriggerObject);
end;  

{
  AI事件,装入角色总是会触发该事件
  AI引擎在该事件中初始化
  TriggerObject是玩家
}
procedure AIEvent(EventItem: TRULEBaseEventItem; TriggerObject: TOBJECT; EventInformation: string);
var
  Player:TDummyCube;
begin
  Player:=TDummyCube(TriggerObject);
end;  
  
begin
  //**************************************************************
  //TriggerTarget是世界引擎分配给当前模型的接口
  //**************************************************************
  if not (TriggerTarget is TDummyCube) then Exit;
  _Obj:=TDummyCube(TriggerTarget);
  
  //**************************************************************
  //如果在核心规则的世界编辑环境中驱动(利用核心规则驱动),TargetSource为当前OX目录
  //如果是使用核心规则的,LoadModelFromStream,那么TargetSource则是空
  //如果是手动装载角色驱动样板,如:在游戏运行中,用脚本动态的创建角色,那么手动指定TriggerSource
  //TriggerSource为不固定的,在使用角色样板的时候,应和游戏的上层协商好标准
  //**************************************************************
  if not (TriggerSource is TRULEStreamList) then Exit;
  _StreamList:=TRULEStreamList(TriggerSource);   
  
  //**************************************************************
  //装入模型,MDL方式
  //**************************************************************
  if not ExecuteObjectDataScriptFromStreamList_Fast(_StreamList, C_MDL_Model, C_MDL_Model, TriggerTarget) then Exit;
   
  //**************************************************************
  //NPC接口
  //**************************************************************
  GetNPCEventEngine(_Obj).Add.OnEvent:=@NPCEvent;
  
  //**************************************************************
  //AI接口
  //**************************************************************
  GetAIEventEngine(_Obj).Add.OnEvent:=@AIEvent;
   
  //**************************************************************
  //最大生命
  //**************************************************************
  SetChrMaxLife(_Obj, C_ChrMaxLife);
   
  //**************************************************************
  //当前生命
  //**************************************************************
  SetChrLife(_Obj, C_ChrLife);
   
  //**************************************************************
  //最大魔法
  //**************************************************************
  SetChrMaxMana(_Obj, C_ChrMaxMana);
   
  //**************************************************************
  //当前魔法
  //**************************************************************
  SetChrMana(_Obj, C_ChrMana);
   
  //**************************************************************
  //移动速度
  //**************************************************************
  SetChrMoveSpeed(_Obj, C_ChrMoveSpeed);
   
  //**************************************************************
  //转弯移动速率
  //**************************************************************
  SetChrRollMoveRadio(_Obj, C_ChrRollMoveRadio);
   
  //**************************************************************
  //转弯速率
  //**************************************************************
  SetChrRollRadio(_Obj, C_ChrRollRadio);
   
  //**************************************************************
  //命令延迟
  //**************************************************************
  SetChrCommandDeltaTime(_Obj, C_ChrCommandDeltaTime);
  
  //**************************************************************
  //激活驻留
  //**************************************************************
  EnabledResident;
end.

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2007-2-1 18:35:00 | 显示全部楼层

Re:迷茫了,是否要使用数据驱动.

唉……怎么都这么迷恋数据驱动呢……
首先来看看数据驱动的意义或目的:
灵活性与代码复用。数据驱动,意味着通过更改数据就可以复用以前的工作成果,并且这种复用比较可靠。数据与程序是分离的,数据的运行生命期不一定要达到代码运行生命期那么长的时间,所以可以在程序运行过程中载入数据,这样比较灵活。
现在再来看除了数据驱动,还有什么手段可以达到这一目的:
DLL。DLL是可以动态载入的,因此灵活。更换载入的DLL就可以复用以前的代码。
所以从功能上,DLL并不比数据驱动差。事实上DLL里可以包含各种可运行的代码,功能型比数据驱动要强。
所以我比较倾向于使用DLL而不是数据驱动。
当然也有一种情况,数据驱动比DLL更好,那就是要让普通用户来定制功能,由于他们不懂编程,所以这时数据驱动更为合适。典型的情况就是软件的config文件。但是对于游戏来说,除了设置之外,其他东西其实用户自己定制的并不多,即使有,那一般也是高级用户进行扩展,对他们来说就算不写DLL,那也得写脚本,既然横竖都要编程了,那DLL也不是太大的问题,只要把开发库和文档做好了。

个人看法。

0

主题

275

帖子

676

积分

高级会员

Rank: 4

积分
676
发表于 2007-2-1 18:47:00 | 显示全部楼层

Re:迷茫了,是否要使用数据驱动.

我是?A向中庸..那??好用就用他...
不?越高?越?A向?????
??蛞???到後?矶枷袷??VM一般
?????涌梢宰龅礁??娲?a?o??
?Q套??蛞?孢?可以直接?绦熊??...?才是真正的重?性利用w

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2007-2-1 18:53:00 | 显示全部楼层

Re:迷茫了,是否要使用数据驱动.

呵呵,我觉得数据驱动太极端之后反而是很糟糕的复用了。因为脚本实现的东西越多,那么引擎里的东西就相对的越少,另一方面,脚本的复用性是比引擎低的,所以一旦把一些具有通用性的东西写进脚本,那么整体的复用性就降低了。

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2007-2-1 19:46:00 | 显示全部楼层

Re:迷茫了,是否要使用数据驱动.

如果说楼上的楼上中庸,我就算是偏执了
楼主可记得当初指导过小弟世界逻辑的关系。

小的在下鄙人我认为:游戏是对世界的抽象,一定有一个可以模拟世界的结构存在。
虽然现在效率上做不到,但应该尽量做到数据驱动之类。
好的结构能带来有更多的功能,比如数据驱动就能做到下载新角色之类的游戏特性。
也更容易加入新的功能。能给游戏本身带来无限的可能。
就算失败了,下一个项目也能得到更多的经验。
(除非你和公司是one night stand)

反正我是偏执狂,我的东西是重结构不重效率,重通用不重效果,
小弟比较钦佩SIMS的设计,应该算是纯数据驱动吧。

不用理我,我偏执。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2007-2-1 19:50:00 | 显示全部楼层

Re:迷茫了,是否要使用数据驱动.

晕死……
其实要说在游戏运行期间加载新的元素,用DLL是最合适的了……数据驱动带来的往往是量变,新的DLL带来的可是质变啊……

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2007-2-1 21:10:00 | 显示全部楼层

Re: Re:迷茫了,是否要使用数据驱动.

sjinny: Re:迷茫了,是否要使用数据驱动.

晕死……
其实要说在游戏运行期间加载新的元素,用DLL是最合适的了……数据驱动带来的往往是量变,新的DLL带来的可是质变啊……

我理解:数据驱动并不是单纯只脚本,而是游戏主结构可以允许新的数据无封的插入,从而某种程度上的改变游戏逻辑,如果设计好了,DLL完全可以用来作为数据驱动的元素,在我看来,((dll(甚至com)+脚本+素材)=数据单元)=打包放入游戏。很类似所谓的设计模式MVC(素材=view,dll=控制,脚本=模型)。

不知道理解和官方的是否有严重出入。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2007-2-1 21:15:00 | 显示全部楼层

Re:迷茫了,是否要使用数据驱动.

-_-!
这个……既然你也赞同DLL,那就没啥可争的了……

反正我感觉现在提倡脚本的太多,提倡DLL的太少……
我个人觉得,除非要做自动生成代码的东西,否则DLL完全可以替代脚本……
当然如果游戏里自带编译器,那也可以自动生成DLL了……嘿嘿

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2007-2-1 21:51:00 | 显示全部楼层

Re: Re:迷茫了,是否要使用数据驱动.

sjinny: Re:迷茫了,是否要使用数据驱动.

-_-!
这个……既然你也赞同DLL,那就没啥可争的了……

反正我感觉现在提倡脚本的太多,提倡DLL的太少…...

我最早尝试做游戏的时候们迷恋脚本,希望把所有的东西都分到脚本中去,最后脚本代码都快超过本身游戏了,当时手上又没有好的Debug,失败阿(lua)。

其实什么东西放在脚本什么东西放在代码(dll)并不是太好界定,最后我给自己定地原则是,dll表示类型特征,脚本表示单体属性特征。比如人类dll就要有所有的人类共性特征,比如走动的接口,吃饭的接口什么的。而脚本代表个体,比如身高的数字,比如对事件反映的代码(挨打之后跑不跑?)。

当然这都是我个人YY的了,欢迎拍砖。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 09:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表