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