BASIC

Author Topic: [3D Ego"Shooter"] Kamera, Bewegung, Kollision  (Read 2967 times)

Offline Topzombie

  • Mc. Print
  • *
  • Posts: 17
    • View Profile
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.
« Last Edit: 2010-Mar-20 by Topzombie »