Subversion Repositories spacemission

Rev

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

Rev Author Line No. Line
4 daniel-mar 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}
16 daniel-mar 17
{$WARNINGS OFF}
4 daniel-mar 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.