Verwendung von Strukturen für Objekte?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Travis
Beiträge: 35
Registriert: 09.03.2010 19:21

Verwendung von Strukturen für Objekte?

Beitrag von Travis »

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 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Verwendung von Strukturen für Objekte?

Beitrag von Kaeru Gaman »

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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Travis
Beiträge: 35
Registriert: 09.03.2010 19:21

Re: Verwendung von Strukturen für Objekte?

Beitrag von Travis »

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:

Code: Alles auswählen

While NextElement(Obj())
  ; obj()\x = obj()\x + obj()\sx
  ; ect.
Wend
Wie kann man jetzt innerhalb der Schleife die Liste nochmal durchgehen?

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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Verwendung von Strukturen für Objekte?

Beitrag von Kaeru Gaman »

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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
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?

Beitrag von NicTheQuick »

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. :wink:

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
Weiteres kannst du der Hilfe entnehmen.
Bild
Benutzeravatar
Travis
Beiträge: 35
Registriert: 09.03.2010 19:21

Re: Verwendung von Strukturen für Objekte?

Beitrag von Travis »

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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Verwendung von Strukturen für Objekte?

Beitrag von Kaeru Gaman »

Das Problem ist eben, dass es nur ein CurrentElement gibt, kein Alternatives.
die Kombination

Code: Alles auswählen

*current = @value()
InnerLoop()
ChangeCurrentElement(value(), *current)
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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Travis
Beiträge: 35
Registriert: 09.03.2010 19:21

Re: Verwendung von Strukturen für Objekte?

Beitrag von Travis »

Jetzt habe ich noch eine Hürde gefunden. Wenn eine Struktur ein Objekt der gleichen Struktur beinhalten soll

Code: Alles auswählen

Structure Node
*parent.node
 x.l
 y.l
 f.l
 g.l
 h.l
EndStructure
Wie kann man jetzt das Objekt bei einem Funktionsaufruf übergeben? Und wie greift man später darauf zurück?

Code: Alles auswählen

Procedure NewNode(x,y,*parent.node)
 AddElement(n())
 n()\x = x
 n()\y = y
EndProcedure
Vielleicht könnte mir da mal jemand ein kleines Beispiel zeigen. (Ja, ich bastle gerade am Pathfinding...)
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
Benutzeravatar
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?

Beitrag von NicTheQuick »

Du meinst sicherlich so:

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
Das Problem ist, dass das Sternchen (*) vor 'parent' nach einem '\' nicht mehr angegeben werden muss. Das ist ein bisschen verwirrend bei PB.
Bild
Benutzeravatar
Travis
Beiträge: 35
Registriert: 09.03.2010 19:21

Re: Verwendung von Strukturen für Objekte?

Beitrag von Travis »

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.

Code: Alles auswählen

ForEach n()
 DrawText(n()\x, n()\y, "X", RGB(255,255,255))
Next
Kann ich jetzt innerhalb der Schleife auf die Variablen des Objektes in "n()\parent" zugreifen?

Code: Alles auswählen

LineXY(n()\x, n()\y, n()\*parent\x, n()\*parent\y)
Skruktur Feld fehlt heisst es hier.
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
Antworten