Subversion Repositories spacemission

Rev

Rev 4 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit DXSpriteEdit;
  2. //(c)2006-7 Jaro Benes
  3. //All Rights Reserved
  4.  
  5. {
  6. Complex application for users of unDelphiX as component editor:
  7.  
  8. Supported:
  9.  a) create sprite and store it into rersource.
  10.  b) allow do change and create complex sprite (background or particle).
  11.  c) default values for complex type too.
  12.  d) direct link to image from dximagelist.
  13.  
  14. }
  15. interface                  
  16. {$INCLUDE DelphiXcfg.inc}
  17. {$WARNINGS OFF}
  18. uses
  19.   Windows, SysUtils, Classes, Forms, Dialogs, Controls, ExtCtrls, StdCtrls,
  20.   Graphics, DXSprite, DXDraws;
  21.  
  22. type
  23.   {  TEdit  }
  24.  
  25.   TEdit = class(StdCtrls.TEdit) {injected class}  
  26.   private
  27.     function GetAsInteger: Integer;
  28.     procedure SetAsInteger(const Value: Integer);
  29.     function GetAsFloat: Double;
  30.     procedure SetAsFloat(const Value: Double);
  31.   published
  32.   public
  33.     property AsInteger: Integer read GetAsInteger write SetAsInteger;
  34.     property AsFloat: Double read GetAsFloat write SetAsFloat;
  35.   end;
  36.  
  37.   {  TDelphiXWaveEditForm  }
  38.  
  39.   TDelphiXSpriteEditForm = class(TForm)
  40.     Bevel2: TBevel;
  41.     OKButton: TButton;
  42.     CancelButton: TButton;
  43.     ClearButton: TButton;
  44.     Panel1: TPanel;
  45.     EAlpha: TEdit;
  46.     EAngle: TEdit;
  47.     EAnimCount: TEdit;
  48.     EAnimPos: TEdit;
  49.     EAnimSpeed: TEdit;
  50.     EAnimStart: TEdit;
  51.     EHeight: TEdit;
  52.     EMapHeight: TEdit;
  53.     EMapWidth: TEdit;
  54.     EWidth: TEdit;
  55.     EX: TEdit;
  56.     EY: TEdit;
  57.     EZ: TEdit;
  58.     LAlpha: TLabel;
  59.     LAngle: TLabel;
  60.     LAnimCount: TLabel;
  61.     LAnimPos: TLabel;
  62.     LAnimSpeed: TLabel;
  63.     LAnimStart: TLabel;
  64.     LHeight: TLabel;
  65.     LMapHeight: TLabel;
  66.     LMapWidth: TLabel;
  67.     LWidth: TLabel;
  68.     LX: TLabel;
  69.     LY: TLabel;
  70.     LZ: TLabel;
  71.     Label1: TLabel;
  72.     EBlendMode: TComboBox;
  73.     eImage: TComboBox;
  74.     Label2: TLabel;
  75.     Label3: TLabel;
  76.     Label4: TLabel;
  77.     ECenterX: TEdit;
  78.     ECenterY: TEdit;
  79.     chbBlurImage: TCheckBox;
  80.     chbAnimLooped: TCheckBox;
  81.     chbMoved: TCheckBox;
  82.     chbCollisioned: TCheckBox;
  83.     chbPixelCheck: TCheckBox;
  84.     chbTile: TCheckBox;
  85.     chbVisible: TCheckBox;
  86.     btnMapEdit: TButton;
  87.     Label5: TLabel;
  88.     ETexFilter: TComboBox;
  89.     procedure eImageChange(Sender: TObject);
  90.     procedure eImageExit(Sender: TObject);
  91.     procedure OKButtonClick(Sender: TObject);
  92.     procedure MapEditButtonClick(Sender: TObject);
  93.   private
  94.     FChanged: Boolean;
  95.     FvkType: TSpriteType;
  96.     FSprite: TSprite;
  97.     //
  98.     FDXImageList: TCustomDXImageList;
  99.     FDXImageName: string;
  100.     procedure FieldEnabler(SpriteType: TSpriteType);
  101.   public
  102.     procedure LoadDataToForm(AData: TPersistent);
  103.     function SaveDataFromForm: TPersistent;
  104.     property Sprite: TSprite read FSprite write FSprite;
  105.   end;
  106.  
  107. var
  108.   DelphiXSpriteEditForm: TDelphiXSpriteEditForm;
  109.  
  110. implementation
  111.  
  112. uses DXConsts, DXMapEdit, DXClass;
  113.  
  114. {$R *.DFM}
  115.  
  116. { TEdit }
  117.  
  118. function TEdit.GetAsFloat: Double;
  119. begin
  120.   try
  121.     Result := StrToFloat(Self.Text);
  122.   except
  123.     Result := 0;
  124.   end;
  125. end;
  126.  
  127. function TEdit.GetAsInteger: Integer;
  128. begin
  129.   try
  130.     Result := StrToInt(Self.Text);
  131.   except
  132.     Result := 0;
  133.   end;
  134. end;
  135.  
  136. procedure TEdit.SetAsFloat(const Value: Double);
  137. begin
  138.   Self.Text := FloatToStr(Value)
  139. end;
  140.  
  141. procedure TEdit.SetAsInteger(const Value: Integer);
  142. begin
  143.   Self.Text := IntToStr(Value)
  144. end;
  145.  
  146. { TDelphiXSpriteEditForm }
  147.  
  148. procedure TDelphiXSpriteEditForm.LoadDataToForm(AData: TPersistent);
  149.   procedure LoadAsSprite;
  150.   begin
  151.     with AData as TSprite do begin
  152.       chbCollisioned.Checked := Collisioned;
  153.       chbMoved.Checked := Moved;
  154.       chbVisible.Checked := Visible;
  155.       EHeight.AsInteger := Height;
  156.       EWidth.AsInteger := Width;
  157.       EX.AsFloat := X;
  158.       EY.AsFloat := Y;
  159.       EZ.AsInteger := Z;
  160.     end;
  161.     Caption := 'Sprite Init Editor (TSprite)';
  162.   end;
  163.   procedure LoadAsImageSprite;
  164.   var
  165.     ii: Integer;
  166.     pci: TPictureCollectionItem;
  167.   begin
  168.     LoadAsSprite;
  169.     with AData as TImageSprite do begin
  170.       EAnimCount.AsInteger := AnimCount;
  171.       chbAnimLooped.Checked := AnimLooped;
  172.       EAnimPos.AsFloat := AnimPos;
  173.       EAnimSpeed.AsFloat := AnimSpeed;
  174.       EAnimStart.AsInteger := AnimStart;
  175.       ECenterX.AsFloat := CenterX;
  176.       ECenterY.AsFloat := CenterY;
  177.       chbPixelCheck.Checked := PixelCheck;
  178.       chbTile.Checked := Tile;
  179.       EAlpha.AsInteger := Alpha;
  180.       EAngle.AsFloat := Angle;
  181.       EBlendMode.ItemIndex := Ord(BlendMode);
  182.       ETexFilter.ItemIndex := Ord(TextureFilter);
  183.       EImage.Clear;
  184.       if Assigned(DXImageList) then
  185.         for ii := 0 to DXImageList.Items.Count - 1 do begin
  186.           if DXImageList.Items[ii].Name = '' then
  187.             EImage.Items.Add('_unnamed_' + IntToStr(ii))
  188.           else
  189.             EImage.Items.Add(DXImageList.Items[ii].Name);
  190.         end;
  191.       {contain image}
  192.       pci := Image;
  193.       {is attached}
  194.       if Assigned(pci) then begin
  195.         {search in imagelist}
  196.         for ii := 0 to DXImageList.Items.Count - 1 do
  197.           if DXImageList.Items[ii] = pci then begin
  198.             EImage.ItemIndex := ii;
  199.             Break;
  200.           end;
  201.       end
  202.       else begin
  203.         if DXImageName <> '' then begin
  204.           ii := EImage.Items.IndexOf(DXImageName);
  205.           if ii <> -1 then
  206.             EImage.ItemIndex := ii;
  207.         end;
  208.       end;
  209.     end;
  210.     Caption := 'Sprite Init Editor (TImageSprite)';
  211.   end;
  212.   procedure LoadAsImageSpriteEx;
  213.   begin
  214.     LoadAsImageSprite;
  215.     Caption := 'Sprite Init Editor (TImageSpriteEx)';
  216.   end;
  217.   procedure LoadAsBackgroundSprite;
  218.   begin
  219.     LoadAsImageSprite;
  220.     with AData as TBackgroundSprite do begin
  221.       EMapHeight.AsInteger := MapHeight;
  222.       EMapWidth.AsInteger := MapWidth;
  223.       chbTile.Checked := Tile;
  224.     end;
  225.     btnMapEdit.Enabled := eImage.ItemIndex <> -1;
  226.     Caption := 'Sprite Init Editor (TBackgroundSprite)';
  227.   end;
  228. const
  229.   cktypearr: array[TSpriteType] of Integer = (0, 2, 3, 1);
  230. begin
  231.   FSprite := TSprite(AData);
  232.   FDXImageList := TSprite(AData).DXImageList;
  233.   if AData is TBackgroundSprite then Fvktype := stBackgroundSprite
  234.   else if AData is TImageSpriteEx then Fvktype := stImageSpriteEx
  235.   else if AData is TImageSprite then Fvktype := stImageSprite
  236.   else Fvktype := stSprite;
  237.  
  238.   FieldEnabler(Fvktype);
  239.   try
  240.     case Fvktype of
  241.       stSprite: LoadAsSprite;
  242.       stImageSprite: LoadAsImageSprite;
  243.       stImageSpriteEx: LoadAsImageSpriteEx;
  244.       stBackgroundSprite: LoadAsBackgroundSprite;
  245.     end;
  246.   except
  247.     on E: Exception do
  248.       ShowMessage(E.Message);
  249.   end;
  250. end;
  251.  
  252. function TDelphiXSpriteEditForm.SaveDataFromForm: TPersistent;
  253. var AData: TSprite;
  254.   procedure SaveAsSprite;
  255.   begin
  256.     with AData as TSprite do begin
  257.       Collisioned := chbCollisioned.Checked;
  258.       Moved := chbMoved.Checked;
  259.       Visible := chbVisible.Checked;
  260.       Height := EHeight.AsInteger;
  261.       Width := EWidth.AsInteger;
  262.       X := EX.AsFloat;
  263.       Y := EY.AsFloat;
  264.       Z := EZ.AsInteger;
  265.     end;
  266.   end;
  267.   procedure SaveAsImageSprite;
  268.   begin
  269.     SaveAsSprite;
  270.     with AData as TImageSprite do begin
  271.       AnimCount := EAnimCount.AsInteger;
  272.       AnimLooped := chbAnimLooped.Checked;
  273.       AnimPos := EAnimPos.AsFloat;
  274.       AnimSpeed := EAnimSpeed.AsFloat;
  275.       AnimStart := EAnimStart.AsInteger;
  276.       PixelCheck := chbPixelCheck.Checked;
  277.       Tile := chbTile.Checked;
  278.       Alpha := EAlpha.AsInteger;
  279.       Angle := EAngle.AsFloat;
  280.       CenterX := ECenterX.AsFloat;
  281.       CenterY := ECenterY.AsFloat;
  282.       BlendMode := TRenderType(EBlendMode.ItemIndex);
  283.       TextureFilter := TD2DTextureFilter(ETexFilter.ItemIndex);
  284.       BlurImage := chbBlurImage.Checked;
  285.       if Assigned(DXImageList) then
  286.         if DXImageName <> eImage.Text then
  287.           if eImage.ItemIndex <> -1 then begin
  288.             {DX}Image := DXImageList.Items[eImage.ItemIndex];
  289.             DXImageName := DXImageList.Items[eImage.ItemIndex].Name;
  290.           end;
  291.     end;
  292.   end;
  293.   procedure SaveAsImageSpriteEx;
  294.   begin
  295.     SaveAsImageSprite;
  296.   end;
  297.   procedure SaveAsBackgroundSprite;
  298.   begin
  299.     SaveAsImageSprite;
  300.     with AData as TBackgroundSprite do begin
  301.       MapHeight := EMapHeight.AsInteger;
  302.       Tile := chbTile.Checked;
  303.       MapWidth := EMapWidth.AsInteger;
  304.     end;
  305.   end;
  306. begin
  307.   Result := nil;
  308.   try
  309.     AData := FSprite;
  310.     case Fvktype of
  311.       stSprite: SaveAsSprite;
  312.       stImageSprite: SaveAsImageSprite;
  313.       stImageSpriteEx: SaveAsImageSpriteEx;
  314.       stBackgroundSprite: SaveAsBackgroundSprite;
  315.     end;
  316.     Result := AData;
  317.   except
  318.     on E: Exception do
  319.       ShowMessage(E.Message);
  320.   end;
  321. end;
  322.  
  323. procedure TDelphiXSpriteEditForm.OKButtonClick(Sender: TObject);
  324. begin
  325.   FChanged := True;
  326.   if FChanged then
  327.   begin
  328.     Tag := 1;
  329.   end;
  330.  
  331.   Close;
  332. end;
  333.  
  334. procedure TDelphiXSpriteEditForm.FieldEnabler(SpriteType: TSpriteType);
  335. var I: Integer;
  336. begin
  337.   ECenterX.Enabled := (SpriteType in [stImageSprite..stBackgroundSprite]);
  338.   ECenterY.Enabled := (SpriteType in [stImageSprite..stBackgroundSprite]);
  339.   EAlpha.Enabled := (SpriteType in [stImageSprite..stBackgroundSprite]);
  340.   EAngle.Enabled := (SpriteType in [stImageSprite..stBackgroundSprite]);
  341.   EBlendMode.Enabled := (SpriteType in [stImageSprite..stBackgroundSprite]);
  342.   EAnimCount.Enabled := (SpriteType in [stImageSprite, stImageSpriteEx]);
  343.   chbAnimLooped.Enabled := (SpriteType in [stImageSprite, stImageSpriteEx]);
  344.   EAnimPos.Enabled := (SpriteType in [stImageSprite, stImageSpriteEx]);
  345.   EAnimSpeed.Enabled := (SpriteType in [stImageSprite, stImageSpriteEx]);
  346.   EAnimStart.Enabled := (SpriteType in [stImageSprite, stImageSpriteEx]);
  347.   chbCollisioned.Enabled := (SpriteType in [stSprite..stBackgroundSprite]);
  348.   chbBlurImage.Enabled := (SpriteType in [stImageSprite, stImageSpriteEx]);
  349.   EHeight.Enabled := (SpriteType in [stSprite..stBackgroundSprite]);
  350.   EImage.Enabled := (SpriteType in [stImageSprite..stBackgroundSprite]);
  351.   EMapHeight.Enabled := (SpriteType in [stBackgroundSprite]);
  352.   EMapWidth.Enabled := (SpriteType in [stBackgroundSprite]);
  353.   chbMoved.Enabled := (SpriteType in [stSprite..stBackgroundSprite]);
  354.   chbPixelCheck.Enabled := (SpriteType in [stImageSprite, stImageSpriteEx]);
  355.   chbTile.Enabled := (SpriteType in [stImageSprite..stBackgroundSprite]);
  356.   chbVisible.Enabled := (SpriteType in [stSprite..stBackgroundSprite]);
  357.   chbBlurImage.Enabled := (SpriteType in [stImageSprite..stBackgroundSprite]);
  358.   EWidth.Enabled := (SpriteType in [stSprite..stBackgroundSprite]);
  359.   EX.Enabled := (SpriteType in [stSprite..stBackgroundSprite]);
  360.   EY.Enabled := (SpriteType in [stSprite..stBackgroundSprite]);
  361.   EZ.Enabled := (SpriteType in [stSprite..stBackgroundSprite]);
  362.   ETexFilter.Enabled := (SpriteType in [stImageSprite..stBackgroundSprite]);
  363.   for I := 0 to ComponentCount - 1 do begin
  364.     if (Components[I] is TEdit) then with (Components[I] as TEdit) do
  365.         if Enabled then Color := clWindow else Color := clBtnFace;
  366.     if (Components[I] is TComboBox) then with (Components[I] as TComboBox) do
  367.         if Enabled then Color := clWindow else Color := clBtnFace;
  368.   end
  369. end;
  370.  
  371. procedure TDelphiXSpriteEditForm.MapEditButtonClick(Sender: TObject);
  372. {only for editing maps for TBackgroudSprite}
  373. var
  374.   I{, J}: Integer;
  375.   Q: TBackgroundSprite;
  376. begin
  377.   DelphiXMapEditForm := TDelphiXMapEditForm.Create(nil);
  378.   try
  379.     DelphiXMapEditForm.DXImageList := FDXImageList; {local instance copy}
  380.     DelphiXMapEditForm.DXBackgroundSprite := TBackgroundSprite(FSprite);
  381.     {vymaz combo a natahni jmena}
  382.     DelphiXMapEditForm.ImageToSet.Items.Clear;
  383.     DelphiXMapEditForm.ImageToSet.Items.Assign(EImage.Items);
  384.     DelphiXMapEditForm.ImageToSet.ItemIndex := EImage.ItemIndex;
  385.     DelphiXMapEditForm.PicturesToChip.Visible := DelphiXMapEditForm.LoadSplittedImage{$IFNDEF VER4UP}(False){$ENDIF};
  386.     {nepovolit zmenu, pokud byla udelana uz na hlavnim formu}
  387.     DelphiXMapEditForm.ImageToSet.Enabled := DelphiXMapEditForm.ImageToSet.ItemIndex = -1;
  388.     if Assigned(FSprite) then begin
  389.       Q := TBackgroundSprite(FSprite);
  390.       if not Q.IsMapEmpty then begin
  391.         DelphiXMapEditForm.eMapSizeX.Value := Q.MapWidth;
  392.         DelphiXMapEditForm.eMapSizeY.Value := Q.MapHeight;
  393.         {velikost podle dlazdice v listu}
  394.         I := DelphiXMapEditForm.ImageToSet.ItemIndex;
  395.         if I <> -1 then begin
  396.           DelphiXMapEditForm.EWidth.AsInteger := DelphiXMapEditForm.DXImageList.Items[I].Width; ;
  397.           DelphiXMapEditForm.EHeight.AsInteger := DelphiXMapEditForm.DXImageList.Items[I].Height;
  398.         end;
  399.         DelphiXMapEditForm.ResizeMapArea;
  400.       end
  401.       else
  402.         DelphiXMapEditForm.ResizeMapArea;
  403.     end;
  404.     {pokud je regulerni jmeno obrazku na spritu, vyber ho}
  405.     with DelphiXMapEditForm.ImageToSet do
  406.       if FDXImageName <> '' then
  407.         ItemIndex := Items.IndexOf(FDXImageName);
  408.     {nastav tam jeste obrabeny sprite}
  409.     DelphiXMapEditForm.DXBackGroundSprite := TBackgroundSprite(FSprite);
  410.     DelphiXMapEditForm.MapArea.DefaultColWidth := DelphiXMapEditForm.EWidth.AsInteger;
  411.     DelphiXMapEditForm.MapArea.DefaultRowHeight := DelphiXMapEditForm.EHeight.AsInteger;
  412.     {a volej dialog}
  413.     DelphiXMapEditForm.eMapSizeX.OnChange := DelphiXMapEditForm.BtnSetSizeClick;
  414.     DelphiXMapEditForm.eMapSizeY.OnChange := DelphiXMapEditForm.BtnSetSizeClick;
  415.     if DelphiXMapEditForm.ShowModal = mrOK then begin
  416.       {pokud je vse OK, uloz mapu ke spritu}
  417.       if Assigned(DelphiXMapEditForm.DXBackGroundSprite) then begin
  418.         FDXImageName := '';
  419.         if DelphiXMapEditForm.ImageToSet.ItemIndex <> -1 then
  420.           FDXImageName := FDXImageList.Items[DelphiXMapEditForm.ImageToSet.ItemIndex].Name;
  421.         EMapHeight.AsInteger := DelphiXMapEditForm.eMapSizeY.Value;
  422.         EMapWidth.AsInteger := DelphiXMapEditForm.eMapSizeX.Value;
  423.       end;
  424.     end;
  425.   finally
  426.     DelphiXMapEditForm.Free;
  427.     DelphiXMapEditForm := nil;
  428.   end;
  429. end;
  430.  
  431. procedure TDelphiXSpriteEditForm.eImageExit(Sender: TObject);
  432. begin
  433.   if eImage.ItemIndex <> -1 then begin
  434.     EWidth.AsInteger := FDXImageList.Items[eImage.ItemIndex].Width;
  435.     EHeight.AsInteger := FDXImageList.Items[eImage.ItemIndex].Height;
  436.   end;
  437. end;
  438.  
  439. procedure TDelphiXSpriteEditForm.eImageChange(Sender: TObject);
  440. begin
  441.   if FvkType = stBackgroundSprite then
  442.     btnMapEdit.Enabled := eImage.ItemIndex <> -1
  443.   else
  444.     btnMapEdit.Enabled := False;
  445. end;
  446.  
  447. end.
  448.