spezielle frage zu, thema LINKEDLIST

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
inti
Beiträge: 90
Registriert: 01.02.2006 17:25

spezielle frage zu, thema LINKEDLIST

Beitrag 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?
Benutzeravatar
AndyMars
Beiträge: 141
Registriert: 08.09.2004 11:59
Computerausstattung: Win11 Prof 64bit, i5-13500 @ 4.8 GHz, 32GB RAM, Nvidia RTX 4070 TI
Wohnort: Zürich, Schweiz
Kontaktdaten:

Beitrag 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?
Grüsse von AndyMars
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Benutzeravatar
inti
Beiträge: 90
Registriert: 01.02.2006 17:25

Beitrag 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!
Benutzeravatar
inti
Beiträge: 90
Registriert: 01.02.2006 17:25

Beitrag von inti »

daaaaaaaaaaanke, klappt bestestens! :allright:
Antworten