Seite 1 von 1

spezielle frage zu, thema LINKEDLIST

Verfasst: 01.02.2006 18:02
von inti
hallo,
zZ versuche ich einen kleinen arcade-shooter in PB umzusetzen was auch ganz gut klappt. also über das gröbste (sprites, sound, timing usw ) bin ich drüber weg. tileengine und collisionabfrage funktioniert alles :)

meine ersten testst sahen so aus dass ich mit 2 linkedlists gearbeitet habe, eine für die gegener und eine für die gegnerischen schüsse - klappt alles ganz gut und ist auch halbwegs schnell. :) nun versuche ich das ganze soweit zu abzuändern dass sich die schüsse eines bestimmten gegners bei zerstören des selben in münzen/items verwandeln... aber ebend nur die schüsse die vom zerstörten gegner abgegeben wurden. meine erste überlegung war für jeden gegner eine seperate ID speichern (zb über random) und diese dann an die schüsse zu übergeben... dann müßte ich allerdings immer bei der bearbeitung (movement) der schüsse überprüfen ob der passende gegner noch da ist... was bei einem typischen "bulletsprayer" bedeutet dass ich mal so zwischendurch 200-300 bullets per frame auf vielleicht 20 gegner überprüfen müßte - erste tests waren ernüchternt! :(

zweite überlegung war mit der ID eines jeden gegners eine eigene linkedlist anzulegen... praktisch "onthefly" aber soetwas scheint nicht zu gehen, oder habe ich da was übersehen?

dann habe ich die erweiterten strukturen gefunden aber das scheint mir auch nicht zuhelfen!!?!? :(

also habe ich nun einen denkfehler und mache mir das viel zu kompliziert oder kennt jemand einen anderen ansatz bzw 'ne lösung?

Verfasst: 01.02.2006 18:36
von AndyMars
Ähm - wieso musst du die Schüsse dauernd überprüfen? Du kannst doch einfach wenn ein Gegner zerstört wird, die zu gehörigen Schüsse löschen (bzw. in Münzen umwandeln)... bevor ein Gegner zerstört wird, hast du doch nichts zu prüfen. Oder versteh ich was falsch?

Verfasst: 01.02.2006 18:41
von NicTheQuick
Speicher in der Schuss-Structure den Pointer zum Gegner, der den
Schuss abgefeuert hat.

Vielleicht reicht dir dieser Code-Fetzen:

Code: Alles auswählen

Structure Enemy
  Typ.l
  x.f
  y.f
  ;...
EndStructure

Structure Bullet
  Typ.l
  x.f
  y.f
  ;...
  *Enemy.Enemy
EndStructure

NewList Enemy.Enemy()
NewList Bullet.Bullet()

Procedure CreateBullet(x.f, y.f)
  If AddElement(Bullet())
    Bullet()\x = x
    Bullet()\y = y
    ;...
    Bullet()\Enemy = @Enemy()  ;aktuelles Element muss der Gegner sein, der den Schuss abgefeuert hat
  EndIf
EndProcedure

Procedure GetEnemy2Bullet()
  ChangeCurrentElement(Enemy(), Bullet()\Enemy) ; ändert das aktuelle Element in Enemy() zu dem Gegner, dem der Schuss gehört
EndProcedure

Verfasst: 01.02.2006 20:19
von inti
@AndyMars:
rein theoretisch ist es nicht notwendig - richtig - ABER so eine 2d.shooter sollte releativ flüssig laufen und deshalb versuche alle checks immer durchzuführen um zu sehen ob es zu speed-problemen kommt - was bringt es wenn die engine flüssig läuft und sobald ein gegner zerstört wird und die schüsse umgewandelt werden frame fehlt... im ungünstigsten falle betrifft es mehrere gegner und dann kommt die böse überraschung! :(

@NicTheQuick:
sieht vielversprechend aus - danke, ich werde das mal testen!

Verfasst: 03.02.2006 22:54
von inti
daaaaaaaaaaanke, klappt bestestens! :allright: