Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [Andorra2D] Löschen von Sprites (Problem gelöst) (https://www.delphipraxis.net/128175-%5Bandorra2d%5D-loeschen-von-sprites-problem-geloest.html)

Phill 25. Jan 2009 19:39


[Andorra2D] Löschen von Sprites (Problem gelöst)
 
Hi DPler,
Ich arbeite nun gut 3Monate an einem Shoot-em-up, behilflich is mir dabei die grandiose Engine von Andorra 2D und nun bin ich auf ein Problem gestoßen, was glaube ich sehr simpel zu lösen sein müsste und ich staune das ich es während meiner Arbeit an dem Projekt noch nie brauchte aber es ist wies ist und hier mal ausführlich:

Ich habe eine ganze Reihe von TImageSprites die alle einer AdSpriteEngine unterworfen sind, Manche dieser TImageSprites beinhalten Grafiken des Interfaces (Spielzeit, Punkte, Leben, Levelanzeige etc) und andere TImageSprites währen zum Beispiel die feindlichen Schiffe.
Nun ist es der Fall das ich mehrere (selbstdefinierte TImagesprite-klassen (glaube man nennt das Records)) löschen möchte (.dead) aber andere nicht!...
ich weiß ich kann mit AdSpriteEngine.items.dead; ALLE Sprites killen und ich kann mit Adspriteengine.Items.Delete(integer); Das, je nach Integerwert, erste, zweite, dritte etc Sprite killen. Ich hatte Versucht eine zweite Spriteengine zu implementieren um alles was gelöscht werden kann in diese zweite zu packen und dann eben nur sie zu löschen, aber schon das implementieren einer zweiten SpriteEngine endete in Fehlermeldungen....

hoffe ich konnte erklären was ich meine. Danke im Vorraus

Codewalker 26. Jan 2009 15:30

Re: [Andorra2D] Löschen von Sprites
 
Die SpriteEngine bietet doch dafür eine Methode Items.Remove(Sprite) an.
Siehe auch in der Andorra-Doku: hier

Phill 26. Jan 2009 15:41

Re: [Andorra2D] Löschen von Sprites
 
Hallo Codewalker. Danke für den Tipp, nur habe ich den Befehl bereits probiert und habe folgendes Problem: wenn ich ein Sprite mehrfach verwende:

ShopGegner := TImageSprite.Create(adSpriteengine); with ShopGegner do begin x:=100; z:=22; end;
ShopGegner := TImageSprite.Create(adSpriteengine); with ShopGegner do begin x:=200; z:=22; end;
ShopGegner := TImageSprite.Create(adSpriteengine); with ShopGegner do begin x:=300; z:=22; end;
(er malt nun ein Bild an drei verschiedene Stellen

Nun löscht AdSpriteengine.items.remove(shopgegner) nur den letzten Sprite, also den bei x:=300, die andern bleiben erzahlten.

Das ist Problem nummer 1 und garnicht mal so schlimm, schlimmer ist jedoch das die meißten Sprites in Klassen zusammgefasst sind:

TGegner1 = class(TImageSprite) XSpeed,YSpeed,HP,AP:integer;
private protected procedure DoMove(TimeGap:double);override;
procedure DoShoot(Sprite: TSprite);
public constructor Create(AParent:TSprite);override; end;

AdSpriteengine.items.remove(TGegner1) geht leider nicht, ich weiß auch nicht wie ich die einzelnen Sprites der klasse anspreche :(



edit:

also ich seh grad mit viel mühe und schreib und rechenaufwand könnte man mein problem via form1.AdSpriteEngine.Items.Remove(Adspriteengine.G etSpriteAt(x,y)); lösen, aber das ist eigentlich nicht optimal, würde mich freuen wenn mir wer weiter hilft

Codewalker 26. Jan 2009 16:49

Re: [Andorra2D] Löschen von Sprites
 
ShopGegner := TImageSprite.Create(adSpriteengine); with ShopGegner do begin x:=100; z:=22; end;
ShopGegner := TImageSprite.Create(adSpriteengine); with ShopGegner do begin x:=200; z:=22; end;
ShopGegner := TImageSprite.Create(adSpriteengine); with ShopGegner do begin x:=300; z:=22; end;

Das ist imho ganz schlechter Programmierstil. Wenn du auf das Objekt nacher noch zugreifen willst, dann behalte Dir auch eine Referenz. Verwalte die ShopGegner in einem Array und du kannst problemlos auf jeden einzelnen zugreifen.

Phill 26. Jan 2009 17:06

Re: [Andorra2D] Löschen von Sprites
 
Hmpf ja das macht natürlich Sinn^^ danke.
Kannst du mir noch dabei helfen die (Klassen? Records?) einzeln zu löschen? (Weiß nicht genau wie man das nennt, hab 2 posts über dem hier nen Beispiel dafür).

Danke

edit: habe einige Teile des Programms so umgeschrieben dass ich mit der Spriteengine.items.remove() funktion arbeiten kann. danke für die Hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz