GLBasic forum

Main forum => Tutorials => Topic started by: Schranz0r on 2007-Sep-01

Title: [3D] Basic Movement eines Egoshooters
Post by: Schranz0r on 2007-Sep-01
Hi Leute

Ich dachte mir ich fang mal einen Egoshooter an in GLBasic in 3D!
So! , da ich sehr schnell feststellen musste, dass die Steuerung im 3-Dimensionalen Raum nicht ganz so einfach von der Hand geht, dachte ich mir teile ich mein neu erworbenes Wissen mit euch.

ICH WILL KEIN LOB!
Ich will nur kritik hören, Gute oder schlecht sei dahingestellt :D
Ich habe vor, nach und nach immer mehr in dieser Richtung zu bringen, wenn es Anklang findet ....

########################################################
Das kommt als nächstes:

1. Darstellung einer Spielumgebung [DONE]
2. Anziehung, Collisionen          [DONE]
3. Skybox(?)                       [DONE]

4. Sliding Collision mit Wänden
5. Schüsse im 3D-Raum
6. Gegner/ Multiplayer

########################################################
(LAST UPDATE 02.09.07)
LINK: www.StyleAttax.de/3D_Movement.rar


BASIS BEWEGUNG:

Code (glbasic) Select
// --------------------------------- //
// Project: 3D Movement
// Start: Friday, August 31, 2007
// IDE Version: 4.279

// Steuerung mit W-A-S-D Tasten + Maus

GLOBAL up_down_limit = 80  //gesammt 160°
GLOBAL WalkSpeed = 2
GLOBAL phiXZ = 90   // Startwinkel korregieren

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

// Achsen anzeigen zum Debugen
X_DRAWAXES 0,0,0
X_DRAWAXES 0,0,50
X_DRAWAXES 0,0,100
X_DRAWAXES 0,0,150
X_DRAWAXES 0,0,200
//----------------------------

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
ENDIF
IF KEY(31) // back    -- S-Key
DEC Z,SIN(phiXZ)*WalkSpeed
DEC X,COS(phiXZ)*WalkSpeed
ENDIF
IF KEY(30) // left  -- A-Key
INC Z,SIN(phiXZ-90)*WalkSpeed
INC X,COS(phiXZ-90)*WalkSpeed
ENDIF
IF KEY(32) // right  -- D-Key
INC Z,SIN(phiXZ+90)*WalkSpeed
INC X,COS(phiXZ+90)*WalkSpeed
ENDIF



X_MAKE2D
// 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

SHOWSCREEN
WEND
END
Title: [3D] Basic Movement eines Egoshooters
Post by: Quentin on 2007-Sep-01
fein, genau so kleine Beispiele braucht man, um da überhaupt mal einen Anfang hin zu bekommen. Ich muss gestehen, 3D ist für mich immer noch ein böhmisches Dorf. Könntest du das Beisipiel vielleicht so erweitern, daß man z.B. eine Wand darstellt, die mit der Steuerung wie oben von allen Seiten betrachten kann? Das wäre klasse.
Title: [3D] Basic Movement eines Egoshooters
Post by: Schranz0r on 2007-Sep-02
Hi Quentin!

Sicher ist kein Problem.
Hatte eh vor, heute weiter zu machen.

Das kommt als nächstes:

1. Darstellung einer Spielumgebung
2. Anziehung, Collisionen
3. Skybox(?)

Werde jeden Schritt versuchen, gut zu beschreiben!
Und die einzelnen Posts, noch im ersten Post ergänzen,
so dass die übersicht vorhanden bleibt!

Always remember:
(http://www.styleattax.de/phpBB/images/smiles/www_smiliemania_de_1682547.png) ;)
Title: [3D] Basic Movement eines Egoshooters
Post by: Quentin on 2007-Sep-02
klasse! Dank dir schon mal. Vielleicht raff ich das ja so irgendwann ;)
Title: [3D] Basic Movement eines Egoshooters
Post by: Schranz0r on 2007-Sep-02
So Update hier mal die neue Version, Grafisch nicht der Hammer, aber zu testen reichts ja !

