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.
Ist kein Beispiel im Handbuch?
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
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.
// 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):
// 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.
@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.
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. :|
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.
Danke für die Info :good: