Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Andorra 2d Klasseninstanzen (Sprites) (https://www.delphipraxis.net/153387-andorra-2d-klasseninstanzen-sprites.html)

Noobmaster 31. Jul 2010 12:14

Andorra 2d Klasseninstanzen (Sprites)
 
Hallo Leute!
Wie kann ich auf einzelne Instanzen einer von TImageSprite abgeleiteten Klasse zugreifen?
Delphi-Quellcode:
          for i:=1 to Kugelanzahl do
          begin
               with TKugel.Create(AdSpriteEngine) do
               begin
                    Image := AdImageList.Find('Kugel'+IntToStr(i));
                    Nummer := i;
               end;
          end;
Ich möchte also jetzt zum Beispiel schreiben: Kugel1.X := Kugel2.X - Kugel3.X
Aber wie greife ich auf Kugel1.X zu?

mkinzler 31. Jul 2010 12:15

AW: Andorra 2d Klasseninstanzen (Sprites)
 
Schlechte Lösung: FindComponent()
Besser: Ablage der Kugeln in Array oder Liste

Noobmaster 31. Jul 2010 12:17

AW: Andorra 2d Klasseninstanzen (Sprites)
 
Wie muss ich dann obiges Beispiel abwandeln, um die Instanzen in Arrays abzulegen?
Ich habe bisher Klasseinstanzen immer mit Arrays erstellt, aber Andorra 2d verwirrt mich immer ein bisschen.
Delphi-Quellcode:
Kugel[1] := TKugel.Create(AdSpriteEngine)
?

Noobmaster 31. Jul 2010 12:24

AW: Andorra 2d Klasseninstanzen (Sprites)
 
Gut hat geklappt, danke!

igel457 31. Jul 2010 13:10

AW: Andorra 2d Klasseninstanzen (Sprites)
 
Bitte nichts in ein zusätzliches Array speichern! Du kannst einfach über SpriteEngine.Items darauf zugreifen.

Beispiel:
Delphi-Quellcode:
var
  k: TKugel;

for i := 0 to SpriteEngine.Items.Count - 1 do
begin
  if SpriteEngine.Items[i] is TKugel then
  begin
    k := TKugel(SpriteEngine.Items[i]);
    k.TuWasMitDerKugel();
  end;
end;

Noobmaster 31. Jul 2010 16:25

AW: Andorra 2d Klasseninstanzen (Sprites)
 
Dumme Frage: Was passiert denn, wenn man trotzdem in einem weiteren Array abspeichert?
Ich mein, ob ich jetzt k als Array mache und dort alle Klasseninstanzen abspeichere oder alle Klasseninstanzen sofort als Array erstelle macht doch im Prinzip keinen Unterschied. Ich finde, dass letztere Lösung sogar die einfachere und elegantere Lösung ist. Sollte ich mich irren - so gut kenne ich mich da ja nicht aus - dann sag bitte bescheid, wieso man das nicht machen sollte.
Danke

igel457 31. Jul 2010 16:57

AW: Andorra 2d Klasseninstanzen (Sprites)
 
Problem ist, dass du dich zusätzlich darum kümmern musst die Referenzen in deinem Array zu löschen, sobald du ein Sprite entfernst - mit der anderen Methode ist sichergestellt, dass du auch nur auf Sprites zugreifen kannst, die noch existieren.

Noobmaster 1. Aug 2010 09:29

AW: Andorra 2d Klasseninstanzen (Sprites)
 
Dass heißt, dass ich die Anstanzen auch freigeben muss, also Kugel[x].free ?
Dabei bekomme ich aber nur Fehlermeldungen am Ende (SIGSEGV)

igel457 1. Aug 2010 10:08

AW: Andorra 2d Klasseninstanzen (Sprites)
 
Nein, wie im Tutorial geschrieben, solltest du Sprites niemals mit Free, sondern mit der Funktion "Dead" freigeben.

Ich meinte nur, dass wenn du in deinem Array noch eine Referenz auf das Sprite-Objekt hast, du aber das Sprite mit
Dead freigibst, das Sprite zwar nicht mehr existiert, in deinem Array jedoch noch eine Referenz auf die Speicherstelle ist, an der mal das Sprite war. Versuchst du jetzt dennoch darauf zuzugreifen, bekommst du einen Zugriffsfehler.

Du musst dich also nochmal explizit darum kümmern, die Referenz in deinem Array auf
Delphi-Quellcode:
nil
zu setzen oder das Array ein Element zu verkürzen und alle anderen Elemente nach zu rücken etc.

Verwendest du gleich die Liste der Sprites hast du dieses zusätzliche Problem nicht.

Sonst spricht eigentlich nichts gegen das Array, außer dass es dein Programm fehleranfälliger macht, wenn du nicht genau weißt, was du eigentlich machst. ;-)

Noobmaster 2. Aug 2010 08:54

AW: Andorra 2d Klasseninstanzen (Sprites)
 
Wenn ich aber nicht mehr auf die Arrays zugreifen muss, wenn die Sprites nicht mehr existieren, dann sollte ich doch eigentlich keine Probleme haben, oder?
In Zukunft werde ich natürlich die von dir vorgeschlagene Methode verwenden, aber für mein derzeitiges Projekt würden die Arrays für mich ausreichen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:05 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