Verwendung von Strukturen für Objekte?
Verwendung von Strukturen für Objekte?
Ich brauche ein bisschen Hilfe bei der Verwendung von Strukturen in PureBasic. Nehmen wir an ich habe in einem Spiel Objekte mit mehreren Variablen. Diese Objekte werden ständig neu erstellt, verarbeitet und wieder gelöscht. Wie z.B. Schüsse eines Raumschiffes oder Blöcke bei einem Breakout-Clone.
Man kann das ganze zwar mit Arrays für jede Variable lösen, das ist aber ziemlich umständlich. Ich müsste ständig die Anzahl der Objekte mitzählen und festlegen ob sie noch aktiv sind. Wenn ich dann neue erstellen will, muss ich mitten im Array ein altes inaktives Objekt überschreiben usw.
Bei Blitz Basic gibt's für sowas die Types. Da werden die Variablen zusammengefasst und die Objekte lassen sich per Schleife abarbeiten und löschen. Funktionieren die Strukturen in PureBasic ähnlich oder bin ich da auf dem Holzweg. Obwohl ich mir einige absolut allgemeine Beispiele angeguckt habe verstehe ich nicht ganz wie ich das für meine Zwecke anwenden kann. Vielleicht kann mir jemand ein kleines spezifischeres Beispiel dazu geben.
Man kann das ganze zwar mit Arrays für jede Variable lösen, das ist aber ziemlich umständlich. Ich müsste ständig die Anzahl der Objekte mitzählen und festlegen ob sie noch aktiv sind. Wenn ich dann neue erstellen will, muss ich mitten im Array ein altes inaktives Objekt überschreiben usw.
Bei Blitz Basic gibt's für sowas die Types. Da werden die Variablen zusammengefasst und die Objekte lassen sich per Schleife abarbeiten und löschen. Funktionieren die Strukturen in PureBasic ähnlich oder bin ich da auf dem Holzweg. Obwohl ich mir einige absolut allgemeine Beispiele angeguckt habe verstehe ich nicht ganz wie ich das für meine Zwecke anwenden kann. Vielleicht kann mir jemand ein kleines spezifischeres Beispiel dazu geben.
Man kann alles sagen, man muss es nur vernünftig begründen können.
Ich hasse WASD-Steuerung | Ohne Pix saug ich nix | www.travis.bplaced.net
Ich hasse WASD-Steuerung | Ohne Pix saug ich nix | www.travis.bplaced.net
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Verwendung von Strukturen für Objekte?
Listen.
schau mal ins Waponez-Beispiel. (\examples\advanced\)
ist zwar nicht up to date von der version her, aber dort wird ne LList ganz easy für die Schüsse verwendet.
schau mal ins Waponez-Beispiel. (\examples\advanced\)
ist zwar nicht up to date von der version her, aber dort wird ne LList ganz easy für die Schüsse verwendet.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Re: Verwendung von Strukturen für Objekte?
Danke. Jetzt hab' ich's auch verstanden. Eine Frage ist aber noch offen geblieben. Wie kann ich Objekte/Listen aus der gleichen Struktur miteinander vergleichen. Angenommen ich möchte wissen ob zwei Objekte kollidieren.
Im Beispiel werden die Objekte so behandelt:
Wie kann man jetzt innerhalb der Schleife die Liste nochmal durchgehen?
Im Beispiel werden die Objekte so behandelt:
Code: Alles auswählen
While NextElement(Obj())
; obj()\x = obj()\x + obj()\sx
; ect.
Wend
Code: Alles auswählen
If Objekt1\x = Objekt2\x and Objekt1\y = Objekt2\y : Kollision : Endif
Man kann alles sagen, man muss es nur vernünftig begründen können.
Ich hasse WASD-Steuerung | Ohne Pix saug ich nix | www.travis.bplaced.net
Ich hasse WASD-Steuerung | Ohne Pix saug ich nix | www.travis.bplaced.net
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Verwendung von Strukturen für Objekte?
das ist meistens garnicht nötig, weil dich normalerweise nur die Kollisionen von Objekten verschiedener Typen interessieren.
dich interessiert, welcher Schuss mit welchem Ufo kollidiert, oder welcher Ufo-Schuss mit dem Player,
höchstens noch ob Player-Schüsse mit Ufo-Schüssen kollidieren,
aber ob Ufos mit Ufos, Player-Schüsse mit Player-Schüssen oder Ufo-Schüsse mit Ufo-Schüssen kollidieren ist Wurscht.
also mach für jeden Objekttyp ne eigene Liste.
dich interessiert, welcher Schuss mit welchem Ufo kollidiert, oder welcher Ufo-Schuss mit dem Player,
höchstens noch ob Player-Schüsse mit Ufo-Schüssen kollidieren,
aber ob Ufos mit Ufos, Player-Schüsse mit Player-Schüssen oder Ufo-Schüsse mit Ufo-Schüssen kollidieren ist Wurscht.
also mach für jeden Objekttyp ne eigene Liste.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Verwendung von Strukturen für Objekte?
Und falls das "meistens" von Kaeru bei dir nicht gilt, dann hier ein Beispiel zum Verstehen.
Zum Erklären habe ich gerade keine Zeit, deswegen muss das hier reichen.
Weiteres kannst du der Hilfe entnehmen.
Zum Erklären habe ich gerade keine Zeit, deswegen muss das hier reichen.
Code: Alles auswählen
;Getestet mit PB V4.50 beta 4 x64 unter Ubuntu 9.04 x64
Structure Position
x.i
y.i
nummer.i
EndStructure
NewList value.Position()
For i = 0 To 99
AddElement(value())
value()\x = Random(10)
value()\y = Random(10)
value()\nummer = i
Next
Define *current.Position
ForEach value()
*current = @value() ;aktuelles Element merken
While NextElement(value()) ;bei dem nächsten weiter machen bis zum Ende der Liste
If *current\x = value()\x And *current\y = value()\y
Debug Str(*current\nummer) + " und " + Str(value()\nummer) + " sind gleich mit dem Wert (x:" + Str(*current\x) + ", y:" + Str(*current\y) + ")"
EndIf
Wend
ChangeCurrentElement(value(), *current) ;aktuelles Element wieder zurücksetzen und danach weiter machen
Next
Re: Verwendung von Strukturen für Objekte?
Hey, danke. Die Synatx ist hier echt ein bisschen komplizierter als bei Blitz Basic. Solche Prüfungen benötige ich in der Tat häufiger mal.
Man kann alles sagen, man muss es nur vernünftig begründen können.
Ich hasse WASD-Steuerung | Ohne Pix saug ich nix | www.travis.bplaced.net
Ich hasse WASD-Steuerung | Ohne Pix saug ich nix | www.travis.bplaced.net
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Verwendung von Strukturen für Objekte?
Das Problem ist eben, dass es nur ein CurrentElement gibt, kein Alternatives.
die Kombination
ist allerdings das Einfachste und schnellste,
zumal Nic hier auch noch doppelte Überprüfungen ausgeschlossen hat,
dadurch dass die innere Schleife beim Aktuellen Element der Äußeren beginnt.
diese äußere Schleife könnte man dann auch gleich mit der Darstellung kombinieren, dann müsste man sie nur 1x durchlaufen.
das ist allerdings nur dann sinnvoll, wenn man wirklich diese Darstellungsreihenfolge wünscht.
viele Engines erledigen sowas bereits intern.
da braucht man dann an der Schnittstelle zwar weniger Aufwand, dafür wird meist unter der Haube noch wesentlich mehr Performance verbraten als mit dieser simplen Eineinhalb-Schleife von Nic.
die Kombination
Code: Alles auswählen
*current = @value()
InnerLoop()
ChangeCurrentElement(value(), *current)
zumal Nic hier auch noch doppelte Überprüfungen ausgeschlossen hat,
dadurch dass die innere Schleife beim Aktuellen Element der Äußeren beginnt.
diese äußere Schleife könnte man dann auch gleich mit der Darstellung kombinieren, dann müsste man sie nur 1x durchlaufen.
das ist allerdings nur dann sinnvoll, wenn man wirklich diese Darstellungsreihenfolge wünscht.
viele Engines erledigen sowas bereits intern.
da braucht man dann an der Schnittstelle zwar weniger Aufwand, dafür wird meist unter der Haube noch wesentlich mehr Performance verbraten als mit dieser simplen Eineinhalb-Schleife von Nic.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Re: Verwendung von Strukturen für Objekte?
Jetzt habe ich noch eine Hürde gefunden. Wenn eine Struktur ein Objekt der gleichen Struktur beinhalten soll
Wie kann man jetzt das Objekt bei einem Funktionsaufruf übergeben? Und wie greift man später darauf zurück?
Vielleicht könnte mir da mal jemand ein kleines Beispiel zeigen. (Ja, ich bastle gerade am Pathfinding...)
Code: Alles auswählen
Structure Node
*parent.node
x.l
y.l
f.l
g.l
h.l
EndStructure
Code: Alles auswählen
Procedure NewNode(x,y,*parent.node)
AddElement(n())
n()\x = x
n()\y = y
EndProcedure
Man kann alles sagen, man muss es nur vernünftig begründen können.
Ich hasse WASD-Steuerung | Ohne Pix saug ich nix | www.travis.bplaced.net
Ich hasse WASD-Steuerung | Ohne Pix saug ich nix | www.travis.bplaced.net
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Verwendung von Strukturen für Objekte?
Du meinst sicherlich so:
Das Problem ist, dass das Sternchen (*) vor 'parent' nach einem '\' nicht mehr angegeben werden muss. Das ist ein bisschen verwirrend bei PB.
Code: Alles auswählen
Structure Node
*parent.node
x.l
y.l
f.l
g.l
h.l
EndStructure
Procedure NewNode(x,y,*parent.node)
AddElement(n())
n()\parent = *parent
n()\x = x
n()\y = y
EndProcedure
Re: Verwendung von Strukturen für Objekte?
Und wie greift man jetzt wieder auf das Objekt zu?
Angenommen ich möchte die Objekte anzeigen und mit einer grafischen Linie verbinden. Gehe also eine Schleife durch die jedes Objekt anzeigt.
Kann ich jetzt innerhalb der Schleife auf die Variablen des Objektes in "n()\parent" zugreifen?
Skruktur Feld fehlt heisst es hier.
Angenommen ich möchte die Objekte anzeigen und mit einer grafischen Linie verbinden. Gehe also eine Schleife durch die jedes Objekt anzeigt.
Code: Alles auswählen
ForEach n()
DrawText(n()\x, n()\y, "X", RGB(255,255,255))
Next
Code: Alles auswählen
LineXY(n()\x, n()\y, n()\*parent\x, n()\*parent\y)
Man kann alles sagen, man muss es nur vernünftig begründen können.
Ich hasse WASD-Steuerung | Ohne Pix saug ich nix | www.travis.bplaced.net
Ich hasse WASD-Steuerung | Ohne Pix saug ich nix | www.travis.bplaced.net