fair 发表于 2007-1-26 21:10:00

模型和游戏怎样结合的技术

<p>转贴</p><p>{<br/>&nbsp;&nbsp;&nbsp;看到这么长的脚本,你们总该知道为什么我需要一个脚本产生工具了吧<br/>&nbsp;&nbsp;&nbsp;这个脚本是不完整的,没有写音效,没有写粒子,比如角色死亡时的特效<br/>&nbsp;&nbsp;&nbsp;这是一条黑龙的模型驱动脚本,我先ctrl+v过来,然后花了10分钟来改写,虽然有详细的常量,但还是非常麻烦,不是吗。<br/>&nbsp;&nbsp;&nbsp;下图是该脚本的工作/运行环境<br/>} </p><p></p><p>uses&nbsp;MDLAuto;</p><p>const<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;//owner&nbsp;type<br/>&nbsp;&nbsp;//TRULEDummyOwnerType(rdotSelf,&nbsp;rdotNeutrally,&nbsp;rdotAntagonize,&nbsp;rdotAlly,&nbsp;rdotWorld)<br/>&nbsp;&nbsp;_OwnerType=rdotSelf;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;//state&nbsp;type<br/>&nbsp;&nbsp;//TRULEDummyCubeStateType(rostDummy,&nbsp;rostStatic,&nbsp;rostStaticTraversing,&nbsp;potStaticUnderprop,&nbsp;rostMovement,&nbsp;rostMovementTraversing,&nbsp;rostMovementFly)<br/>&nbsp;&nbsp;_StateType=rostMovement;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;//show&nbsp;shadow&nbsp;&nbsp;<br/>&nbsp;&nbsp;_ShadowVolume=True;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;//map&nbsp;open&nbsp;a&nbsp;time&nbsp;auto&nbsp;preload,only&nbsp;for&nbsp;WorldEditor&nbsp;build&nbsp;mode,no&nbsp;interface&nbsp;manual&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Preload=False;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;//radius&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Radius=100;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;//autofree&nbsp;&nbsp;<br/>&nbsp;&nbsp;_AutoFree=True;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;//skin&nbsp;mesh<br/>&nbsp;&nbsp;_Skin_CFG='Skin.SMD';<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;//load&nbsp;format&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(animated&nbsp;file)#13#10(animated&nbsp;file)#13#10.......<br/>&nbsp;&nbsp;//animated&nbsp;switch&nbsp;format&nbsp;&nbsp;&nbsp;(animated&nbsp;name):(frame):(animate&nbsp;mode)<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;{&nbsp;IDLE&nbsp;animated,&nbsp;}<br/>&nbsp;&nbsp;_IDLE_CFG='IDLE1.smd'+#13#10+'IDLE2.smd';<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_IDLE_50_AnimatedSwitch='IDLE1:60';&nbsp;&nbsp;<br/>&nbsp;&nbsp;_IDLE_30_AnimatedSwitch='IDLE2:60';&nbsp;&nbsp;<br/>&nbsp;&nbsp;_IDLE_20_AnimatedSwitch='IDLE2:60';&nbsp;&nbsp;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;{&nbsp;Attack&nbsp;animated,&nbsp;}<br/>&nbsp;&nbsp;_Attack_CFG='Attack1.smd';<br/>&nbsp;&nbsp;//&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Attack_60_AnimatedSwitch='Attack1:80';&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Attack_60_Trigger_PercentFrame=50;<br/>&nbsp;&nbsp;_Attack_60_Trigger_SkeletonBoneName='';<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Attack_40_AnimatedSwitch='Attack1:80';<br/>&nbsp;&nbsp;_Attack_40_Trigger_PercentFrame=50;<br/>&nbsp;&nbsp;_Attack_40_Trigger_SkeletonBoneName='';<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;{&nbsp;Remote&nbsp;animated,&nbsp;}<br/>&nbsp;&nbsp;_Remote_CFG=_Attack_CFG;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Remote_60_AnimatedSwitch=_Attack_60_AnimatedSwitch;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Remote_60_Trigger_PercentFrame=_Attack_60_Trigger_PercentFrame;<br/>&nbsp;&nbsp;_Remote_60_Trigger_SkeletonBoneName=_Attack_60_Trigger_SkeletonBoneName;<br/>&nbsp;&nbsp;//&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Remote_40_AnimatedSwitch=_Attack_40_AnimatedSwitch;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Remote_40_Trigger_PercentFrame=_Attack_40_Trigger_PercentFrame;<br/>&nbsp;&nbsp;_Remote_40_Trigger_SkeletonBoneName=_Attack_40_Trigger_SkeletonBoneName;&nbsp;&nbsp;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;{&nbsp;Spell&nbsp;animated,&nbsp;}<br/>&nbsp;&nbsp;_Spell_CFG='Spell.smd';<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Spell_60_AnimatedSwitch='Spell:80';&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Spell_60_Trigger_PercentFrame=50;<br/>&nbsp;&nbsp;_Spell_60_Trigger_SkeletonBoneName='';<br/>&nbsp;&nbsp;//&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Spell_40_AnimatedSwitch='Spell:80';&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Spell_40_Trigger_PercentFrame=50;<br/>&nbsp;&nbsp;_Spell_40_Trigger_SkeletonBoneName='';&nbsp;&nbsp;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;{&nbsp;Special&nbsp;animated,&nbsp;}<br/>&nbsp;&nbsp;_Special_CFG=_Attack_CFG;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Special_60_AnimatedSwitch=_Attack_60_AnimatedSwitch;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Special_60_Trigger_PercentFrame=_Attack_60_Trigger_PercentFrame;<br/>&nbsp;&nbsp;_Special_60_Trigger_SkeletonBoneName=_Attack_60_Trigger_SkeletonBoneName;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Special_40_AnimatedSwitch=_Attack_40_AnimatedSwitch;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Special_40_Trigger_PercentFrame=_Attack_40_Trigger_PercentFrame;<br/>&nbsp;&nbsp;_Special_40_Trigger_SkeletonBoneName=_Attack_40_Trigger_SkeletonBoneName;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;{&nbsp;Use&nbsp;animated,&nbsp;}<br/>&nbsp;&nbsp;_Use_CFG=_Spell_CFG;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Use_60_AnimatedSwitch=_Spell_60_AnimatedSwitch;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Use_60_Trigger_PercentFrame=_Spell_60_Trigger_PercentFrame;<br/>&nbsp;&nbsp;_Use_60_Trigger_SkeletonBoneName=_Spell_60_Trigger_SkeletonBoneName;<br/>&nbsp;&nbsp;//&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Use_40_AnimatedSwitch=_Spell_40_AnimatedSwitch;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Use_40_Trigger_PercentFrame=_Spell_40_Trigger_PercentFrame;<br/>&nbsp;&nbsp;_Use_40_Trigger_SkeletonBoneName=_Spell_40_Trigger_SkeletonBoneName;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;{&nbsp;Walk&nbsp;animated,&nbsp;}<br/>&nbsp;&nbsp;_Walk_CFG='Walk1.smd';<br/>&nbsp;&nbsp;_Walk_AnimatedSwitch='Walk1';<br/>&nbsp;&nbsp;_Walk_StandMovementSpeed=200;<br/>&nbsp;&nbsp;_Walk_StandFrameInterval=80;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;{&nbsp;Run&nbsp;animated,&nbsp;}<br/>&nbsp;&nbsp;_Run_CFG='Walk2.smd';<br/>&nbsp;&nbsp;_Run_AnimatedSwitch='Walk2';<br/>&nbsp;&nbsp;_Run_StandMovementSpeed=200;<br/>&nbsp;&nbsp;_Run_StandFrameInterval=80;<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;{&nbsp;DIE&nbsp;animated,&nbsp;}<br/>&nbsp;&nbsp;_DIE_CFG='DIE.smd';<br/>&nbsp;&nbsp;_DIE_AnimatedSwitch='DIE:80';<br/>&nbsp;&nbsp;//*****************************************************************************************<br/>&nbsp;&nbsp;{&nbsp;Ready&nbsp;animated,&nbsp;}<br/>&nbsp;&nbsp;_Ready_CFG='IDLE1.smd';<br/>&nbsp;&nbsp;_Ready_AnimatedSwitch='IDLE1:80';</p><p><br/>//implementation&nbsp;script<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>var<br/>&nbsp;&nbsp;_ObjectData:TObjectDataManager;<br/>&nbsp;&nbsp;_DataFramework:TRULESectionTextEngine;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Parent:TDummyCube;<br/>&nbsp;&nbsp;_Actor:TActor;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Attack_60_Trigger_SkeletonBone:TSkeletonBone;<br/>&nbsp;&nbsp;_Attack_40_Trigger_SkeletonBone:TSkeletonBone;<br/>&nbsp;&nbsp;_Remote_60_Trigger_SkeletonBone:TSkeletonBone;<br/>&nbsp;&nbsp;_Remote_40_Trigger_SkeletonBone:TSkeletonBone;<br/>&nbsp;&nbsp;_Spell_60_Trigger_SkeletonBone:TSkeletonBone;<br/>&nbsp;&nbsp;_Spell_40_Trigger_SkeletonBone:TSkeletonBone;<br/>&nbsp;&nbsp;_Special_60_Trigger_SkeletonBone:TSkeletonBone;<br/>&nbsp;&nbsp;_Special_40_Trigger_SkeletonBone:TSkeletonBone;<br/>&nbsp;&nbsp;_Use_60_Trigger_SkeletonBone:TSkeletonBone;<br/>&nbsp;&nbsp;_Use_40_Trigger_SkeletonBone:TSkeletonBone;</p><p>procedure&nbsp;_Destroy(Sender:TObject);<br/>begin<br/>&nbsp;&nbsp;_DataFramework.Free;&nbsp;&nbsp;<br/>&nbsp;&nbsp;DisableResident;<br/>end;</p><p>procedure&nbsp;_IDLE_FrameReached(Sender:TObject);<br/>var<br/>&nbsp;&nbsp;_R:Integer;<br/>&nbsp;&nbsp;_AnimatedSwitch:string;<br/>&nbsp;&nbsp;_Name:string;&nbsp;<br/>&nbsp;&nbsp;_Interval:Integer;&nbsp;<br/>begin<br/>&nbsp;&nbsp;_R:=RandomRange(0,&nbsp;100);<br/>&nbsp;&nbsp;if&nbsp;_R&lt;50&nbsp;then<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_IDLE_50_AnimatedSwitch<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end&nbsp;<br/>&nbsp;&nbsp;else&nbsp;if&nbsp;_R&lt;80&nbsp;then<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_IDLE_30_AnimatedSwitch<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end&nbsp;<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_IDLE_20_AnimatedSwitch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;FilterAnimatedText(_AnimatedSwitch,&nbsp;_Name,&nbsp;_Interval);<br/>&nbsp;&nbsp;_Actor.Interval:=_Interval;<br/>&nbsp;&nbsp;_Actor.SwitchToAnimationFromName(_Name,&nbsp;_Actor.CurrentFrame&gt;0);<br/>end;</p><p>function&nbsp;Proc_IDLE(Sender:TRULEProc):&nbsp;Variant;<br/>begin<br/>&nbsp;&nbsp;Result:=True;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.OnProgress:=nil;<br/>&nbsp;&nbsp;_Actor.OnFrameChanged:=nil;<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=@_IDLE_FrameReached;<br/>&nbsp;&nbsp;_Actor.OnEndFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;if&nbsp;not&nbsp;Sender.Variantvalues['Wait']&nbsp;then&nbsp;_IDLE_FrameReached(_Actor);<br/>end;</p><p>var<br/>&nbsp;&nbsp;___Percent:Integer;<br/>&nbsp;&nbsp;___SkeletonBone:TSkeletonBone;<br/>&nbsp;&nbsp;___Animation:TActorAnimation;</p><p>procedure&nbsp;_Attack_Remote_Spell_Special_Use_Progress(Sender:&nbsp;TOBJECT;&nbsp;deltaTime:&nbsp;Double;&nbsp;NEWTIME:&nbsp;Double);<br/>begin<br/>&nbsp;&nbsp;if&nbsp;(___Animation&lt;&gt;nil)and(_Actor.StartFrame=___Animation.StartFrame)and(_Actor.EndFrame=___Animation.EndFrame)and<br/>&nbsp;&nbsp;(mlPercentageToInt(_Actor.EndFrame-_Actor.StartFrame,&nbsp;_Actor.CurrentFrame-_Actor.StartFrame)&nbsp;&gt;=&nbsp;___Percent)&nbsp;then<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActorTriggerSpellFromMDL(_Parent,&nbsp;___SkeletonBone);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Actor.OnProgress:=nil;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;_Parent.Procs&nbsp;do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Variantvalues['Wait']:=True;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Execute;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;&nbsp;<br/>&nbsp;&nbsp;&nbsp;end;<br/>end;</p><p>procedure&nbsp;_Attack_FrameReached(Sender:TObject);<br/>var<br/>&nbsp;&nbsp;_R:Integer;<br/>&nbsp;&nbsp;_AnimatedSwitch:string;<br/>&nbsp;&nbsp;_Name:string;&nbsp;<br/>&nbsp;&nbsp;_Interval:Integer;&nbsp;<br/>begin<br/>&nbsp;&nbsp;_R:=RandomRange(0,&nbsp;100);<br/>&nbsp;&nbsp;if&nbsp;_R&lt;60&nbsp;then<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_Attack_60_AnimatedSwitch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___Percent:=60;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___SkeletonBone:=_Attack_60_Trigger_SkeletonBone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_Attack_40_AnimatedSwitch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___Percent:=40;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___SkeletonBone:=_Attack_40_Trigger_SkeletonBone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end;&nbsp;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;FilterAnimatedText(_AnimatedSwitch,&nbsp;_Name,&nbsp;_Interval);<br/>&nbsp;&nbsp;_Actor.Interval:=_Interval;<br/>&nbsp;&nbsp;___Animation:=_Actor.Animations.FindName(_Name);<br/>&nbsp;&nbsp;_Actor.SwitchToAnimationFromType(___Animation,&nbsp;_Actor.CurrentFrame&gt;0);<br/>&nbsp;&nbsp;_Actor.OnProgress:=@_Attack_Remote_Spell_Special_Use_Progress;<br/>end;</p><p>function&nbsp;Proc_Attack(Sender:TRULEProc):&nbsp;Variant;<br/>begin<br/>&nbsp;&nbsp;Result:=True;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.OnProgress:=nil;<br/>&nbsp;&nbsp;_Actor.OnFrameChanged:=nil;<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=@_Attack_FrameReached;<br/>&nbsp;&nbsp;_Actor.OnEndFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;if&nbsp;not&nbsp;Sender.Variantvalues['Wait']&nbsp;then&nbsp;_Attack_FrameReached(_Actor);<br/>end;</p><p>procedure&nbsp;_Remote_FrameReached(Sender:TObject);<br/>var<br/>&nbsp;&nbsp;_R:Integer;<br/>&nbsp;&nbsp;_AnimatedSwitch:string;<br/>&nbsp;&nbsp;_Name:string;&nbsp;<br/>&nbsp;&nbsp;_Interval:Integer;&nbsp;<br/>begin<br/>&nbsp;&nbsp;_R:=RandomRange(0,&nbsp;100);<br/>&nbsp;&nbsp;if&nbsp;_R&lt;60&nbsp;then<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_Remote_60_AnimatedSwitch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___Percent:=60;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___SkeletonBone:=_Remote_60_Trigger_SkeletonBone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_Remote_40_AnimatedSwitch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___Percent:=40;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___SkeletonBone:=_Remote_40_Trigger_SkeletonBone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end;&nbsp;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;FilterAnimatedText(_AnimatedSwitch,&nbsp;_Name,&nbsp;_Interval);<br/>&nbsp;&nbsp;_Actor.Interval:=_Interval;<br/>&nbsp;&nbsp;___Animation:=_Actor.Animations.FindName(_Name);<br/>&nbsp;&nbsp;_Actor.SwitchToAnimationFromType(___Animation,&nbsp;_Actor.CurrentFrame&gt;0);<br/>&nbsp;&nbsp;_Actor.OnProgress:=@_Attack_Remote_Spell_Special_Use_Progress;<br/>end;</p><p>function&nbsp;Proc_Remote(Sender:TRULEProc):&nbsp;Variant;<br/>begin<br/>&nbsp;&nbsp;Result:=True;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.OnProgress:=nil;<br/>&nbsp;&nbsp;_Actor.OnFrameChanged:=nil;<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=@_Remote_FrameReached;<br/>&nbsp;&nbsp;_Actor.OnEndFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;if&nbsp;not&nbsp;Sender.Variantvalues['Wait']&nbsp;then&nbsp;_Remote_FrameReached(_Actor);<br/>end;</p><p>procedure&nbsp;_Spell_FrameReached(Sender:TObject);<br/>var<br/>&nbsp;&nbsp;_R:Integer;<br/>&nbsp;&nbsp;_AnimatedSwitch:string;<br/>&nbsp;&nbsp;_Name:string;&nbsp;<br/>&nbsp;&nbsp;_Interval:Integer;&nbsp;<br/>begin<br/>&nbsp;&nbsp;_R:=RandomRange(0,&nbsp;100);<br/>&nbsp;&nbsp;if&nbsp;_R&lt;60&nbsp;then<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_Spell_60_AnimatedSwitch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___Percent:=60;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___SkeletonBone:=_Spell_60_Trigger_SkeletonBone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_Spell_40_AnimatedSwitch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___Percent:=40;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___SkeletonBone:=_Spell_40_Trigger_SkeletonBone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end;&nbsp;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;FilterAnimatedText(_AnimatedSwitch,&nbsp;_Name,&nbsp;_Interval);<br/>&nbsp;&nbsp;_Actor.Interval:=_Interval;<br/>&nbsp;&nbsp;___Animation:=_Actor.Animations.FindName(_Name);<br/>&nbsp;&nbsp;_Actor.SwitchToAnimationFromType(___Animation,&nbsp;_Actor.CurrentFrame&gt;0);<br/>&nbsp;&nbsp;_Actor.OnProgress:=@_Attack_Remote_Spell_Special_Use_Progress;<br/>end;</p><p>function&nbsp;Proc_Spell(Sender:TRULEProc):&nbsp;Variant;<br/>begin<br/>&nbsp;&nbsp;Result:=True;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.OnProgress:=nil;<br/>&nbsp;&nbsp;_Actor.OnFrameChanged:=nil;<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=@_Spell_FrameReached;<br/>&nbsp;&nbsp;_Actor.OnEndFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;if&nbsp;not&nbsp;Sender.Variantvalues['Wait']&nbsp;then&nbsp;_Spell_FrameReached(_Actor);<br/>end;</p><p>procedure&nbsp;_Special_FrameReached(Sender:TObject);<br/>var<br/>&nbsp;&nbsp;_R:Integer;<br/>&nbsp;&nbsp;_AnimatedSwitch:string;<br/>&nbsp;&nbsp;_Name:string;&nbsp;<br/>&nbsp;&nbsp;_Interval:Integer;&nbsp;<br/>begin<br/>&nbsp;&nbsp;_R:=RandomRange(0,&nbsp;100);<br/>&nbsp;&nbsp;if&nbsp;_R&lt;60&nbsp;then<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_Special_60_AnimatedSwitch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___Percent:=60;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___SkeletonBone:=_Special_60_Trigger_SkeletonBone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_Special_40_AnimatedSwitch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___Percent:=40;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___SkeletonBone:=_Special_40_Trigger_SkeletonBone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end;&nbsp;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;FilterAnimatedText(_AnimatedSwitch,&nbsp;_Name,&nbsp;_Interval);<br/>&nbsp;&nbsp;_Actor.Interval:=_Interval;<br/>&nbsp;&nbsp;___Animation:=_Actor.Animations.FindName(_Name);<br/>&nbsp;&nbsp;_Actor.SwitchToAnimationFromType(___Animation,&nbsp;_Actor.CurrentFrame&gt;0);<br/>&nbsp;&nbsp;_Actor.OnProgress:=@_Attack_Remote_Spell_Special_Use_Progress;<br/>end;</p><p>function&nbsp;Proc_Special(Sender:TRULEProc):&nbsp;Variant;<br/>begin<br/>&nbsp;&nbsp;Result:=True;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.OnProgress:=nil;<br/>&nbsp;&nbsp;_Actor.OnFrameChanged:=nil;<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=@_Special_FrameReached;<br/>&nbsp;&nbsp;_Actor.OnEndFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;if&nbsp;not&nbsp;Sender.Variantvalues['Wait']&nbsp;then&nbsp;_Special_FrameReached(_Actor);<br/>end;</p><p>procedure&nbsp;_Use_FrameReached(Sender:TObject);<br/>var<br/>&nbsp;&nbsp;_R:Integer;<br/>&nbsp;&nbsp;_AnimatedSwitch:string;<br/>&nbsp;&nbsp;_Name:string;&nbsp;<br/>&nbsp;&nbsp;_Interval:Integer;&nbsp;<br/>begin<br/>&nbsp;&nbsp;_R:=RandomRange(0,&nbsp;100);<br/>&nbsp;&nbsp;if&nbsp;_R&lt;60&nbsp;then<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_Use_60_AnimatedSwitch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___Percent:=60;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___SkeletonBone:=_Use_60_Trigger_SkeletonBone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;_AnimatedSwitch:=_Use_40_AnimatedSwitch;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___Percent:=40;<br/>&nbsp;&nbsp;&nbsp;&nbsp;___SkeletonBone:=_Use_40_Trigger_SkeletonBone;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;&nbsp;end;&nbsp;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;FilterAnimatedText(_AnimatedSwitch,&nbsp;_Name,&nbsp;_Interval);<br/>&nbsp;&nbsp;_Actor.Interval:=_Interval;<br/>&nbsp;&nbsp;___Animation:=_Actor.Animations.FindName(_Name);<br/>&nbsp;&nbsp;_Actor.SwitchToAnimationFromType(___Animation,&nbsp;_Actor.CurrentFrame&gt;0);<br/>&nbsp;&nbsp;_Actor.OnProgress:=@_Attack_Remote_Spell_Special_Use_Progress;<br/>end;</p><p>function&nbsp;Proc_Use(Sender:TRULEProc):&nbsp;Variant;<br/>begin<br/>&nbsp;&nbsp;Result:=True;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.OnProgress:=nil;<br/>&nbsp;&nbsp;_Actor.OnFrameChanged:=nil;<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=@_Use_FrameReached;<br/>&nbsp;&nbsp;_Actor.OnEndFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;if&nbsp;not&nbsp;Sender.Variantvalues['Wait']&nbsp;then&nbsp;_Use_FrameReached(_Actor);<br/>end;</p><p>function&nbsp;Proc_Walk(Sender:TRULEProc):&nbsp;Variant;<br/>begin<br/>&nbsp;&nbsp;Result:=True;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.OnProgress:=nil;<br/>&nbsp;&nbsp;_Actor.OnFrameChanged:=nil;<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=nil;<br/>&nbsp;&nbsp;_Actor.OnEndFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.Interval:=_Walk_StandFrameInterval;<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;_Actor.SwitchToAnimationFromName(_Walk_AnimatedSwitch,&nbsp;_Actor.CurrentFrame&gt;0);<br/>end;</p><p>function&nbsp;Proc_Run(Sender:TRULEProc):&nbsp;Variant;<br/>begin<br/>&nbsp;&nbsp;Result:=True;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.OnProgress:=nil;<br/>&nbsp;&nbsp;_Actor.OnFrameChanged:=nil;<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=nil;<br/>&nbsp;&nbsp;_Actor.OnEndFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.Interval:=_Run_StandFrameInterval;<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;_Actor.SwitchToAnimationFromName(_Run_AnimatedSwitch,&nbsp;_Actor.CurrentFrame&gt;0);<br/>end;</p><p>procedure&nbsp;_DIE_FrameReached(Sender:TObject);<br/>var<br/>&nbsp;&nbsp;_Name:string;<br/>&nbsp;&nbsp;_Interval:Integer;<br/>begin<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;FilterAnimatedText(_DIE_AnimatedSwitch,&nbsp;_Name,&nbsp;_Interval);<br/>&nbsp;&nbsp;_Actor.Interval:=_Interval;<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamPlayOnce;<br/>&nbsp;&nbsp;_Actor.SwitchToAnimationFromName(_Name,&nbsp;_Actor.CurrentFrame&gt;0);<br/>end;</p><p>function&nbsp;Proc_DIE(Sender:TRULEProc):&nbsp;Variant;<br/>begin<br/>&nbsp;&nbsp;Result:=True;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.OnProgress:=nil;<br/>&nbsp;&nbsp;_Actor.OnFrameChanged:=nil;<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=@_DIE_FrameReached;<br/>&nbsp;&nbsp;_Actor.OnEndFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;if&nbsp;not&nbsp;Sender.Variantvalues['Wait']&nbsp;then&nbsp;_DIE_FrameReached(_Actor);<br/>end;</p><p>procedure&nbsp;_Ready_FrameReached(Sender:TObject);<br/>var<br/>&nbsp;&nbsp;_Name:string;<br/>&nbsp;&nbsp;_Interval:Integer;<br/>begin<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;FilterAnimatedText(_Ready_AnimatedSwitch,&nbsp;_Name,&nbsp;_Interval);<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;_Actor.Interval:=_Interval;<br/>&nbsp;&nbsp;_Actor.SwitchToAnimationFromName(_Name,&nbsp;_Actor.CurrentFrame&gt;0);<br/>end;</p><p>function&nbsp;Proc_Ready(Sender:TRULEProc):&nbsp;Variant;<br/>begin<br/>&nbsp;&nbsp;Result:=True;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.OnProgress:=nil;<br/>&nbsp;&nbsp;_Actor.OnFrameChanged:=nil;<br/>&nbsp;&nbsp;_Actor.OnStartFrameReached:=@_Ready_FrameReached;<br/>&nbsp;&nbsp;_Actor.OnEndFrameReached:=nil;<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;_Actor.AnimationMode:=aamLoop;<br/>&nbsp;&nbsp;if&nbsp;not&nbsp;Sender.Variantvalues['Wait']&nbsp;then&nbsp;_Ready_FrameReached(_Actor);<br/>end;</p><p>procedure&nbsp;InitExternalAPI;<br/>begin<br/>&nbsp;&nbsp;//init&nbsp;external&nbsp;api<br/>&nbsp;&nbsp;_Parent.Procs.New(C_IDLEInterface).OnProcExecute:=@Proc_IDLE;<br/>&nbsp;&nbsp;_Parent.Procs.New(C_AttackInterface).OnProcExecute:=@Proc_Attack;<br/>&nbsp;&nbsp;_Parent.Procs.New(C_RemoteInterface).OnProcExecute:=@Proc_Remote;<br/>&nbsp;&nbsp;_Parent.Procs.New(C_SpellInterface).OnProcExecute:=@Proc_Spell;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Parent.Procs.New(C_SpecialInterface).OnProcExecute:=@Proc_Special;<br/>&nbsp;&nbsp;_Parent.Procs.New(C_WalkInterface).OnProcExecute:=@Proc_Walk;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Parent.Procs.New(C_RunInterface).OnProcExecute:=@Proc_Run;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Parent.Procs.New(C_UseInterface).OnProcExecute:=@Proc_Use;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Parent.Procs.New(C_DIEInterface).OnProcExecute:=@Proc_DIE;&nbsp;&nbsp;<br/>&nbsp;&nbsp;_Parent.Procs.New(C_ReadyInterface).OnProcExecute:=@Proc_Ready;&nbsp;&nbsp;<br/>end;</p><p>procedure&nbsp;LoadSK(_List:string);<br/>var<br/>&nbsp;&nbsp;Rep_Int:Integer;<br/>&nbsp;&nbsp;_SL:TStrings;<br/>begin<br/>&nbsp;&nbsp;_SL:=TStringList.Create;<br/>&nbsp;&nbsp;if&nbsp;mlLimitTextAsList(_List,&nbsp;#13#10,&nbsp;_SL)&nbsp;then<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;Rep_Int:=0&nbsp;to&nbsp;_SL.Count-1&nbsp;do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;_Actor.Animations.FindName(mlMaskLastStr(_SL,&nbsp;'.'))=nil&nbsp;then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddSKToActorFromMDL(_Actor,&nbsp;_SL);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;_SL.Free;<br/>end;</p><p>procedure&nbsp;LoadSMD;<br/>begin<br/>&nbsp;&nbsp;LoadSKSkinToActorFromMDL(_Actor,&nbsp;_Skin_CFG);<br/>&nbsp;&nbsp;//<br/>&nbsp;&nbsp;LoadSK(_IDLE_CFG);<br/>&nbsp;&nbsp;LoadSK(_Attack_CFG);<br/>&nbsp;&nbsp;LoadSK(_Remote_CFG);<br/>&nbsp;&nbsp;LoadSK(_Spell_CFG);<br/>&nbsp;&nbsp;LoadSK(_Special_CFG);<br/>&nbsp;&nbsp;LoadSK(_Walk_CFG);<br/>&nbsp;&nbsp;LoadSK(_Run_CFG);<br/>&nbsp;&nbsp;LoadSK(_Use_CFG);<br/>&nbsp;&nbsp;LoadSK(_DIE_CFG);<br/>&nbsp;&nbsp;LoadSK(_Ready_CFG);<br/>end;</p><p>procedure&nbsp;ScanSkeletonBone;<br/>begin<br/>&nbsp;_Attack_60_Trigger_SkeletonBone:=_Actor.Skeleton.RootBones.BoneByName(_Attack_60_Trigger_SkeletonBoneName);<br/>&nbsp;_Attack_40_Trigger_SkeletonBone:=_Actor.Skeleton.RootBones.BoneByName(_Attack_40_Trigger_SkeletonBoneName);<br/>&nbsp;_Remote_60_Trigger_SkeletonBone:=_Actor.Skeleton.RootBones.BoneByName(_Remote_60_Trigger_SkeletonBoneName);<br/>&nbsp;_Remote_40_Trigger_SkeletonBone:=_Actor.Skeleton.RootBones.BoneByName(_Remote_40_Trigger_SkeletonBoneName);<br/>&nbsp;_Spell_60_Trigger_SkeletonBone:=_Actor.Skeleton.RootBones.BoneByName(_Spell_60_Trigger_SkeletonBoneName);<br/>&nbsp;_Spell_40_Trigger_SkeletonBone:=_Actor.Skeleton.RootBones.BoneByName(_Spell_40_Trigger_SkeletonBoneName);<br/>&nbsp;_Special_60_Trigger_SkeletonBone:=_Actor.Skeleton.RootBones.BoneByName(_Special_60_Trigger_SkeletonBoneName);<br/>&nbsp;_Special_40_Trigger_SkeletonBone:=_Actor.Skeleton.RootBones.BoneByName(_Special_40_Trigger_SkeletonBoneName);<br/>&nbsp;_Use_60_Trigger_SkeletonBone:=_Actor.Skeleton.RootBones.BoneByName(_Use_60_Trigger_SkeletonBoneName);<br/>&nbsp;_Use_40_Trigger_SkeletonBone:=_Actor.Skeleton.RootBones.BoneByName(_Use_40_Trigger_SkeletonBoneName);<br/>end;</p><p>//main<br/>begin<br/>&nbsp;&nbsp;//entry<br/>&nbsp;&nbsp;_Parent:=TDummyCube(TriggerTarget);<br/>&nbsp;&nbsp;_ObjectData:=TObjectDataManager(TriggerSource);<br/>&nbsp;&nbsp;_Parent.Roll(-90);</p><p>&nbsp;&nbsp;//fixed&nbsp;options<br/>&nbsp;&nbsp;_Parent.StateData.Fixed_Type:=_StateType;<br/>&nbsp;&nbsp;_Parent.StateData.Fixed_OwnerType:=_OwnerType;<br/>&nbsp;&nbsp;_Parent.StateData.Fixed_ShadowVolume:=_ShadowVolume;<br/>&nbsp;&nbsp;_Parent.StateData.Fixed_Preload:=_Preload;<br/>&nbsp;&nbsp;_Parent.StateData.Fixed_Radius:=_Radius;<br/>&nbsp;&nbsp;_Parent.StateData.Fixed_AutoFree:=_AutoFree;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;//init&nbsp;data&nbsp;framework<br/>&nbsp;&nbsp;_DataFramework:=GetDataFrameworkFromMDL;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;//init&nbsp;api<br/>&nbsp;&nbsp;InitExternalAPI;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;//init&nbsp;actor<br/>&nbsp;&nbsp;_Actor:=TActor.CreateAsChild(_Parent);<br/>&nbsp;&nbsp;_Actor.Reference:=aarSkeleton;<br/>&nbsp;&nbsp;_Actor.OverlaySkeleton:=True;<br/>&nbsp;&nbsp;InitActorMaterialFromMDL(_Actor);<br/>&nbsp;<br/>&nbsp;&nbsp;//custom&nbsp;material&nbsp;process,&nbsp;custom&nbsp;texture&nbsp;options&nbsp;here<br/>&nbsp;&nbsp;&nbsp;with&nbsp;GetActorTextureFromMDL(_Actor,&nbsp;'BlackDragon.tga',&nbsp;'BlackDragon.tga')&nbsp;do<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Material.BlendingMode:=bmOpaque;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Material.FaceCulling:=fcNoCull;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;//load&nbsp;smd<br/>&nbsp;&nbsp;LoadSMD;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;//scan&nbsp;and&nbsp;initiation&nbsp;Skeleton&nbsp;Bone<br/>&nbsp;&nbsp;ScanSkeletonBone;<br/>&nbsp;<br/>&nbsp;&nbsp;//auto&nbsp;play&nbsp;ILDE&nbsp;animated<br/>&nbsp;&nbsp;with&nbsp;_Parent.Procs&nbsp;do<br/>&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Variantvalues['Wait']:=False;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Execute;<br/>&nbsp;&nbsp;&nbsp;end;&nbsp;<br/>&nbsp;<br/>&nbsp;&nbsp;//Resident<br/>&nbsp;&nbsp;_Parent.OnDestroy:=@_Destroy;<br/>&nbsp;&nbsp;EnabledResident;&nbsp;&nbsp;<br/>end.</p>
[此贴子已经被作者于2007-1-26 21:14:36编辑过]

fair 发表于 2007-1-26 21:14:00

UploadFile/2007-1/200712621134833526.jpg<br/>

fair 发表于 2007-1-26 21:15:00

这是和该脚本结合在一起的模型数据 <p></p><p>SMD格式,够熟悉了吧,够通用了吧?<br/></p>UploadFile/2007-1/20071262115789092.jpg<br/>

fair 发表于 2007-1-26 21:16:00

这是模拟环境中的运行结果,这和最终放在游戏中的运行结果是一致的UploadFile/2007-1/200712621154282344.jpg<br/>

fair 发表于 2007-1-26 21:16:00

这是模拟环境的专用脚本.UploadFile/2007-1/200712621161649517.jpg<br/>

fair 发表于 2007-1-26 21:17:00

运行以后,得到了所需的控制按钮,可以在这里切换动画,以及调整播放贞的速率,和做一些纹理,骨骼参数的调整,这样就成了一个完整的SMD调试环境了. <p></p><p><br/>很简单,不是吗,就是那些脚本有点烦.</p><p><br/>不久以后某天,当太阳升起的时候,然后一个全球最变态引擎将出现在中国的游戏土地上.变态引擎将代替我们的太阳.</p>UploadFile/2007-1/200712621164324446.jpg<br/>

fair 发表于 2007-1-26 21:17:00

其实单单支持SMD是不能作为通用引擎的,何况还是变态的通用引擎. <p></p><p>我还支持MD3,MD2,MD5(把ID的格式全支持完了)</p><p>看图,这是完整的MD3,可以更换武器,更换衣服.这是从游戏中提取的模型</p>UploadFile/2007-1/200712621171066892.jpg<br/>

fair 发表于 2007-1-26 21:18:00

这就是MD3的支持了。 <p></p><p>你看出什么心得了吗?我前年花了大量时间在做模型开发方案。如果手痒,想亲自做一下,就等吧。</p><p>只要从现在起,多看看变态引擎作者的帖子,多关心一下变态引擎。不久以后,你就会发现,开发ARPG=easy<br/></p>UploadFile/2007-1/200712621174783632.jpg<br/>

fair 发表于 2007-1-26 21:18:00

然后把,上面做好的模型,应用一下。设置成,NPC,友方,本方,等等属性以后,这样在游戏中就可以应用了。 <p></p><p>这是演示模型在游戏中已经可以被成功的驱动了。非游戏画面。</p><p>怎么样,这个过程对于制作者来说很简单了吧。凡是你在网上搜集,自己做的模型,你只需要花10分钟去该一下模型的驱动脚本,那么在游戏中就可以使用了,目前我支持了10来种通用格式,3dsmax导出的大多数格式基本上都支持。我没说错吧,是不是开发ARPG,或则开发RTS,等于Easy?<br/></p>UploadFile/2007-1/200712621182011068.jpg<br/>
页: [1]
查看完整版本: 模型和游戏怎样结合的技术