|
|

楼主 |
发表于 2007-7-15 01:29:00
|
显示全部楼层
Re: Re: (正经。我在收集坛子众高手意见)。邀请TV3D二位
######(这个讲的是3D骨骼动画模型所具备的功能,模型文件是单个,但是他包含了很多角色的动作)
VB6 + TV3D的实例:
npc.Load "MODEL\name.mdl" '角色的模型
Pos.X = 100: Pos.Z = 100 '角色行列坐标
npc.SetRotation 0, 90, 0 '角色角度
Pos.Y = Land.GetHeight(Pos.X, Pos.Z) '判断高低地形
npc.SetPosition BarneyPos.X, Pos.Y, Pos.Z '角色摄像机上的坐标
npc.SetScale 1, 1, 1 '角色尺寸
npc.SetAnimationID 1 '角色动画编号
npc.PlayAnimation 30 '角色动画速度
npc.SetMaterial 1 '顶点光源
######(这个脚本是操作由很多单张的连续动画图片构成的动画片,就是帧动画)
举例:爆炸动画脚本:VC6
TEXTURES 9
Animations\Expl\expl1.jpg > ExplA1
Animations\Expl\expl2.jpg > ExplA2
Animations\Expl\expl3.jpg > ExplA3
Animations\Expl\expl4.jpg > ExplA4
Animations\Expl\expl5.jpg > ExplA5
Animations\Expl\expl6.jpg > ExplA6
Animations\Expl\expl7.jpg > ExplA7
Animations\Expl\expl8.jpg > ExplA8
Animations\Expl\expl9.jpg > ExplA9
//
// Explosion2 effect
//
SHADER Explosion2
{
Layer map1
{
//
// Texture Animation :
// Syntax : anim [FramePerSecond] [Tex1] [Tex2] ... [TexN] [0]
//
anim 10 Explb1 Explb2 Explb3 Explb4 Explb5 Explb6 Explb7 Explb8 Explb9 [0]
blendFunc ONE ONE
depthFunc NOWRITE
}
}
######(数据驱动适合做角色动画,脚本驱动适合做效果动画,如果开发一个游戏两种驱动都要使用)
######(早期星际用的是脚本驱动,魔兽用的是数据驱动,我的解释是2D游戏里用脚本驱动的多,3D游戏里数据驱动多)
######(这个触发器相当于游戏里的指针)
举例1:
MAP = 0 '空城
MAP = 1 '城市属于魏国
MAP = 2 '城市属于吴国
MAP = 3 '城市属于蜀国
举例2:
RES1=1(刀),RES1=2(枪)
RES2=1(大还丹),RES2=2(草药)
RES3=1(记录),RES3=2(读进度)
PSMOD=0 '不操作事件
PSMOD=1 '选择武器
PSMOD=2 '选择物品
PSMOD=3 '存读进度
IF PSMOD=1 AND RES1=1 THEN 拿刀
IF PSMOD=2 AND RES2=2 THEN 使用草药
IF PSMOD=3 AND RES3=1 THEN 记录游戏
举例3:
AI=INT(RND * 1000)
ENEMY = INT(RND * 3 + 1)
IF AI=1 AND ENEMY=1 THEN '士兵
IF AI=2 AND ENEMY=2 THEN '班长
IF AI=3 AND ENEMY=3 THEN '连长
######(你可以把角色的各种属性每一个做成一个类或模块来调用,但他们之间的关系要用公用变量连接好,数据处理部分还是比较多。)
######(配置文本比较适合地图编辑器, 机能,物品采用变量比较好)
动画部分你的做法太程序化了。在配置和使用时,除了程序以外没有不喊头大。推荐在动画部分做法:程序事先做好,第三方designer直接拿配置文件或则工具来驱动动画。
实际中我的做法:脚本驱动+数据驱动。脚本部分比较复杂,大多人不会用,我为此专门做了一个builder工具。见下图。
初衷是避免涉及到复杂脚本。直接使用数据驱动。使用数据在实战中比脚本驱动来的有用。

在2D爆炸过程中,我指3D方面的制作,很多地方用的爆炸效果都2D爆炸。读你的shader和驱动代码,发现每帧爆炸都是一张纹理。用单张纹理切换坐标优于你不断切换纹理。可参看q3,hl2,及tv3d论坛中很多demo。
我的触发器原理,是这样的。
触发器引擎。
{
在此触发引擎中所包含的若干个触发器事件接口。
}
数模1
{
注册触发事件到触发器引擎。
}
数模2
{
注册触发事件到触发器引擎。
}
角色创建函数
{
读取角色模型。
激活触发器引擎。(这时并不在这里直接指定自定义数模)
}
纵观总体,这样干简单实现了即插即用的灵活逻辑系统。
另外,回头我可以让你看看我的核心规则的实现代码。
我在高层逻辑层根本没写直接性的规则分辨之类的代码,规则判断部分全部放在局部处理。在中央部分只是几个接口。
总的来说,这种程序扩展较容易,可修改性较强。弊病是在开发过程中,会产生了一定的那种工程化特有的冗余代码,比如在几百个触发器的核心规则里面,调来去调去重复触发性比较大。
|
|