Subversion Repositories spacemission

Rev

Go to most recent revision | Details | 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}
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.