[3D Ego"Shooter"] Kamera, Bewegung, Kollision

Previous topic - Next topic

Topzombie

Code (glbasic) Select
//Hallo Leute,
//Ich habe keine Kameratutorials gefunden und
//da ich Kameras und die flüssige Bewegung in alle Richtungen am Anfang auch schwer fand
//habe ich dieses Tutorial geschrieben.
//Das ist mein erstes Tutorial und darum ist es nicht perfekt (außerdem bin ich selber noch ein Anfänger in GLBasic)
//Ich hoffe trotzdem das es euch gefällt und es jemandem hilft Bewegungen in Ego Shootern besser verstehen zu können.


// --------------------------------- //
// Project: [3D Ego"Shooter"] Kamera, Bewegung, Kollision
// Start: Monday, March 8, 2010
// IDE Version: 7.250


// SETCURRENTDIR("Media") // seperate media and binaries?


//Das lädt die Textur für die Box in der der Spieler später mal laufen soll
//Es wird zwar nicht zwingend benötigt, aber mit Textur kann man die Wände der Box besser sehen
LOADSPRITE "test.bmp",0
//Type für die Kamera Position und Blickrichtung
TYPE Pos
X
Y
Z
XLook
YLook
ZLook
ENDTYPE
//
GLOBAL Cam AS Pos
//Mit XY wird die Drehrichtung und mit Z die Höhe in die die Kamera sieht berechnet
GLOBAL XY,Z
//Damit wird die Kamera Position gespeichert um sie wenn sie mit einer Wand kollidiert zurückzusetzen
GLOBAL OldX, OldY, OldZ
//Die Laufgeschwindigkeit
GLOBAL Speed
//Die Springhöhe
GLOBAL TJump
//Hier wird die Startposition der Kamera festgelegt
Cam.X = -75
Cam.Y = 75
Cam.Z = -100
WHILE TRUE
//Die momentane Kameraposition wird gespeichert
OldX=Cam.X
OldY=Cam.Y
OldZ=Cam.Z
//Erhöht die Laufgeschwindigkeit wenn man Shift drückt ("Sprinten")
IF KEY(42)
Speed=5
ELSE
Speed=2
ENDIF

//Mit der Leertaste kann man springen wenn TJump kleiner als 20 ist
IF KEY(57) AND TJump<20
//TJump wird pro Durchlauf um 1 erhöht
TJump=TJump+1
//Die Kamera Position wird pro Durchlauf um 20 erhöht
Cam.Z=Cam.Z+20
ENDIF
//Wenn die Maus nach Links bewegt wird dann wird XY mit der Mausgeschwindigkeit addiert
//Und nach rechts wird XY mit der Mausgeschwindigkeit subtrahiert
IF MOUSEAXIS(0)
XY=XY-MOUSEAXIS(0)
ENDIF

//Wenn die Maus nach unten bewegt wird dann wird Z mit der Mausgeschwindigkeit addiert
//Und nach oben wird Z mit der Mausgeschwindigkeit subtrahiert
IF MOUSEAXIS(1)
Z=Z-MOUSEAXIS(1)
ENDIF

//Hier wird verhindert das die Kamera zu hoch bzw. zu tief schaut
IF SIN(Z)<-0.90
Z=-64
ENDIF
IF SIN(Z)>0.90
Z=64
ENDIF

//Die Laufrichtung wird berechnet und mit Speed wird die Geschwindigkeit bestimmt
IF KEY(17)
Cam.X=Cam.X+(COS(XY)*Speed)
Cam.Y=Cam.Y+(SIN(XY)*Speed)
ENDIF
//Die Laufrichtung nach hinten
IF KEY(31)
Cam.X=Cam.X-(COS(XY)*Speed)
Cam.Y=Cam.Y-(SIN(XY)*Speed)
ENDIF


//Jetzt wird die Blickrichtung berechnet
Cam.XLook=Cam.X+COS(XY)
Cam.YLook=Cam.Y+SIN(XY)
Cam.ZLook=Cam.Z+SIN(Z)

//Der 3D Modus wird aktiviert
X_MAKE3D 1, 1000, 45

//Die Z Achse der Kamera wird auf oben gestellt (wenn das nicht gemacht wird ist die Y Achse oben)
X_CAMERAUP 0,0,1

//Die Kamera wird gesetzts
X_CAMERA Cam.X,Cam.Y,Cam.Z,Cam.XLook,Cam.YLook,Cam.ZLook

//Ein roter Punkt wird auf die Mitte des Bildschirmes gesetzt (bzw. in die Blickrichtung der Kamera),
//um zu testen ob die Kamera auch gerade läuft oder zum zielen in einem Shooter
X_DOT Cam.XLook,Cam.YLook,Cam.ZLook,3,RGB(255,0,0)

