Журнал о программированнии на языках Blitz3D, BlitzPlus, BlitzMax

Blitz3D-код:RecordAndPlay.bb

Материал из Blitz Et Cetera

Перейти к: навигация, поиск
; Entity recorder


; by matt griffiths (Rims)
; use any way you like.
; any questions: ca0mgr@hotmail.com

Const RECORD_FILE_VERSION$="1.00"

Graphics3D 640,480,0,2
SetBuffer BackBuffer()

Type trail
     Field ent,life
End Type

; required global
Global recordFile=0
Global RECORD_state=0

Global leave_a_trail=1 ; 0 for no trail, 1 for.

; for freeLook(cam)
Global FL_Pitch#,FL_Yaw#,FL_Roll#,FL_XSpeed#,FL_YSpeed#,FL_ZSpeed#
Global camera=CreateCamera()
     MoveEntity camera,0,3,-5
     
     
     
     
     
; just make some objects to test with
plane=CreatePlane()
     EntityColor plane,255,0,0
     t=CreateTexture(32,32) : SetBuffer TextureBuffer(t)
     For i=0 To 31 Step 16
          For j=0 To 31 Step 16
               Color i*120,i*120,i*120
               Rect i,j,32/3,32/3
          Next
     Next
     SetBuffer BackBuffer()
     EntityTexture plane,t
     FreeTexture t    
c1=CreateCube()
     EntityColor c1,255,255,0
     PositionEntity c1,5,1,5    
c2=CopyEntity(c1)
     EntityColor c2,255,0,255
     PositionEntity c2,-5,1,-5
s1=CreateSphere()
     EntityColor s1,90,90,145
     EntityAlpha s1,0.4
     PositionEntity s1,-5,1,5
s2=CopyEntity(s1)
     PositionEntity s2,5,1,-5
     EntityBlend s2,3
     

; timing
gameFPS = 30
framePeriod = 1000 / gameFPS
frameTime = MilliSecs () - framePeriod
     

     
     
     
     
While KeyHit(1)=0
     Repeat
          frameElapsed = MilliSecs () - frameTime
     Until frameElapsed
     frameTicks = frameElapsed / framePeriod
     frameTween# = Float (frameElapsed Mod framePeriod) / Float (framePeriod)
     
     For frameLimit = 1 To frameTicks
          If frameLimit = frameTicks Then CaptureWorld
          frameTime = frameTime + framePeriod
         
          ; update everything...
          If KeyHit(19) Then startRecording("recording.rec")     ; R
          If KeyHit(25) Then startPlayBack("recording.rec")     ; P
     
          If KeyHit(57) Then stopRecordingAndPlayback()     ; Space
     
          If RECORD_state=1 ; are we recording?
               record(camera)
          ElseIf RECORD_state=2 ; oh, we're playing back a file
               playback(camera) ; change camera to any object handle
          EndIf
     
          ; handles all trail left behind
          If leave_a_trail
               For h.trail=Each trail
                    If h\life < 0
                         ; kill it
                         FreeEntity h\ent
                         Delete h
                    Else
                         h\life=h\life-1
                         d#=(1.0/150.0)*Float(h\life) ; (current alpha is (1.0/Total Life)*current life)
                         EntityAlpha h\ent,d
                    EndIf
               Next
          EndIf
     
          FreeLook(Camera)
     
          UpdateWorld    
     Next
     
     RenderWorld     frametween
     
     Color 255,0,0
     If RECORD_state=1 Then Text 0,0,"RECORDING" ElseIf RECORD_state=2 Then Text 0,0,"PLAYBACK"
     
     Flip
Wend
End



