Types und 3D-Objekte

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

PacMani

Betreff: Types und 3D-Objekte

BeitragMo, Jan 18, 2010 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

habe mir MIDI-Masters supertolles Type-Tutorial durchgelesen und jetzt auch einen Durchblick Wink
Allerdings gibt es da ein paar Dinge bei denen ich einfach nicht weiter weiß.

In der 2D-Welt kann man ja Types von z.B. Monstern einfach mit For-Next durchlaufen und jedes Monster mit DrawImage dahin zeichnen wo es laut Monster\X und Monster\Y hingehört, da DrawImage sozusagen Bilder "kopiert", also bereits gezeichnete Bilder ja nicht löscht während das nächste Monster gemalt wird.

In der 3D habe ich hier ein Modell für eine Münze, die es einzusammeln gilt. Alle Münzen werden in einem Type mit X, Y und Z-Koordinate gespeichert. Diese werden beim Laden eines Levels initialisiert. Nachdem das getan wurde, will ich mit For-Next alle Münzen im Münzen-Typ durchlaufen und sie dann nach den zugehörigen Koordinaten tatsächlich auf dem Spielfeld platzieren. Das mache ich mit PositionEntity MünzenMesh, Münze\X, Münze\Y, Münze\Z (Pseudo-Code). MünzenMesh wurde zuvor mit dem Münzen.3ds-Modell initialisiert.
Allerdings verschiebe ich damit natürlich ständig nur das eine Münzen.3ds-Modell, da es ja im Gegensatz zur 2D-Welt nicht kopiert wird... muss ich dann für jede meiner Münzen das gleiche Modell nochmal laden oder kann ich irgendwie Verweise auf dieses Modell machen (Frage der Speicherauslastung sei hier gestellt), und wenn nochmal laden, wie soll ich das in den Type speichern?

Bin grad etwas verwirrt, hoffentlich versteht ihr mich Smile
Derzeit sieht es so aus, habe schon etwas probiert:
Code: [AUSKLAPPEN]

Type TLucci
   Field Mesh
   Field X%, Y%, Z%
End Type
Global NLucci.TLucci

Function LadeLuccis()
   ;[...]
   NLucci = New TLucci
   NLucci\Mesh = LoadMesh("models\items\TLucci.3ds")
   NLucci\X = ValueX ;die habe
   NLucci\Y = ValueY ;ich davor
   NLucci\Z = ValueZ ;berechnet
   PositionEntity NLucci\Mesh, NLucci\X, NLucci\Y, NLucci\Z
End Function

Nicdel

BeitragMo, Jan 18, 2010 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Kopiere das Münzen-Mesh jedes mal mit CopyEntity. Die Koordinaten musst du nicht speichern, das macht Blitz automatisch (siehe EntityX,...). Du musst das Mesh nur am Anfang einmal positionieren (nach dem kopieren).
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

mpmxyz

BeitragMo, Jan 18, 2010 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
CopyEntity müsste da der richtige Befehl sein.
(versteckte Objekte laden, für Type-Instanzen kopieren und den Kopie-Handle natürlich in der Type-Instanz speichern.)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

PacMani

BeitragMo, Jan 18, 2010 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber wie positioniere ich jetzt das zuerst geladene Mesh mit
Global MLucci = LoadMesh("models\items\TLucci.3ds")
was ich ja für die CopyEntities benutze? Das wird ja von alleine auf 0,0,0 gesetzt und ist somit im Weg.

Derzeit sieht's so aus:
Code: [AUSKLAPPEN]
Global MLucci = LoadMesh("models\items\TLucci.3ds")

NLucci = New TLucci
NLucci\Mesh = CopyEntity(MLucci)
PositionEntity NLucci\Mesh, ValueX, ValueY, ValueZ

mpmxyz

BeitragMo, Jan 18, 2010 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
HideEntity heißt das Zauberwort...
Das macht zwei Dinge:
1. Das Objekt wird unsichtbar.
2. Das Objekt wird von den Kollisionen ausgeschlossen.
->Da steht nichts im Weg.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

PacMani

BeitragMo, Jan 18, 2010 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wusste nicht, dass es auch Kollisionen verbietet! Das hätte mir später bestimmt Probleme bereitet.

Vielen Dank an euch beide, das wäre hiermit erledigt Smile)
 

PacMani

BeitragDi, Jan 19, 2010 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt habe ich ein neues Problem:
Sobald ein Spieler eine Münze berührt, will ich sie jetzt der Einfachheit halber nur löschen und somit vom Spielfeld entfernen. Dazu nutze ich folgenden Code (Kollisionen treten richtig auf):
Code: [AUSKLAPPEN]
If EntityCollided(Player, LucciCollisions) Then
      NLucci = New TLucci
      For NLucci = Each TLucci
         If EntityCollided(NLucci\Mesh, PlayerCollisions) Then Delete NLucci
      Next
   End If


Allerdings zickt er, sobald ich eine Münze berühre, rum, dass die Entity NLucci\Mesh nicht existiere, obwohl ich sie anfangs korrekt beTypen und rotieren konnte wie hier zu sehen ist:
Code: [AUSKLAPPEN]
NLucci = New TLucci
NLucci\Mesh = CopyEntity(MLucci)
EntityType NLucci\Mesh, LucciCollisions
PositionEntity NLucci\Mesh, ValueX, ValueY, ValueZ
RotateEntity NLucci\Mesh, 0, Rand(0,360), 0

Nicdel

BeitragDi, Jan 19, 2010 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
NLucci = New TLucci

Hier erstellst du vor dem Durchgehen aller Types einen neuen Type. Bei diesem ist das Mesh natürlich 0, mach das raus Wink
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

PacMani

BeitragDi, Jan 19, 2010 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Das habe ich jetzt getan, aber jetzt erkennt er beim Durchlaufen garkeine Kollision mehr.

Megamag

BeitragDi, Jan 19, 2010 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem kann sein, dass du nach deiner Kollisionsabfrage noch auf dein Mesh zugreifen willst. Da dieses gelöscht wurde kann Blitz3D aber nicht mehr darauf zugreifen und "zickt rum". Die Kollisionsfrage oder bzw. der Löschbefehl muss am Ende deiner Schleife geschrieben werden, sodass danach nichts mehr kommt, was das Mesh benötigt.
 

PacMani

BeitragDi, Jan 19, 2010 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem mit dem Zugriff hatten wir ja bereits behoben, was an NLucci = New TLucci lag.

Ich habe meinen Code mal vereinfacht:
Code: [AUSKLAPPEN]
For NLucci = Each TLucci
   If EntityCollided(NLucci\Mesh, PlayerCollisions) Then HideEntity NLucci\Mesh
Next


Der wird jedesmal in der Hauptschleife durchgelaufen, er kommt auch in die For Each-Schleife, aber eine Kollision mit einer Münze (Lucci) erkennt er nie, weshalb HideEntity nie auftritt Sad

Nicdel

BeitragDi, Jan 19, 2010 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach die Kollision anders, am Besten so:
BlitzBasic: [AUSKLAPPEN]
Local collided = EntityCollided(Player, LucciCollisions)
If collided <> 0 Then
For NLucci = Each TLucci
If collided = NLucci\mesh Then
Delete NLucci
Exit
EndIf
Next
End If


Siehe dazu EntityCollided.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

PacMani

BeitragDi, Jan 19, 2010 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap, das geht Smile aber was war der eigentliche Grund?

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group