Subversion Repositories spacemission

Rev

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