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. |