![]() |
Andorra 2d Klasseninstanzen (Sprites)
Hallo Leute!
Wie kann ich auf einzelne Instanzen einer von TImageSprite abgeleiteten Klasse zugreifen?
Delphi-Quellcode:
Ich möchte also jetzt zum Beispiel schreiben: Kugel1.X := Kugel2.X - Kugel3.X
for i:=1 to Kugelanzahl do
begin with TKugel.Create(AdSpriteEngine) do begin Image := AdImageList.Find('Kugel'+IntToStr(i)); Nummer := i; end; end; Aber wie greife ich auf Kugel1.X zu? |
AW: Andorra 2d Klasseninstanzen (Sprites)
Schlechte Lösung: FindComponent()
Besser: Ablage der Kugeln in Array oder Liste |
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)
|
AW: Andorra 2d Klasseninstanzen (Sprites)
Gut hat geklappt, danke!
|
AW: Andorra 2d Klasseninstanzen (Sprites)
Bitte nichts in ein zusätzliches Array speichern! Du kannst einfach über
![]() 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; |
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 |
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.
|
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) |
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:
zu setzen oder das Array ein Element zu verkürzen und alle anderen Elemente nach zu rücken etc.
nil
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. ;-) |
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 02:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz