[B3D] 3rd Person Camera (mal wieder)
Übersicht

KrischanBetreff: [B3D] 3rd Person Camera (mal wieder) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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:
![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group