Function record(ent)
     If ent=0 Then
          DebugLog "Entity does not exist"
          Return    
     EndIf
     If recordFile=0 Then Return

     WriteFloat recordFile,EntityX(ent)
     WriteFloat recordFile,EntityY(ent)
     WriteFloat recordFile,EntityZ(ent)

     WriteFloat recordFile,EntityPitch(ent)
     WriteFloat recordFile,EntityYaw(ent)
     WriteFloat recordFile,EntityRoll(ent)
     
     If leave_a_trail
          If Rand(1,3)=1 ; only once every 3 cycles (on average)
               ; optional... leaves a trail which fades out.
               t.trail=New trail
               t\ent=CreateCube()
               EntityColor t\ent,255,0,0
               ScaleEntity t\ent,0.5,0.5,0.5
               PositionEntity t\ent,EntityX(ent),EntityY(ent),EntityZ(ent)
               t\life=150
          EndIf
     EndIf
End Function


Function startRecording(file$)
     If recordFile <> 0 Then CloseFile recordFile
     recordFile=WriteFile(file)
     RECORD_state=1
     ; write the recorder version
     WriteLine recordFile,RECORD_FILE_VERSION
End Function


Function startPlayBack(file$)
     recordFile=ReadFile(file)
     RECORD_state=2    
     ; check the file and recorder versions
     r$=ReadLine(recordFile)
     If r <> RECORD_FILE_VERSION
          RuntimeError("Wrong file version (file: "+r+". Rrecorder: "+RECORD_FILE_VERSION+")")
          End
     EndIf
End Function


Function stopRecordingAndPlayback()
     If RECORD_state=1 Or RECORD_state=2 ; are we recording OR playing back?
          CloseFile recordFile
          RECORD_state=0
     EndIf    
End Function


Function playBack(entity)
     If entity=0 Then Return
     If recordFile=0 Then Return

     If Not Eof(recordFile)
          x#=ReadFloat(recordFile)
          y#=ReadFloat(recordFile)
          z#=ReadFloat(recordFile)
         
          PositionEntity entity,x,y,z
         
          New_pitch#=ReadFloat(recordFile)
          New_yaw#=ReadFloat(recordFile)
          New_roll#=ReadFloat(recordFile)
         
          RotateEntity entity,new_pitch,new_yaw,new_roll

          If leave_a_trail
               If Rand(1,3)=1 ; only once every 3 cycles on average
                    ; optional... leaves a trail which fades out.
                    t.trail=New trail
                    t\ent=CreateCube()
                    EntityColor t\ent,255,0,0
                    ScaleEntity t\ent,0.5,0.5,0.5
                    PositionEntity t\ent,EntityX(entity),EntityY(entity),EntityZ(entity)
                    t\life=150
               EndIf
          EndIf          
     Else
          CloseFile(recordFile)                    
          RECORD_state=0
     EndIf    
End Function




; FreeLook function by Syntax Error
Function FreeLook(FL_Cam)
          FL_Pitch#=FL_Pitch#-(-MouseYSpeed()*0.02) : FL_Pitch#=FL_Pitch#/1.2
    FL_Yaw#=FL_Yaw#+-(MouseXSpeed()*0.02) : FL_Yaw#=FL_Yaw#/1.2
    MoveMouse (GraphicsWidth()/2,GraphicsHeight()/2)
    FL_ZSpeed#=FL_ZSpeed#+Float(KeyDown(17)-KeyDown(31))*0.12 : FL_ZSpeed#=FL_ZSpeed#/1.14;  w & s
          FL_XSpeed#=FL_XSpeed#+Float(KeyDown(32)-KeyDown(30))*0.12 : FL_XSpeed#=FL_XSpeed#/1.14 ; a & d
          FL_YSpeed#=FL_YSpeed#+Float(KeyDown(19)-KeyDown(33))*0.12 : FL_YSpeed#=FL_YSpeed#/1.14 ; r & f
          FL_Roll#=(FL_Yaw#*1.1)-(FL_XSpeed#*2.3)
    MoveEntity FL_Cam,FL_XSpeed#,FL_YSpeed#+Abs(FL_Roll#*FL_XSpeed#)/50,FL_ZSpeed#
          Local cp#=EntityPitch(FL_Cam,True)+FL_Pitch#
          If cp<-89 Then cp=-89
          If cp>89 Then cp=89
          RotateEntity FL_Cam,cp,EntityYaw(FL_Cam)+FL_Yaw#,FL_Roll#

End Function

Другие

Друзья