Ich hatte es mal so gemacht, wobei da aber nichts mit Taste freigeben ist:
Code: Alles auswählen
Structure kugel
sprite1.i ; Es werden immer zwei Kugelarten erzeugt,
sprite2.i ; das ist eine stärkere als Bonus, angezeigt wird immer nur eine
X.i
Y.i
dX.b
dY.b
EndStructure
Global NewList kugel.kugel()
Structure shipKugelexplosion
X.i
Y.i
kugelTrans.c
EndStructure
Global NewList shipKugelexplosion.shipKugelexplosion()
Procedure newshipKugelexplosion(x,y) ; Erzeugt eine Explosion bei einem Treffer
AddElement(shipKugelexplosion())
shipKugelexplosion()\X = x
shipKugelexplosion()\Y = y
shipKugelexplosion()\kugelTrans = 255
EndProcedure
Procedure freekugel(kugelzahl) ; Kugel wird aus der Liste kugel() und als Sprite gelöscht
kugelzahl = kugelzahl - 1
FreeSprite(kugel()\sprite1)
FreeSprite(kugel()\sprite2)
DeleteElement(kugel())
ProcedureReturn(kugelzahl)
EndProcedure
; Hier dann der Programmlauf:
ForEach kugel()
kugel()\x = kugel()\x + kugel()\dX
kugel()\y = kugel()\y + kugel()\dY
If checkOutside(kugel()\X,kugel()\Y) ; außerhalb des Fensters
kugelzahl = freekugel(kugelzahl) ; Kugel wird gelöscht
Else
If starttimeKugelwirkungdauer ; Alternativ stärkere Kugel als Bonus für gewisse Zeit
DisplaySprite(kugel()\sprite2,kugel()\x-3,kugel()\y-3)
Else
DisplaySprite(kugel()\sprite1,kugel()\x-5,kugel()\y-5); normale Kugel
EndIf
ForEach feind() ; Kollisionsprüfung
If SpriteCollision(kugel()\sprite1, kugel()\x, kugel()\y, feind()\sprite, feind()\X, feind()\Y)
punkte = punkte + kugeltrefferpunkt
newshipKugelexplosion(feind()\X + feindwidth/2,feind()\Y + feindheight) ; Kugel explodiert
kugelzahl = freekugel(kugelzahl) ; ////////////////////Kugel wird bei Treffer gelöscht, s.u.
gesamtkugeltreffer = gesamtkugeltreffer + 1
feind()\schirmstatus = feind()\schirmstatus + kugelwirkung
If feind()\schirmstatus > feindtot
newfeindexplosion( feind()\X,feind()\Y)
PlaySound(feindexplosionwav)
freefeind(feind()\sprite,feindexplosionwav)
punkte = punkte + feindzerstoertpunkt
gesamtfeindzerstoerte = gesamtfeindzerstoerte + 1
createfeind(Random(feindtypen),feindschirm,displayTransMin,feindXwegRadius)
EndIf
Break
EndIf
Next
EndIf
Next
Es wird also einfach die Liste aller Kugeln durchlaufen und bei einer Kollision das Listenelement mit der Kugel und das entsprechende Sprite gelöscht. Ob so etwas die übliche Vorgehensweise ist oder ob man es viel besser machen kann, weiß ich allerdings nicht.
Bei Bedarf kann ich auch das ganze Programm reinstellen, sind nur so 1500 Zeilen.