【Spine】Spine Runtime for Delphi移植笔记(八…
2018-06-17 18:56:21来源:未知 阅读 ()
//////////////////////////////////////////////////////////////////////////////// //Generic delphi runtime v3.6 for Spine animation tool // //Runtime port by cjk (hzi1980@163.com) // //////////////////////////////////////////////////////////////////////////////// unit spine.data; interface uses System.Classes, System.SysUtils, System.Generics.Collections, spine.types, spine.classes, spine.core.skin, spine.core.animation; type TSkeletonData = class; TBoneData = class; TSlotData = class; TEventData = class; TAnimationStateData = class; TIkConstraintData = class; TTransformConstraintData = class; TPathConstraintData = class; TSkeletonData = class(TObject) private FPathConstraintDatas: TObjectList<TPathConstraintData>; FIkConstraintDatas: TObjectList<TIkConstraintData>; FTransformConstraintDatas: TObjectList<TTransformConstraintData>; FEventDatas: TObjectList<TEventData>; FBoneDatas: TObjectList<TBoneData>; FSkins: TObjectList<TSpineSkin>; FSlotDatas: TObjectList<TSlotData>; FAnimations: TObjectList<TSpineAnimation>; public Name: string; DefaultSkin: TSpineSkin; Width, Height: Single; Version: string; Hash: string; ImagesPath: string; FPS: Single; property BoneDatas: TObjectList<TBoneData> read FBoneDatas; property SlotDatas: TObjectList<TSlotData> read FSlotDatas; property Skins: TObjectList<TSpineSkin> read FSkins; property EventDatas: TObjectList<TEventData> read FEventDatas; property Animations: TObjectList<TSpineAnimation> read FAnimations; property IkConstraintDatas: TObjectList<TIkConstraintData> read FIkConstraintDatas; property TransformConstraintDatas: TObjectList<TTransformConstraintData> read FTransformConstraintDatas; property PathConstraintDatas: TObjectList<TPathConstraintData> read FPathConstraintDatas; public constructor Create; destructor Destroy; override; function FindBone(const ABoneDataName: string): TBoneData; function FindBoneIndex(const ABoneDataName: string): Integer; function FindSlot(const ASlotDataName: string): TSlotData; function FindSlotIndex(const ASlotDataName: string): Integer; function FindSkin(const ASkinName: string): TSpineSkin; function FintEvent(const AEventDataName: string): TEventData; function FindAnimation(const AAnimationName: string): TSpineAnimation; function FindIkConstraint(const AConstraintDataName: string): TIkConstraintData; function FindTransformConstraint(const AConstraintDataName: string): TTransformConstraintData; function FindPathConstraint(const AConstraintDataName: string): TPathConstraintData; function FindPathConstraintIndex(const AConstraintDataName: string): Integer; end; TBoneData = class(TObject) private FIndex: Integer; FName: string; FParent: TBoneData; public Length: Single; X, Y, Rotation, ScaleX, ScaleY, ShearX, ShearY: Single; TransformMode: TTransformMode; property Index: Integer read FIndex; property Name: string read FName; property Parent: TBoneData read FParent; public constructor Create(const AIndex: Integer; const AName: string; const AParent: TBoneData); end; TSlotData = class(TObject) private FIndex: Integer; FName: string; FBoneData: TBoneData; public R, G, B, A, R2, G2, B2: Single; HasSecondColor: Boolean; AttachmentName: string; BlendMode: TBlendMode; property Index: Integer read FIndex; property Name: string read FName; property BoneData: TBoneData read FBoneData; public constructor Create(const AIndex: Integer; const AName: string; const ABoneData: TBoneData); end; TEventData = class(TObject) private FName: string; public IntValue: Integer; FloatValue: Single; StringValue: string; property Name: string read FName; public constructor Create(const AName: string); end; TAnimationPair = record A1: TSpineAnimation; A2: TSpineAnimation; end; TAnimationStateData = class(TObject) private FSkeletonData: TSkeletonData; FAnimationToMixTime: TDictionary<TAnimationPair, Single>; public DefaultMix: Single; property SkeletonData: TSkeletonData read FSkeletonData; public constructor Create(const ASkeletonData: TSkeletonData); destructor Destroy; override; procedure SetMix(const AFromName, AToName: string; const ADuration: Single); overload; procedure SetMix(const AFrom, ATo: TSpineAnimation; const ADuration: Single); overload; function GetMix(const AFrom, ATo: TSpineAnimation): Single; end; TIkConstraintData = class(TObject) private FName: string; FBoneDatas: TList<TBoneData>; public Order: Integer; Mix: Single; BendDirection: Integer; Target: TBoneData; property Name: string read FName; property BoneDatas: TList<TBoneData> read FBoneDatas; public constructor Create(const AName: string); destructor Destroy; override; end; TTransformConstraintData = class(TObject) private FName: string; FBoneDatas: TList<TBoneData>; public Order: Integer; Target: TBoneData; RotateMix, TranslateMix, ScaleMix, ShearMix: Single; OffsetRotation, OffsetX, OffsetY, OffsetScaleX, OffsetScaleY, OffsetShearY: Single; Relative, Local: Boolean; property Name: string read FName; property BoneDatas: TList<TBoneData> read FBoneDatas; public constructor Create(const AName: string); destructor Destroy; override; end; TPathConstraintData = class(TObject) private FName: string; FBoneDatas: TList<TBoneData>; public Order: Integer; Relative: Boolean; Local: Boolean; Target: TSlotData; PositionMode: TPositionMode; SpacingMode: TSpacingMode; RotateMode: TRotateMode; OffsetRotation, Position, Spacing, RotateMix, TranslateMix: Single; property Name: string read FName; property BoneDatas: TList<TBoneData> read FBoneDatas; public constructor Create(const AName: string); destructor Destroy; override; end; implementation { TSkeletonData } constructor TSkeletonData.Create; begin inherited Create; FPathConstraintDatas:= TObjectList<TPathConstraintData>.Create; FIkConstraintDatas:= TObjectList<TIkConstraintData>.Create; FTransformConstraintDatas:= TObjectList<TTransformConstraintData>.Create; FEventDatas:= TObjectList<TEventData>.Create; FBoneDatas:= TObjectList<TBoneData>.Create; FSkins:= TObjectList<TSpineSkin>.Create; FSlotDatas:= TObjectList<TSlotData>.Create; FAnimations:= TObjectList<TSpineAnimation>.Create; end; destructor TSkeletonData.Destroy; begin FPathConstraintDatas.Free; FIkConstraintDatas.Free; FTransformConstraintDatas.Free; FEventDatas.Free; FBoneDatas.Free; FSkins.Free; FSlotDatas.Free; FAnimations.Free; inherited; end; function TSkeletonData.FindBone(const ABoneDataName: string): TBoneData; var i: Integer; begin result:= nil; if ABoneDataName.Trim.IsEmpty then raise Exception.Create('boneDataName cannot be null.'); for i:= 0 to FBoneDatas.Count -1 do begin if FBoneDatas.Items[i].Name = ABoneDataName then exit(FBoneDatas.Items[i]); end; end; function TSkeletonData.FindBoneIndex(const ABoneDataName: string): Integer; var i: Integer; begin result:= -1; if ABoneDataName.Trim.IsEmpty then raise Exception.Create('boneDataName cannot be null.'); for i:= 0 to FBoneDatas.Count -1 do begin if FBoneDatas.Items[i].Name = ABoneDataName then exit(i); end; end; function TSkeletonData.FindSkin(const ASkinName: string): TSpineSkin; var lSkin: TSpineSkin; begin result:= nil; if ASkinName.Trim.IsEmpty then raise Exception.Create('skinName cannot be null.'); for lSkin in FSkins do if lSkin.Name = ASkinName then exit(lSkin); end; function TSkeletonData.FindSlot(const ASlotDataName: string): TSlotData; var i: Integer; begin result:= nil; if ASlotDataName.Trim.IsEmpty then raise Exception.Create('slotDataName cannot be null.'); for i:= 0 to FSlotDatas.Count -1 do begin if FSlotDatas.Items[i].Name = ASlotDataName then exit(FSlotDatas.Items[i]); end; end; function TSkeletonData.FindSlotIndex(const ASlotDataName: string): Integer; var i: Integer; begin result:= -1; if ASlotDataName.Trim.IsEmpty then raise Exception.Create('slotDataName cannot be null.'); for i:= 0 to FSlotDatas.Count -1 do begin if FSlotDatas.Items[i].Name = ASlotDataName then exit(i); end; end; function TSkeletonData.FintEvent(const AEventDataName: string): TEventData; var lData: TEventData; begin result:= nil; if AEventDataName.Trim.IsEmpty then raise Exception.Create('eventDataName cannot be null.'); for lData in FEventDatas do if lData.Name = AEventDataName then exit(lData); end; function TSkeletonData.FindAnimation(const AAnimationName: string): TSpineAnimation; var i: Integer; begin result:= nil; if AAnimationName.Trim.IsEmpty then raise Exception.Create('animationName cannot be null.'); for i:= 0 to FAnimations.Count -1 do begin if FAnimations.Items[i].Name = AAnimationName then exit(FAnimations.Items[i]); end; end; function TSkeletonData.FindIkConstraint( const AConstraintDataName: string): TIkConstraintData; var i: Integer; begin result:= nil; if AConstraintDataName.Trim.IsEmpty then raise Exception.Create('constraintDataName cannot be null.'); for i:= 0 to FIkConstraintDatas.Count -1 do begin if FIkConstraintDatas.Items[i].Name = AConstraintDataName then exit(FIkConstraintDatas.Items[i]); end; end; function TSkeletonData.FindPathConstraint( const AConstraintDataName: string): TPathConstraintData; var i: Integer; begin result:= nil; if AConstraintDataName.Trim.IsEmpty then raise Exception.Create('constraintDataName cannot be null.'); for i:= 0 to FPathConstraintDatas.Count -1 do begin if FPathConstraintDatas.Items[i].Name = AConstraintDataName then exit(FPathConstraintDatas.Items[i]); end; end; function TSkeletonData.FindPathConstraintIndex( const AConstraintDataName: string): Integer; var i: Integer; begin result:= -1; if AConstraintDataName.Trim.IsEmpty then raise Exception.Create('constraintDataName cannot be null.'); for i:= 0 to FIkConstraintDatas.Count -1 do begin if FIkConstraintDatas.Items[i].Name = AConstraintDataName then exit(i); end; end; function TSkeletonData.FindTransformConstraint( const AConstraintDataName: string): TTransformConstraintData; var i: Integer; begin result:= nil; if AConstraintDataName.Trim.IsEmpty then raise Exception.Create('constraintDataName cannot be null.'); for i:= 0 to FTransformConstraintDatas.Count -1 do begin if FTransformConstraintDatas.Items[i].Name = AConstraintDataName then exit(FTransformConstraintDatas.Items[i]); end; end; { TBoneData } constructor TBoneData.Create(const AIndex: Integer; const AName: string; const AParent: TBoneData); begin inherited Create; if AIndex < 0 then raise Exception.Create('index must be >= 0.'); if AName.Trim.IsEmpty then raise Exception.Create('name cannot be null.'); FIndex:= AIndex; FName:= AName; FParent:= AParent; ScaleX:= 1; ScaleY:= 1; TransformMode:= TTransformMode.tmNormal; end; { TSlotData } constructor TSlotData.Create(const AIndex: Integer; const AName: string; const ABoneData: TBoneData); begin inherited Create; if AIndex < 0 then raise Exception.Create('index must be >= 0.'); if AName.Trim.IsEmpty then raise Exception.Create('name cannot be null.'); if not Assigned(ABoneData) then raise Exception.Create('boneData cannot be null.'); FIndex:= AIndex; FName:= AName; FBoneData:= ABoneData; R:= 1; G:= 1; B:= 1; A:= 1; R2:= 0; G2:= 0; B2:= 0; HasSecondColor:= False; end; { TEventData } constructor TEventData.Create(const AName: string); begin inherited Create; if AName.Trim.IsEmpty then raise Exception.Create('name cannot be null.'); FName:= AName; end; { TAnimationStateData } constructor TAnimationStateData.Create(const ASkeletonData: TSkeletonData); begin inherited Create; if not Assigned(ASkeletonData) then raise Exception.Create('skeletonData cannot be null.'); FAnimationToMixTime:= TDictionary<TAnimationPair, Single>.Create; FSkeletonData:= ASkeletonData; end; destructor TAnimationStateData.Destroy; begin FAnimationToMixTime.Free; inherited; end; procedure TAnimationStateData.SetMix(const AFromName, AToName: string; const ADuration: Single); var lFrom, lTo: TSpineAnimation; begin lFrom:= FSkeletonData.FindAnimation(AFromName); if not Assigned(lFrom) then raise Exception.CreateFmt('Animation not found: %s',[AFromName]); lTo:= FSkeletonData.FindAnimation(AToName); if not Assigned(lTo) then raise Exception.CreateFmt('Animation not found: %s',[AToName]); SetMix(lFrom, lTo, ADuration); end; procedure TAnimationStateData.SetMix(const AFrom, ATo: TSpineAnimation; const ADuration: Single); var lKey: TAnimationPair; begin if not Assigned(AFrom) then raise Exception.Create('from animation cannot be null.'); if not Assigned(ATo) then raise Exception.Create('to animation cannot be null.'); lKey.A1:= AFrom; lKey.A2:= ATo; FAnimationToMixTime.AddOrSetValue(lKey, ADuration); end; function TAnimationStateData.GetMix(const AFrom, ATo: TSpineAnimation): Single; var lKey: TAnimationPair; begin if not Assigned(AFrom) then raise Exception.Create('from animation cannot be null.'); if not Assigned(ATo) then raise Exception.Create('to animation cannot be null.'); lKey.A1:= AFrom; lKey.A2:= ATo; if not FAnimationToMixTime.TryGetValue(lKey, result) then result:= DefaultMix; end; { TIkConstraintData } constructor TIkConstraintData.Create(const AName: string); begin inherited Create; if AName.Trim.IsEmpty then raise Exception.Create('name cannot be null.'); FName:= AName; FBoneDatas:= TList<TBoneData>.Create; end; destructor TIkConstraintData.Destroy; begin FBoneDatas.Free; inherited; end; { TTransformConstraintData } constructor TTransformConstraintData.Create(const AName: string); begin inherited Create; if AName.Trim.IsEmpty then raise Exception.Create('name cannot be null.'); FName:= AName; FBoneDatas:= TList<TBoneData>.Create; end; destructor TTransformConstraintData.Destroy; begin FBoneDatas.Free; inherited; end; { TPathConstraintData } constructor TPathConstraintData.Create(const AName: string); begin inherited Create; if AName.Trim.IsEmpty then raise Exception.Create('name cannot be null.'); FName:= AName; FBoneDatas:= TList<TBoneData>.Create; end; destructor TPathConstraintData.Destroy; begin FBoneDatas.Free; inherited; end; end.
各种数据
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Delphi Format、FormatFloat与FormatDateTime的用法 2020-05-22
- Delphi-基础(for循环) 2019-12-02
- BussinessSkinForm 入门教程 2019-08-16
- Delphi BusinessSkinForm使用说明 2019-08-16
- webform 简单的服务器控件。 2018-06-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash