Anleitung

Previous topic - Next topic

Markus

Hallo,

bei den 3D Befehlen , also die mit X_ anfangen vermisse ich in der Anleitung an welche Position die
im Programm kommen. Bei manchen steht es bei.
Ein Gesamt Reihenfolge Beispiel dazu wäre gut auch mit anderen Funktionsnamen dazwischen.





Kitty Hello

Ist kein Beispiel im Handbuch?

Code (glbasic) Select

x_objstart
for
  x_objaddvertex
next
x_objend

while true
   x_make3D
   x_camera
   x_spot_lt
   x_settexture
   x_drawobj
   x_make2D
   print
   showscreen
wend


Markus

#2
ne , also nicht als ganzes , habs selber rausgefunden
Ist für neu Einsteiger/Programmier Anfänger bestimmt Interessant
einmal alle 3D Funktionen im Einsatz zu sehen.
Wünschenswert auch mit Schleife wie das mit dem Schatten gedacht ist.

bei X_MIPMAPPING vor oder hinter dem laden der Texturen ?

bei X_AMBIENT_LT in einer Schleife nach X_MAKE3D oder vor der hauptschleife 1x
ebenso X_FOG

bei X_LINE muß man wohl den Cullmode auf 0 stellen sonst ist die unsichtbar , ist nicht erklärt

X_SCALEMODEL dürfe eine einmalige Sache sein , könnte man dabei schreiben

X_COLLISION schätze ich mal nach X_DRAWOBJ ?

:offtopic:
bei X_AUTONORMALS könnte man noch schreiben das es sich nicht aus loadobj auswirkt
Logischer fände ich wenn AUTONORMALS noch eine Objekt nummer bekommt und dann die Normalen berechnet.
Es scheint so als würde im X_OBJEND eine Normalen Berechnung ausgeführt nach diesen Einstellungen.
Hätte nicht X_OBJEND diese Normals Parameter auch bekommen können ?

Was auch schön wäre was ich aus anderen Sprachen kenne,
das wenn man ein Beispiel in der Hilfe sieht ,
es anklicken kann und es in der IDE sichtbar wird und dann starten kann.
Aber ich meine die hatten die Hilfe als HTML generiert.

kanonet

#3
// bei X_MIPMAPPING vor oder hinter dem laden der Texturen ?
Einmal vor dem laden der Texturen, damit die Mipmapps erstellt werden. Dann noch einmal nach X_MAKE3D wenn man es tatsächlich benutzen will. Siehe Kittys Post weiter unten.

// bei X_AMBIENT_LT in einer Schleife nach X_MAKE3D oder vor der hauptschleife 1x
ebenso X_FOG
X_AMBIENT_LT nach X_MAKE3D und vor X_MAKE2D, also in jeder Schleife.
X_FOG nach der X_CAMERA! Also in jeder Schleife.

// X_SCALEMODEL dürfe eine einmalige Sache sein , könnte man dabei schreiben
Ja, Modell wird dauerhaft verändert, also einmalig. Ich finde, dass steht aber auch deutlich genug in der Hilfe.

// X_COLLISION schätze ich mal nach X_DRAWOBJ ?
X_COLLISION (und seine Derivate) ist unabhängig von der Zeichenroutine, du kannst es also auch vor X_MAKE3D verwenden, wenn du willst. Wobei dann eventuelle Verschiebungen, etc. nicht mit berücksichtigt währen, daher mag es innerhalb der Zeichenroutine (also gemeinsam mit X_DRAWOBJ) sinnvoller sein. Ist aber dir überlassen.
Wobei ich persönlich es für sinnvoller halte Kollisionen als Teil der Berechnungen zu behandeln und somit vor dem Zeichnen abzuschließen (schließlich willst du ja vielleicht die Bewegung, etc. noch ändern, wenn du eine Kollision feststellst?). Die Kollisionsbefehle nutze ich gar nicht, ich errechne lieber alles manuell.

// bei X_AUTONORMALS könnte man noch schreiben das es sich nicht aus loadobj auswirkt
Ja, X_AUTONORMALS wirkt nur innerhalb von X_STARTOBJ und X_ENDOBJ. Habe mir auch schon gewünscht, dass es erweitert wird, so dass es auch X_LOADOBJ beeinflussen kann, ist im Moment jedoch nicht so.


Erweitert müsste die Reihenfolge der Befehle dann so aussehen, bzw empfehle ich ein Spiel so zu konzipieren (einige Sachen können jedoch variiert werden, abhängig von der jeweiligen Situation und den persönlichen Geschmack):
Code (glbasic) Select
// Programmeinstellungen
SETSCREEN
ALLOWESCAPE
AUTOPAUSE
SYSTEMPOINTER
LIMITFPS
X_SETCELSHADES


// Alles laden, Daten vorbereiten, etc...

// objekt erstellen
X_OBJSTART
X_AUTONORMALS
  X_OBJADDVERTEX
  X_OBJADDVERTEX
  X_OBJADDVERTEX
  ...
X_OBJEND

// Objekt laden
X_LOADOBJ
X_SCALEMODEL

// Objekt analysieren, kann auch in der Mainloop erfolgen, aber wozu Rechenzeit verschwenden, wenn man auch vorausberechnen kann?
X_NUMFACES
X_GETFACE

// Texture laden (oder erstellen)
X_MIPMAPPING // beeinflusst alle nachfolgend geladene Texturen; muss aber in der Loop noch einmal gesetzt werden!
LOADSPRITE

// Shader laden
X_LOADSHADER

// Mainloop Anfang
WHILE TRUE

   // Eingaben abfragen
   KEY / MOUSEAXIS / MOUSESTATE
   
   // Gamelogik: Berechnungen anstellen und gegebenenfalls Kollisionen abfrage, erneut berechnen / Netzwerkkommunikation / what ever...
   SOCK_ / NET_ / INC / X_WORLD2SCREEN / X_SCREEN2WORLD / X_COLLISION etc...


   // mit Rendern der Szene beginnen, umschalten auf 3D-Darstellung
   X_MAKE3D
   X_MIPMAPPING
   
   // Kamera zeichnen
   X_CAMERAUP
   X_CAMERA
   X_GETCAMERAMATRIX
   X_FOG
   
   // Beleuchtung erstellen
   X_AMBIENT_LT
   X_SPOT_LT
   
   // Achsen/ Sprites/ 3D-Text/ Linien/ Punkte zeichnen, falls gewünscht, kann auch an späterer Stelle geschehen (aber vor X_Make2D)
   X_DRAWAXES
   X_SPRITE
   X_PRINT
   X_LINE // möglicherweise Cullmade beachten?
   X_DOT // sie X_LINE

   // Objektmanipulation starten, die Befehle wirken für alle nachfolgenden X_DRAWOBJ, können also einmalig für alle, eine Gruppe mehrerer Objekten oder einzeln für jedes Objekt verwendet werden.
   ALPHAMODE/ ALPHATESTING
   X_SETTEXTUREOFFSET
   X_SETTEXTURE
   X_CULLMODE
   X_SETSHADER
   X_MOVEMENT // überschreibt alle vorherigen X_MOVEMENT und X_ROTATION!
   X_SCALING // überschreibt alle vorherigen X_SCALING und X_ROTATION!
   X_ROTATION // kann beliebig oft verwendet werden, multipliziert/"addiert" mit allen vorherigen X_ROTATION
   X_MULTMATRIX // kann beliebig oft verwendet werden, multipliziert mit allen vorherigen X_MOVEMENT, X_SCALING, X_ROTATION, X_MULTMATRIX; wird aber meist allein verwendet
   X_PUSHMATRIX + X_POPMATRIX // bieten die Möglichkeit weitere Objektmanipulationen vorzunehmen, _ohne_ die vorherigen zu überschreiben! z.B. für parent/child...
   X_GETMATRIX
   // Objekt zeichnen
   X_DRAWOBJ
   
   
   // falls Schatten gewünscht:
   X_SPOT_LT -3 // Position der schattenwerfenden Lichtquelle und Farbe der Schatten angeben!
   // Objektmanipulationen für schattenwerfende Objekt durchführen und Objekte zeichnen, siehe oben, jedoch ohne texture und alpha
   X_SPOT_LT -3, 0, 0,0,0, 0,0,0, 0 // wenn alle schattenwerfenden Objekte gezeichnet wurden, Schattenengine beenden!
   // gegebenenfalls hier Objekte zeichnen auf die kein Schatten geworfen werden soll (siehe oben), jedoch nur wenn diese bisher noch nicht gezeichnet wurden! undokumentiertes Feature :P


   // 3D-Darstellung beenden und 2D beginnen, muss nicht gemacht werden, wenn es kein 2D gibt...
   X_MAKE2D
   PRINT / DRAWSPRITE / etc. // alles 2D Zeug hier zeichnen


   // alles auf den Bildschirm bringen
   SHOWSCREEN
   
   // gegebenen Falls Zeit an CPU zurückgeben, dein Spiel muss ja nicht 100% Last erzeugen ;)
   SLEEP

// Mainloop Ende
WEND

Müsste alle x_Befehle (und einige andere) enthalten [außer X_CLEAR_Z aber das ist auch so klar?]. ;)
Die Position der meisten Befehle kann man aber auch aus der Hilfe schließen, oder zumindest aus den Beispiel-Projekten.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Markus

@kanonet
Dein Beispiel ist gut , das könnte in die Hilfe eingebastelt als Link bei allen 3D Befehlen.
Das soll allen dienen  :good:

:offtopic:
Dieses X_MIPMAPPING hab ich in einem Sample auch inner Hauptschleife gesehen.
Also ist es so das X_MIPMAPPING erstmal nix macht und beim laden der Texture was passieren muß.

Das mit X_COLLISION ist gut zu wissen

Ich weiß was für ein Unfug Programmier Anfänger machen, man kann es nicht deutlich genug erklären.

kanonet

Quote from: Markus on 2012-Apr-18Dieses X_MIPMAPPING hab ich in einem Sample auch inner Hauptschleife gesehen.
Hmm da bin ich mir jetzt nicht mehr ganz sicher... bilde mir ein, mal einen Post gesehen zu haben, der besagte, dass es vor das Spriteladen gehört, kann ihn aber im Moment nicht finden, sondern nur einen, der das Gegenteil behauptet: http://www.glbasic.com/forum/index.php?topic=2189.msg16307#msg16307
Außerdem befindet sich X_MIPMAPPING im Beispiel 3Dmaze vor dem X_MAKE3D...

Andererseits wird eine mit CREATESCREEN erstellte Textur gelöscht/komplett weiß (keine Auswirkung auf geladene Texturen), wenn sich X_MIPMAPPING in der Mainloop befindet. Aber vielleicht ist das ja auch nur ein Bug.

Ich habe meinen letzten Post editiert und X_MIPMAPPING verschoben, aber darüber muss ich demnächst mal mit Gernot reden. :|
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Kitty Hello

x:mipmapping einmal vor dem laden der textur -> textur hat mipmapping infos.
Dann, einmal nach x_make3D bzw. showscreen, um dem Kern zu sagen, dass Du die jetzt auch nutzen willst.
Kannst aber vor jedem x_drawobj wechseln.

Markus

Danke für die Info  :good: