BASIC

Author Topic: [3D] Basic Movement eines Egoshooters  (Read 8536 times)

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5013
  • O Rly?
    • View Profile
[3D] Basic Movement eines Egoshooters
« Reply #15 on: 2008-Jan-08 »
kommt aufs Game drauf an!
Und wie man mit 3D zurecht kommt, und auch das technische verständniss dafür hat !

man muss halt Sin Cos verstanden haben!
I <3 DGArray's :D

PC:
AMD RYzen 7 1700 @3.9Ghz, 16GB HyperX Fury 2666Mhz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline Quentin

  • Prof. Inline
  • *****
  • Posts: 915
    • View Profile
[3D] Basic Movement eines Egoshooters
« Reply #16 on: 2008-Apr-18 »
Genau! Und da ich das scheinbar immer noch nicht so ganz raffe, habe ich dein Beispiel mal ein wenig verhunzt und beim Bewegen der Kamera den Eindruck einer gehenden Bewegung eingefügt. Dazu wird der Y-Position der Kamera bei jedem Durchlauf ein kleiner Wert hinzugefügt, der einer Sinus-Kurve folgt.

Vorlage habe ich hier gefunden: http://www.codeworx.org/opengl_tut10.php

Neu gegenüber deinem Original-Code ist lediglich die Variable WalkAngle, die bei jedem Tastendruck (w,a,s,d) um 10 erhöht wird. Bei X_CAMERA wird dieser Wert dann (noch etwas verkleinert) der Y-Position der Kamera hinzuaddiert

Code: GLBasic [Select]
       
// --------------------------------- //
// Project: 3D Movement
// Start: Friday, August 31, 2007
// IDE Version: 4.279

// Steuerung mit W-A-S-D Tasten + Maus
SETSCREEN 800,600,FALSE

// Lade 3D Objekte-------------
X_LOADOBJ "ground.ddw", 0
X_LOADOBJ "skybox.ddw",1


//-----------------------------

// Lade Sprites/Texturen... Texturen müssen ^2 sein!
        LOADSPRITE "crosshair.png", 1
//--------------------------------------------------


GLOBAL up_down_limit = 80  //gesammt 160°
GLOBAL WalkSpeed = 0.15
GLOBAL WalkAngle = 0       // Winkel für Gehbewegungen
GLOBAL phiXZ = 90                  // Startwinkel korregieren
GLOBAL anziehung = 0.15   // Erdanziehungskraft
Y = 10

WHILE TRUE
        X_MAKE3D .1,1000,45        // sicht von 1 bis 1000, brennweite 45
        X_CAMERA X, Y+SIN(WalkAngle)/30, Z,     X+COS(phiXZ), Y+SIN(-phiXY), Z+SIN(phiXZ) // Die Cam erstellen

        X_SPOT_LT 0,RGB(0xff, 0xff, 0xff),0,500,0,0,0,0,360   //Licht erstellen und in alle richtungen scheinen lassen (360)

        X_DRAWOBJ 0,0

        Coll = X_COLLISIONRAY(0,0,X,Y,Z,0,-1,0) // Collision mit Boden

        INC Sky,0.1             // SkyBox-Winkel erhöhen
        IF Sky > 359 THEN  Sky = 0      //winkel begrenzen

        X_ROTATION Sky,0,1,0    // rotation erstellen
        X_DRAWOBJ 1,0                   // Skybox zeichen
        X_CLEAR_Z                               // Tiefenbuffer löschen

        IF Coll > 1.5
                DEC Y,anziehung         // wenn "Spieler" in der luft dann Anziehung!
        ENDIF

        IF Coll < 1.4   // muss kleiner sein als
                INC Y,0.1       // wenn erhöhung kommt dann höher setzen

                IF Coll = 0 THEN DEC Y,anziehung // wenn keine Collision da ist spieler runterfallen lassen
        ENDIF

        INC phiXZ,MOUSEAXIS(0)/2        //links-rechts
        INC phiXY,MOUSEAXIS(1)/2        //hoch runter

        IF phiXZ > 359 THEN phiXZ = 0  //Winkel begrenzen
        IF phiXZ < 0 THEN phiXZ = 359  //Winkel begrenzen

        IF phiXY < -up_down_limit THEN phiXY = -up_down_limit //Winkel begrenzen
        IF phiXY > up_down_limit THEN phiXY = up_down_limit   //Winkel begrenzen

        IF KEY(17) // forward -- W-Key
                INC Z,SIN(phiXZ)*WalkSpeed
                INC X,COS(phiXZ)*WalkSpeed
                INC WalkAngle, 10
        ENDIF
        IF KEY(31) // back    -- S-Key
                DEC Z,SIN(phiXZ)*WalkSpeed
                DEC X,COS(phiXZ)*WalkSpeed
                INC WalkAngle, 10
        ENDIF
        IF KEY(30) // left        -- A-Key
                INC Z,SIN(phiXZ-90)*WalkSpeed
                INC X,COS(phiXZ-90)*WalkSpeed
                INC WalkAngle, 10
        ENDIF
        IF KEY(32) // right       -- D-Key
                INC Z,SIN(phiXZ+90)*WalkSpeed
                INC X,COS(phiXZ+90)*WalkSpeed
                INC WalkAngle, 10
        ENDIF

    IF WalkAngle > 359 THEN WalkAngle = 0


        X_MAKE2D        // auf 2D umschalten

        GETSCREENSIZE XX, YY
        ALPHAMODE 0.2                           // Alpha anstellen
        DRAWSPRITE 1, XX/2-10,YY/2-10   // crosshair mittig setzen
        ALPHAMODE 0                                     // Alpha reseten


        // Koordinaten und Winkel anzeigen !
        PRINT "X: "+INTEGER(X)+" | Y: "+INTEGER(Y)+" | Z: "+INTEGER(Z),10,10    // Koordinaten
        PRINT "phiXZ: "+(phiXZ-90)+" | phiXY: "+phiXY, 10,30 // Winkel

        IF Coll THEN PRINT "Collshöhe: "+Coll,10,50

SHOWSCREEN
WEND
END

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5013
  • O Rly?
    • View Profile
[3D] Basic Movement eines Egoshooters
« Reply #17 on: 2008-Apr-18 »
Schick :)
I <3 DGArray's :D

PC:
AMD RYzen 7 1700 @3.9Ghz, 16GB HyperX Fury 2666Mhz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard