So hier mal
eine der möglichen Varianten.
Ich weiß nicht genau ob du die "Index-Schreibweise" wie es bei den PB-Sachen ist lieber willst, oder mit Pointern arbeitest, oder jetzt neu mit Namen:
A: CreatePartikelEmitter(#PartikelEmitter1, x.f, y.f) ; LinkedList/Array Konbination
B: *PartikelEmitter1 = CreatePartikelEmitter(x.f, y.f) ; LinkedList
C: CreatePartikelEmitter("PartikelEmitter1", x.f, y.f) ; Map
Hier n Variante mit Pointern:
Code: Alles auswählen
Structure Partikel
*PartikelEmitter.PartikelEmitter
x.f
y.f
EndStructure
Structure PartikelEmitter
*StartPartikel.Partikel
x.f
y.f
EndStructure
Global NewList Partikel.Partikel()
Global NewList PartikelEmitter.PartikelEmitter()
Procedure CreatePartikelEmitter(x.f, y.f)
If AddElement(PartikelEmitter())
PartikelEmitter()\x = x
PartikelEmitter()\y = y
PartikelEmitter()\StartPartikel = #False
ProcedureReturn PartikelEmitter()
EndIf
EndProcedure
Procedure CreatePartikel(*PartikelEmitter.PartikelEmitter)
If *PartikelEmitter\StartPartikel
ChangeCurrentElement(Partikel(), *PartikelEmitter\StartPartikel)
AddElement(Partikel())
Else
LastElement(Partikel())
*PartikelEmitter\StartPartikel = AddElement(Partikel())
EndIf
Partikel()\x = *PartikelEmitter\x
Partikel()\y = *PartikelEmitter\y
Partikel()\PartikelEmitter = *PartikelEmitter
EndProcedure
Procedure DisplayPartikel(*PartikelEmitter.PartikelEmitter=0)
If *PartikelEmitter And *PartikelEmitter\StartPartikel
ChangeCurrentElement(Partikel(), *PartikelEmitter\StartPartikel)
Repeat
Debug "Emitter: "+Str(Partikel()\PartikelEmitter)+" :: ("+Str(Partikel()\x)+"|"+Str(Partikel()\y)+")"
Until Not NextElement(Partikel()) Or Partikel()\PartikelEmitter <> *PartikelEmitter
Else
ForEach Partikel()
Debug "Emitter: "+Str(Partikel()\PartikelEmitter)+" :: ("+Str(Partikel()\x)+"|"+Str(Partikel()\y)+")"
Next
EndIf
EndProcedure
Dim *PartikelEmitter(4)
Debug "EmitterIDs:"
For n = 0 To 4
*PartikelEmitter(n) = CreatePartikelEmitter(Random(100),Random(100))
Debug Str(n)+" "+Str(*PartikelEmitter(n))
Next
Debug "---"
RandomSeed(1)
For n = 1 To 16
CreatePartikel(*PartikelEmitter(Random(4)))
Next
Debug "Display 2:"
DisplayPartikel(*PartikelEmitter(2))
Debug "Display All:"
DisplayPartikel()
Erst werden 5 Emitter erzeugt, dessen IDs in einem Array gespeichert werden.
Hier kann man auch mit einer Map arbeiten.
Danach werden zufällig Partikel in zufälligen Emittern erstellt.
Beim erstellen (CreatePartikel), wird dabei auf die "Ordnung" in der Liste geachtet.
Bein darstellen/auslesen, wird dann das StartPartikel angesprungen, und solange weiter gemacht bis ein anderes kommt:
Code: Alles auswählen
ChangeCurrentElement(Partikel(), *PartikelEmitter\StartPartikel)
Repeat : Until Not NextElement(Partikel()) Or Partikel()\PartikelEmitter <> *PartikelEmitter
Diese Art der Listen-Bearbeitung kannst du nun überall da verwenden wo du nun zugriff auf Partikel eines bestimmten Emitters brauchst.
Der Vorteil hier ist, das du aber
auch komplett alle Partikel durchlaufen kannst (mit nur einer Schleife).