www.StyleAttax.de/3D_Movement.rar
Title: [3D] Basic Movement eines Egoshooters
Post by: x-tra on 2007-Sep-02
Sehr nett, wunderbar, kann man einiges lernen bei.
Aber mal so eine Frage am Rande.
Ist es normal, daß die CPU Last bei meinem X2 4600+ auf 70 % !!! ansteigt?

Is aber bei anderen GLB Sachen auch so schon gewesen, und da sind das eigentlich simple Dinge.

Woran könnt das denn liegen?
Title: [3D] Basic Movement eines Egoshooters
Post by: Schranz0r on 2007-Sep-02
Denke der greift sich schon was vorraus ab.
Ist bei Blitz3D das selbe....
Title: [3D] Basic Movement eines Egoshooters
Post by: Quentin on 2007-Sep-03
Dat is ja jeil. Genau so hab ich mir das vorgestellt. Weiter so Schranzor.
Title: [3D] Basic Movement eines Egoshooters
Post by: trucidare on 2007-Sep-03
Lecker :) klasse gemacht. Darauf lässt sich bestimmt ein nettes Adventure oder gar ein kleines RPG machen. Vielleicht sogar ein Spiel auf dem Niveau von Legends od Idhuriel das die BB Szene rockt.
Title: [3D] Basic Movement eines Egoshooters
Post by: D2O on 2007-Sep-03
Quote from: x-tra...

Ist es normal, daß die CPU Last bei meinem X2 4600+ auf 70 % !!! ansteigt?

Is aber bei anderen GLB Sachen auch so schon gewesen, und da sind das eigentlich simple Dinge.

Woran könnt das denn liegen?
Hi, das ist Normal, 70% sin eh gut ;)
Wenn Du OGL ode DX nutzt, wird die CPU komplett dafür reserviert/ gebraucht.
Um das zu verhinder, z.B. wenn Du einen Editor im Fenstermodus laufen lässt, kannst Du die mal den befehl
"HIBERNATE" anschauen.
Title: [3D] Basic Movement eines Egoshooters
Post by: x-tra on 2007-Sep-03
Daran hab ich auch schon gedacht, hat schon was für sich wenn man die F1 Hilfe in nem schönen Ringordner hat, da schmöckert man gern mal, und da kommt einem schonmal die ein oder andere Idee.
Title: [3D] Basic Movement eines Egoshooters
Post by: Quentin on 2008-Jan-08
*hochschieb*

Schranzor? Machst an dem Teil noch weiter? So ganz, ganz allmählich bekomme ich einen leichten Raff von dem 3D-Zeugs. Aber gerade sowas wie Bewegung im 3D-Raum bereiten mir noch arg Kopfzerbrechen
Title: [3D] Basic Movement eines Egoshooters
Post by: Kitty Hello on 2008-Jan-08
Probier doch mal das Entity System. Das scheint für Einsteiger einfacher.
Title: [3D] Basic Movement eines Egoshooters
Post by: Schranz0r on 2008-Jan-08
hmm ne eigentlich nicht ^^

Aber wie Gernot schon sagte, das EntitySystem ist VIIIIIIIIIIIIIIIIEEEL einfacher als das ganze Sin Cos -gedöhns ;)
Title: [3D] Basic Movement eines Egoshooters
Post by: BumbleBee on 2008-Jan-08
@Quentin
3D ist in GLBasic genau so einfach wie 2D. Ist ja nur 1 Achse mehr.Vielleicht am Anfang etwas ungwohnt aber dann...:D Texturen,Modelle basteln, Sprites , Sound....Das macht viel mehr Arbeit als das Programm schreiben, find ich:D


Cheers
Title: [3D] Basic Movement eines Egoshooters
Post by: Schranz0r 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!
Title: [3D] Basic Movement eines Egoshooters
Post by: Quentin 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
Title: [3D] Basic Movement eines Egoshooters
Post by: Schranz0r on 2008-Apr-18
Schick :)