[B3D] 3rd Person Camera (mal wieder)

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Krischan

Betreff: [B3D] 3rd Person Camera (mal wieder)

BeitragMo, Nov 23, 2009 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Aus Langeweile habe ich mal aus meinem BlitzTiles-Projekt die 3rd Person Camera extrahiert und vereinfacht, viel Spass damit. Steuerung mit Maus/Pfeiltasten und das Mausrad ändert das FOV:

user posted image

Code: [AUSKLAPPEN]
; changeable variables
Const ScreenWidth%      = 800
Const ScreenHeight%      = 600
Const GameSpeed%      = 60
Const PlayerMovespeed#   = 10.0
Const PlayerSize#      = 16.0
Const CameraDistance#   = 100.0
Global PlayerTurnspeed#   = 25.0
Global CameraFOV#      = 90.0

; scene objects
Global Player%,PlayerHead%,PlayerCenter%,PlayerPivot%,PlayerCone%,Camera%

; collision types
Const CCAM%=1
Const CWORLD%=2

; constant speed
Global FramePeriod%=1000/GameSpeed
Global FrameTime%=MilliSecs()-FramePeriod

Graphics3D ScreenWidth,ScreenHeight,32,2

InitScene()

While Not KeyHit(1)
   
   Local FrameElapsed%,FrameTicks%,FrameTween#,t%,wf%,mwheel%
   
   Repeat FrameElapsed=MilliSecs()-FrameTime Until FrameElapsed
   FrameTicks=FrameElapsed/FramePeriod
   FrameTween=Float(FrameElapsed Mod FramePeriod)/Float(FramePeriod)
   
   ; SPACE = Wireframe
   If KeyHit(57) Then wf=1-wf : WireFrame wf
   
   ; Mousewheel: change FOV angle
   mwheel=MouseZSpeed()
   If mwheel<0 Then
      CameraFOV=CameraFOV+5
      If CameraFOV>150 Then CameraFOV=150
      CameraZoom Camera,SetFOV(CameraFOV)
   EndIf
   If mwheel>0 Then
      CameraFOV=CameraFOV-5
      If CameraFOV<30 Then CameraFOV=30
      CameraZoom Camera,SetFOV(CameraFOV)
   EndIf
   
   ; RMB = reset FOV to 90°
   If MouseDown(2) Then CameraFOV=90 : CameraZoom Camera,SetFOV(CameraFOV)
   
   For t=1 To FrameTicks
      
      FrameTime=FrameTime+FramePeriod
      If t=FrameTicks Then CaptureWorld
   
      ThirdCam(PlayerSize*10)
   
      UpdateWorld
      
   Next
   
   RenderWorld FrameTween
   
   Flip 0
   
Wend

End

Function InitScene()
   
   ; Create Plane and Mirror
   CreateGrid()
   
   ; Create Player body
   Player=CreateCube()
   ScaleMesh Player,PlayerSize,PlayerSize,PlayerSize
   PositionEntity Player,0,PlayerSize,0
   EntityFX Player,1
   EntityColor Player,255,0,0
   
   ; Create Player "nose"
   PlayerCone=CreateCone(32)
   RotateEntity PlayerCone,90,0,0
   ScaleMesh PlayerCone,PlayerSize,PlayerSize,PlayerSize
   PositionEntity PlayerCone,0,PlayerSize,PlayerSize*2
   EntityParent PlayerCone,Player
   EntityFX PlayerCone,1
   EntityColor PlayerCone,0,255,0
   
   ; Create invisible Player Pivots
   PlayerHead=CreatePivot()
   EntityParent PlayerHead,Player,1
   PositionEntity PlayerHead,0,PlayerSize,0
   PlayerCenter=CreatePivot(Player)
   PlayerPivot=CreatePivot()
   EntityParent PlayerPivot,PlayerCenter,1
   PositionEntity PlayerPivot,0,CameraDistance,-CameraDistance
   
   ; Create Camera
   Camera=CreateCamera()
   CameraRange Camera,0.1,1000
   CameraFogRange Camera,0.1,1000
   CameraFogMode Camera,True
   CameraClsColor Camera,150,200,255
   CameraFogColor Camera,150,200,255
   EntityType Camera,CCAM
   EntityRadius Camera,PlayerSize
   
   Collisions CCAM,CWORLD,2,3
   
   MoveMouse ScreenWidth/2,ScreenHeight/2
   HidePointer
   
End Function

; create a nice ground grid
Function CreateGrid()
   
   Local x%,y%
   
   Local plane%=CreatePlane()
   Local tex%=CreateTexture(512,512,8)
   
   SetBuffer TextureBuffer(tex)
   
   ; texture background
   Color 0,0,64 : Rect 0,0,512,512,1
   
   ; texture grid
   Color 255,255,255
   For x=0 To 511 Step 64
      For y=0 To 511 Step 64
         Rect x,y,64,64,0
      Next
   Next
   
   SetBuffer BackBuffer()
   
   EntityTexture plane,tex
   ScaleTexture tex,512,512
   EntityType plane,CWORLD
   EntityAlpha plane,0.5
   
   Local mirror=CreateMirror(plane)
   
End Function

; third cam logic
Function ThirdCam(maxdistance#=100)
   
   Local movex#,movez#,px#,py#,pz#
   
   ; move and turn player input
   movex#=(KeyDown(203)-KeyDown(205))
   movez#=(KeyDown(200)-KeyDown(208))
   
   ; increase turnspeed
   PlayerTurnspeed=PlayerTurnspeed+(movex*2.00)
   
   ; limit turnspeed
   PlayerTurnspeed=PlayerTurnspeed*0.6
   If Abs(PlayerTurnspeed)<0.0100 Then PlayerTurnspeed=0
   
   ; move player
   MoveEntity Player,0,0,movez*PlayerMovespeed
   
   ; move around player
   TurnEntity PlayerCenter,0,-MouseXSpeed()/3.0,0
   MoveMouse ScreenWidth/2,LimitMouseY()
   
   ; smart cam
   TurnEntity Player,0,PlayerTurnspeed,0
   px=EntityX(PlayerPivot)
   py=Normalize(((MouseY()-(ScreenHeight/2))*1.0/(ScreenHeight/2)),-1,1,0,maxdistance)
   pz=EntityZ(PlayerPivot)
   PositionEntity PlayerPivot,px,py,pz
   px=EntityX(PlayerPivot,1)
   py=EntityY(PlayerPivot,1)
   pz=EntityZ(PlayerPivot,1)
   PositionEntity Camera,px,py,pz
   PointEntity Camera,PlayerHead
   
End Function

; limits vertical cursor position to 10% / 90%
Function LimitMouseY()
   
   Local my%=MouseY()
   
   If my<(ScreenHeight*0.1) Then my=(ScreenHeight*0.1) Else If my>ScreenHeight*0.9 Then my=ScreenHeight*0.9
   
   Return my
   
End Function

; normalizes a value
Function Normalize#(value#=128.0,value_min#=0.0,value_max#=255.0,norm_min#=0.0,norm_max#=1.0)
   
   Return ((value#-value_min#)/(value_max#-value_min#))*(norm_max#-norm_min#)+norm_min#
   
End Function

; sets camera field of view to a given angle
Function SetFOV#(angle#)
   
   Return 1.0/Tan(angle/2.0)
   
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group