//Ein Würfel wird mit einer Funktion erstellt
CreateCube  (0, 500, RGB(255, 255, 255))

//Nun wird eine Textur auf das Model gelegt
X_SETTEXTURE 0,-1

//X_Drawobj erstellt das Model
X_DRAWOBJ 0,0

//Jetzt kommen wir zur Kollision:
//Erst werden "die Beine" erstellt
IF X_COLLISION(0, 0, 20, Cam.X, Cam.Y, Cam.Z-50)=0
//Wenn der Spieler in der Luft ist wird die Kameraposition pro Durchgang um 10 verringert
Cam.Z=Cam.Z-10
//Wenn der Spieler bereits in der Luft ist, kann er nicht mehr springen
IF KEY(57)=0
TJump=20
ENDIF
ENDIF
IF X_COLLISION(0, 0, 20, Cam.X, Cam.Y, Cam.Z-50)
//Wenn der Spieler auf dem Boden steht wird die Kameraposition pro Durchgang um 10 erhöht
Cam.Z=Cam.Z+10
//Setzt TJump wieder auf 0 wenn man die Leertaste nicht drückt und auf dem Boden steht
IF KEY(57)=0
TJump=0
ENDIF
ENDIF

//Jetzt wird einmal die Kollision "links" und "rechts" abgefragt (bzw X+2 und X-2)
IF X_COLLISION(0,0,50,Cam.X+2,Cam.Y,Cam.Z) OR X_COLLISION(0,0,50,Cam.X-2,Cam.Y,Cam.Z)
//Kollidiert der Spieler mit einer Wand "links" oder "rechts",
//wird die Position auf der X Achse auf die der letzten Runde zurückgesetzt
Cam.X=OldX
ENDIF

//Jetzt wird einmal die Kollision "vorne" und "hinten" abgefragt (bzw Y+2 und Y-2)
IF X_COLLISION(0,0,50,Cam.X,Cam.Y+2,Cam.Z) OR X_COLLISION(0,0,50,Cam.X,Cam.Y-2,Cam.Z)
//Kollidiert der Spieler mit einer Wand "vorne" oder "hinten",
//wird die Position auf der Y Achse auf die der letzten Runde zurückgesetzt
Cam.Y=OldY
ENDIF

//Stellt wieder den 2D Modus an
X_MAKE2D
//Schreibt die Kameraposition oben-links ins Fenster
PRINT "X: "+Cam.X+" Y: "+Cam.Y+" Z: "+Cam.Z, 10, 10
//Nun wird alles auf dem Bildschirm angezeigt
SHOWSCREEN
WEND




//!//Diese Funktion ist nicht von mir//!//
//Hier findet ihr sie und weitere 3D Funktionen:
//C:\Users\*Username*\GLBasic\GLBasic\Samples\Common\3DPrimitives.gbas

FUNCTION CreateCube: num, sz, col
// Diese Variablen sind als LOCAL definiert:
// num, sz,
X_AUTONORMALS 1 // For a cube, hard edges
sz=sz/2
X_OBJSTART num
// Front Face
X_OBJADDVERTEX  sz, -sz,  sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz,  sz, 0, 0, col
X_OBJADDVERTEX  sz,  sz,  sz, 1, 1, col
X_OBJADDVERTEX -sz,  sz,  sz, 0, 1, col
X_OBJNEWGROUP
// Back Face
X_OBJADDVERTEX -sz,  sz, -sz, 1, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX  sz,  sz, -sz, 0, 1, col
X_OBJADDVERTEX  sz, -sz, -sz, 0, 0, col
X_OBJNEWGROUP
// Top Face
X_OBJADDVERTEX -sz,  sz,  sz, 0, 0, col
X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
X_OBJADDVERTEX  sz,  sz,  sz, 1, 0, col
X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
X_OBJNEWGROUP
// Bottom Face
X_OBJADDVERTEX  sz, -sz, -sz, 0, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 1, col
X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
X_OBJNEWGROUP
// Right face
X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
X_OBJADDVERTEX  sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX  sz,  sz,  sz, 0, 1, col
X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
X_OBJNEWGROUP
// Left Face
X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz, -sz, 0, 0, col
X_OBJADDVERTEX -sz,  sz,  sz, 1, 1, col
X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
X_OBJNEWGROUP
X_OBJEND

ENDFUNCTION // sz



Hier gibts das Tutorial als PDF, als ODT und die test.bmp textur:
http://www.topzombie.bplaced.de/Files/tools/phpATM_130/index.php?direction=0&order=&directory=Topzombies%20Programs/Tutorials&

Edit: Hab nen Fehler entdeckt.
Eine Zeile war im Tutorial verschwunden.