Hallo...
Capter 6
nun ... zum Video nu der Sorce und der Loadlink. Wir gehen diesmal
etwas weiter ........ WASD Steuerung mit Mouse unterstützung.
Wer sich das Verzeichniss genauer ansieht wird sich fileicht wundern
wo das Framework geblieben.
Im Hauptverzeichniss befinden sich nu haubtsächlich die Project
bezogenen Includs und Daten. Das Verzeichniss FW enthält das
FrameWork, die Exe und die Includes für den CodeView.
ZumCompilieren bitte Das Framework verwenden.
Bei späteren codes mit zusätzlichen Daten werden diese sonst nicht
gefunden.
InitProjectDaten.pbi
Code: Alles auswählen
;
; Capter 6
;
; Hir werden alle Variablen Definiert, das erleichtert sie Fehlersuche
; und es gibt einen festen platz. So das nicht lange nach definitionen
; gesucht werden muss
Define MX ; MouseX
Define MY ; MouseY
Define MDX ; MouseDeltaX
Define MDY ; MouseDeltaY
Define MDT=60 ; Mouse abfrage intervall in Tick
Define MDC ; Mouse Intervallcounter
Define MBR ; Mouse Botton Right
Define MBL ; Mouse Bottom Left
Define MBF ; Mouse Botton First
Define TKT=60 ; Tasten abfrage intervall in Tick
Define TKC ; Tasten Intervallcounter
Define TextT=60 ; Text änderungs Intervall in Tick
Define TextC ; Text Intervallcounter
Define CamMoveZ.f
Define CamMoveX.f
Define CamRX.f
Define CamRY.f
Define CamRZ.f
; Player Data
Define MaxSpeedZ.f=5.0
Define MaxSpeedX.f=2.0
Define Thrust.f=0.1
Define TickDammy ; Enthällt den GetTickCount()
Define Alpha.f=1.0
Define AlphaCounter
Define AlphaFPS
InitB3DDaten.pbi
Code: Alles auswählen
;
; Capter 6
;
Global Light=bbcreatelight(3)
bbmoveentity(Light,0,100,-100)
Dim cubs(2000)
Define i1
; Es wird ein Object als Reference erzeugt
; Und dann versteckt.(HideEntity)
Define cube=bbcreatecube()
bbhideentity(cube)
For i1 = 0 To 2000
; Und dann nur noch copiert angewendet
; das ist etwas schneller.
cubs(i1)=bbcopyentity(cube)
;
; Alle Entity werden positioniert
bbmoveentity(cubs(i1),150-Random(300),150-Random(300),150-Random(300)+300)
;
; Und damit nicht alle im Gleichtackt stehn.
; Werden sie zufällig rotiert
;
bbrotateentity(cubs(i1),Random(90),Random(90),Random(90))
Next
Péroject3DLoop.pbi
Code: Alles auswählen
;
; Capter 6
; Um die Betriebssystem Funktion GetTickCount() nicht zu offt
; Aufrufen zu müssen. Speichern wir sie hir zwischen.
Tickdammy=GetTickCount_()
; Um zu verhindern das sich bewegungen nicht immer gleich pro Frame
; berechen. Müssen wir bei allen Berechnungen diesem rechnung tragen.
; Dies wird duch Multiplizierne eines Alpha wertes erreicht. Den wir
; hir einmal pro 500 ms neu berechnen. Die ist nicht perfeckt.
; Aber für unsere Zwecke reicht es.
;
If AlphaCounter=0
AlphaCounter=Tickdammy+500
ElseIf AlphaCounter<TickDammy
AlphaCounter=Tickdammy+500
Alpha.f=50.0/AlphaFPS
AlphaFPS=0
Else
AlphaFPS + 1
EndIf
; Die Abfrage der Tastatur ist nicht jeden Frame nötig.
; Daher gibt es einen Timer der die Abfrage FPS unabhängig
; Durchfürt. Das gleiche machen wir Spater auch bei der Mouse
; Abfrage
If TKC<TickDammy
TKC=TickDammy+TKT
If CamMoveX.f<0
CamMoveX.f + Thrust.f/2
If CamMoveX.f>0
CamMoveX.f=0
EndIf
EndIf
If CamMoveX.f>0
CamMoveX.f - Thrust.f/2
If CamMoveX.f<0
CamMoveX.f=0
EndIf
EndIf
If CamMoveZ.f<0
CamMoveZ.f + Thrust.f/2
If CamMoveZ.f>0
CamMoveZ.f=0
EndIf
EndIf
If CamMoveZ.f>0
CamMoveZ.f - Thrust.f/2
If CamMoveZ.f<0
CamMoveZ.f=0
EndIf
EndIf
If bbkeydown(#Key_S)
If CamMoveZ.f>-MaxSpeedZ.f
CamMoveZ.f - Thrust.f
EndIf
ElseIf bbkeydown(#Key_W)
If CamMoveZ.f<MaxSpeedZ.f
CamMoveZ.f + Thrust.f
EndIf
ElseIf bbkeydown(#Key_A)
If CamMovex.f>-MaxSpeedX.f
CamMovex.f - Thrust.f
EndIf
ElseIf bbkeydown(#Key_D)
If CamMovex.f<MaxSpeedX.f
CamMovex.f + Thrust.f
EndIf
EndIf
EndIf
; Die Mouse bewegt die Camera
MBR=bbmousedown(#MOUSE_RIGHTBUTTON)
If MDC<TickDammy
MDC=TickDammy+MDT
If MBR And MBF
MDX=(ScreenX/2)-bbMouseX()
MDY=(ScreenY/2)-bbMouseY()
bbmovemouse(ScreenX/2, ScreenY/2)
ElseIf MBR And MBF=0
bbmovemouse(ScreenX/2, ScreenY/2)
MDC=TickDammy-1
MBF=1
Else
MDX=0
MDY=0
MBF=0
EndIf
EndIf
CamRX=(MDY/20)*alpha.f*-1
CamRy=(MDX/20)*alpha.f
bbmoveentity(cam,CamMoveX,0,CamMoveZ)
bbturnentity(cam,CamRX,CamRY,0)
; Hir werden alle Objecte Bewegt.
For i1 = 0 To 2000
bbturnentity(cubs(i1),0.1,0.1,0)
Next
Project2DLoop.pbi
Code: Alles auswählen
;
; Capter 6
;
If CodeWin=0
TextYCount=30
TextYPix=15
bbcolor($FF,$FF,$FF)
bbtext(10,TextYCount,"Alpha = "+StrF(Alpha,3)) :TextYCount+TextYPix
bbtext(10,TextYCount,"MDX = "+StrF(MDX,3)) :TextYCount+TextYPix
bbtext(10,TextYCount,"MDY = "+StrF(MDY,3)) :TextYCount+TextYPix
bbtext(10,TextYCount,"CamMoveX = "+StrF(CamMoveX,3)) :TextYCount+TextYPix
bbtext(10,TextYCount,"CamMoveZ = "+StrF(CamMoveZ,3)) :TextYCount+TextYPix
bbcolor($FF,$0,0)
bbtext(10,TextYCount,"Use WASD for Move and Left MB to Rotate Cam") :TextYCount+TextYPix
EndIf
; Dies ist ein wenig Monitoring. Damit wir sehen welche Variablen welche Werte annehmen.
Dieser Capter bringt nicht wirklich etwas neues. Aber die WASD
Steuerung macht lust auf mehr. Wie schon gesagt. Mit wenigen
handgriffen lassen sich die standart Problem beim programieren
von Spielen einfach lösen. Ich werde nicht jeden einzelnen Befehl
kommentieren. Wer mer über den Befehlsumfang wissen möcht.
Kann die Offizielle Englische hilfe zu rate ziehen. Wer es lieber auf
Deutsch mag. Die BlitzBasic Community hat eine Actuelle Deutsche
Hilfe am start.
http://www.optima-code.ch/PB/capter-006.zip