ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码

Spine Runtime for Delphi移植笔记(八) - spinedata

来源:网络整理     时间:2017-08-02     关键词:

本篇文章主要介绍了" Spine Runtime for Delphi移植笔记(八) - spinedata",主要涉及到方面的内容,对于Delphijrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: ////////////////////////////////////////////////////////////////////////////////...

////////////////////////////////////////////////////////////////////////////////
//Generic delphi runtime v3.6 for Spine animation tool                        //
//Runtime port by cjk (hzi1980@163.com)                                       //
////////////////////////////////////////////////////////////////////////////////unit spine.data;

interfaceuses
  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;
    FIkConstraintDatas: TObjectList;
    FTransformConstraintDatas: TObjectList;
    FEventDatas: TObjectList;
    FBoneDatas: TObjectList;
    FSkins: TObjectList;
    FSlotDatas: TObjectList;
    FAnimations: TObjectList;
  public
    Name: string;
    DefaultSkin: TSpineSkin;
    Width, Height: Single;
    Version: string;
    Hash: string;
    ImagesPath: string;
    FPS: Single;
    property BoneDatas: TObjectList read FBoneDatas;
    property SlotDatas: TObjectList read FSlotDatas;
    property Skins: TObjectList read FSkins;
    property EventDatas: TObjectList read FEventDatas;
    property Animations: TObjectList read FAnimations;
    property IkConstraintDatas: TObjectList read FIkConstraintDatas;
    property TransformConstraintDatas: TObjectList read FTransformConstraintDatas;
    property PathConstraintDatas: TObjectList read FPathConstraintDatas;
  publicconstructorCreate;
    destructorDestroy; 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: stringread FName;
    property Parent: TBoneData read FParent;
  publicconstructorCreate(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: stringread FName;
    property BoneData: TBoneData read FBoneData;
  publicconstructorCreate(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: stringread FName;
  publicconstructorCreate(const AName: string);
  end;

  TAnimationPair = record
    A1: TSpineAnimation;
    A2: TSpineAnimation;
  end;
  TAnimationStateData = class(TObject)
  private
    FSkeletonData: TSkeletonData;
    FAnimationToMixTime: TDictionary;
  public
    DefaultMix: Single;
    property SkeletonData: TSkeletonData read FSkeletonData;
  publicconstructorCreate(const ASkeletonData: TSkeletonData);
    destructorDestroy; 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;
  public
    Order: Integer;
    Mix: Single;
    BendDirection: Integer;
    Target: TBoneData;
    property Name: stringread FName;
    property BoneDatas: TList read FBoneDatas;
  publicconstructorCreate(const AName: string);
    destructorDestroy; override;
  end;

  TTransformConstraintData = class(TObject)
  private
    FName: string;
    FBoneDatas: TList;
  public
    Order: Integer;
    Target: TBoneData;
    RotateMix, TranslateMix, ScaleMix, ShearMix: Single;
    OffsetRotation, OffsetX, OffsetY, OffsetScaleX, OffsetScaleY, OffsetShearY: Single;
    Relative, Local: Boolean;
    property Name: stringread FName;
    property BoneDatas: TList read FBoneDatas;
  publicconstructorCreate(const AName: string);
    destructorDestroy; override;
  end;

  TPathConstraintData = class(TObject)
  private
    FName: string;
    FBoneDatas: TList;
  public
    Order: Integer;
    Relative: Boolean;
    Local: Boolean;
    Target: TSlotData;
    PositionMode: TPositionMode;
    SpacingMode: TSpacingMode;
    RotateMode: TRotateMode;
    OffsetRotation, Position, Spacing, RotateMix, TranslateMix: Single;
    property Name: stringread FName;
    property BoneDatas: TList read FBoneDatas;
  publicconstructorCreate(const AName: string);
    destructorDestroy; override;
  end;

implementation{ TSkeletonData }constructor TSkeletonData.Create;
begininheritedCreate;
  FPathConstraintDatas:= TObjectList.Create;
  FIkConstraintDatas:= TObjectList.Create;
  FTransformConstraintDatas:= TObjectList.Create;
  FEventDatas:= TObjectList.Create;
  FBoneDatas:= TObjectList.Create;
  FSkins:= TObjectList.Create;
  FSlotDatas:= TObjectList.Create;
  FAnimations:= TObjectList.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 thenraise Exception.Create('boneDataName cannot be null.');
  for i:= 0to FBoneDatas.Count -1dobeginif 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 thenraise Exception.Create('boneDataName cannot be null.');
  for i:= 0to FBoneDatas.Count -1dobeginif 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 thenraise Exception.Create('skinName cannot be null.');
  for lSkin in FSkins doif lSkin.Name = ASkinName then
      exit(lSkin);
end;

function TSkeletonData.FindSlot(const ASlotDataName: string): TSlotData;
var
  i: Integer;
begin
  result:= nil;
  if ASlotDataName.Trim.IsEmpty thenraise Exception.Create('slotDataName cannot be null.');
  for i:= 0to FSlotDatas.Count -1dobeginif 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 thenraise Exception.Create('slotDataName cannot be null.');
  for i:= 0to FSlotDatas.Count -1dobeginif 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 thenraise Exception.Create('eventDataName cannot be null.');
  for lData in FEventDatas doif lData.Name = AEventDataName then
      exit(lData);
end;

function TSkeletonData.FindAnimation(const AAnimationName: string): TSpineAnimation;
var
  i: Integer;
begin
  result:= nil;
  if AAnimationName.Trim.IsEmpty thenraise Exception.Create('animationName cannot be null.');
  for i:= 0to FAnimations.Count -1dobeginif 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 thenraise Exception.Create('constraintDataName cannot be null.');
  for i:= 0to FIkConstraintDatas.Count -1dobeginif 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 thenraise Exception.Create('constraintDataName cannot be null.');
  for i:= 0to FPathConstraintDatas.Count -1dobeginif 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 thenraise Exception.Create('constraintDataName cannot be null.');
  for i:= 0to FIkConstraintDatas.Count -1dobeginif 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 thenraise Exception.Create('constraintDataName cannot be null.');
  for i:= 0to FTransformConstraintDatas.Count -1dobeginif 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);
begininheritedCreate;
  if AIndex < 0thenraise Exception.Create('index must be >= 0.');
  if AName.Trim.IsEmpty thenraise 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);
begininheritedCreate;
  if AIndex < 0thenraise Exception.Create('index must be >= 0.');
  if AName.Trim.IsEmpty thenraise Exception.Create('name cannot be null.');
  ifnot Assigned(ABoneData) thenraise 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);
begininheritedCreate;
  if AName.Trim.IsEmpty thenraise Exception.Create('name cannot be null.');
  FName:= AName;
end;

{ TAnimationStateData }constructor TAnimationStateData.Create(const ASkeletonData: TSkeletonData);
begininheritedCreate;
  ifnot Assigned(ASkeletonData) thenraise Exception.Create('skeletonData cannot be null.');
  FAnimationToMixTime:= TDictionary.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);
  ifnot Assigned(lFrom) thenraise Exception.CreateFmt('Animation not found: %s',[AFromName]);
  lTo:= FSkeletonData.FindAnimation(AToName);
  ifnot Assigned(lTo) thenraise 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;
beginifnot Assigned(AFrom) thenraise Exception.Create('from animation cannot be null.');
  ifnot Assigned(ATo) thenraise 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;
beginifnot Assigned(AFrom) thenraise Exception.Create('from animation cannot be null.');
  ifnot Assigned(ATo) thenraise Exception.Create('to animation cannot be null.');
    lKey.A1:= AFrom;
  lKey.A2:= ATo;
  ifnot FAnimationToMixTime.TryGetValue(lKey, result) then
    result:= DefaultMix;
end;

{ TIkConstraintData }constructor TIkConstraintData.Create(const AName: string);
begininheritedCreate;
  if AName.Trim.IsEmpty thenraise Exception.Create('name cannot be null.');
  FName:= AName;
  FBoneDatas:= TList.Create;
end;

destructor TIkConstraintData.Destroy;
begin
  FBoneDatas.Free;
  inherited;
end;

{ TTransformConstraintData }constructor TTransformConstraintData.Create(const AName: string);
begininheritedCreate;
  if AName.Trim.IsEmpty thenraise Exception.Create('name cannot be null.');
  FName:= AName;
  FBoneDatas:= TList.Create;
end;

destructor TTransformConstraintData.Destroy;
begin
  FBoneDatas.Free;
  inherited;
end;

{ TPathConstraintData }constructor TPathConstraintData.Create(const AName: string);
begininheritedCreate;
  if AName.Trim.IsEmpty thenraise Exception.Create('name cannot be null.');
  FName:= AName;
  FBoneDatas:= TList.Create;
end;

destructor TPathConstraintData.Destroy;
begin
  FBoneDatas.Free;
  inherited;
end;

end.

各种数据

以上就介绍了 Spine Runtime for Delphi移植笔记(八) - spinedata,包括了方面的内容,希望对Delphijrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播有兴趣的朋友有所帮助。

本文网址链接:http://www.codes51.com/article/detail_4417750.html

相关图片

相关文章