; ; ------------------------------------------------------------ ; ; PureBasic - Animation ; ; (c) Fantaisie Software ; ; ------------------------------------------------------------ ; ;Cursor = Move Robot ;Speed animation = PageUp and PageDown IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb" #ANIM_FADE_SPEED = 7.5 ; animation crossfade speed in % of full weight per second Enumeration 1 #Idle #Walk EndEnumeration #NUM_ANIMS = 2 ; number of animations Define.f KeyX, KeyY, MouseX, MouseY, Angle, Speed = 1.0, TimeSinceLastFrame Global RobotMove, FadeIn, FadeOut, Anim Global Dim Anim.s(#NUM_ANIMS) Declare fadeAnimations(deltaTime.f) Declare.f CurveAngle(Actuelle.f, Target.f, P.f) Declare.f WrapPi(Angle.f) Macro Clamp(num, min, max) If num<min num=min ElseIf num>max num=max EndIf EndMacro If InitEngine3D() Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures" , #PB_3DArchive_FileSystem) Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Models" , #PB_3DArchive_FileSystem) Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Scripts" , #PB_3DArchive_FileSystem) Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/desert.zip", #PB_3DArchive_Zip) Parse3DScripts() InitSprite() InitKeyboard() InitMouse() If Screen3DRequester() WorldShadows(#PB_Shadow_Modulative, 0, RGB(180, 180, 255)) ;Ground ; CreateMaterial(0, LoadTexture(0, "Dirt.jpg")) CreatePlane(0, 1500, 1500, 40, 40, 15, 15) CreateEntity(0,MeshID(0),MaterialID(0)) EntityRenderMode(0, 0) ;Mesh ; LoadMesh(1, "robot.mesh") ; Entity ; CreateEntity(1, MeshID(1), #PB_Material_None, 0, 0, -50) EntityAnimationBlendMode(1, #PB_EntityAnimation_Average) ; Animation ; animNames$ = "Idle,Walk" ; populate our animation List For i = 1 To #NUM_ANIMS Anim(i) = StringField(animNames$, i, ",") ;EnableEntityAnimation(1, Anim(i), #True, #False) Fadein = #False FadeOut = #False Next ; SkyBox ; SkyBox("Desert07.jpg") ; Camera ; CreateCamera(0, 0, 0, 100, 100) MoveCamera(0, 50, 100, 180, #PB_Absolute) CameraLookAt(0, EntityX(1), EntityY(1) + 40, EntityZ(1)) CreateLight(0, RGB(255, 255, 255), -40, 100, 80) AmbientColor(RGB(80, 80, 80)) Repeat Screen3DEvents() If ExamineMouse() MouseX = -MouseDeltaX()/10 MouseY = -MouseDeltaY()/10 EndIf RobotMove = #False Angle = EntityYaw(1) If ExamineKeyboard() If KeyboardPushed(#PB_Key_Left) MoveEntity(1, -1 * Speed, 0, 0) Angle = 180 RobotMove = #True ElseIf KeyboardPushed(#PB_Key_Right) MoveEntity(1, 1 * Speed, 0, 0) Angle = 0 RobotMove = #True ElseIf KeyboardPushed(#PB_Key_Up) MoveEntity(1, 0, 0, -1 * Speed) Angle = 90 RobotMove = #True ElseIf KeyboardPushed(#PB_Key_Down) MoveEntity(1, 0, 0, 1 * Speed) Angle = -90 RobotMove = #True EndIf If KeyboardPushed(#PB_Key_PageUp) And Speed < 1.0 Speed + 0.05 ElseIf KeyboardPushed(#PB_Key_PageDown) And Speed > 0.1 Speed - 0.05 EndIf EndIf RotateEntity(1, 0, CurveAngle(EntityYaw(1), Angle, 4 * TimeSinceLastFrame), 0) If RobotMove If Anim <> #Walk Anim = #Walk Fadein = #Walk FadeOut = #Idle StartEntityAnimation(1, Anim(Anim), #PB_EntityAnimation_Manual) EndIf Else If Anim <> #Idle Anim = #Idle Fadein = #Idle FadeOut = #Walk StartEntityAnimation(1, Anim(Anim), #PB_EntityAnimation_Manual) EndIf EndIf AddEntityAnimationTime(1, Anim(Anim), TimeSinceLastFrame) fadeAnimations(TimeSinceLastFrame / 1000.0) RotateCamera(0, MouseY, MouseX, 0, #PB_Relative) TimeSinceLastFrame = RenderWorld() * Speed FlipBuffers() Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1 EndIf Else MessageRequester("Error", "The 3D Engine can't be initialized",0) EndIf End Procedure fadeAnimations(deltaTime.f) Protected.f newWeight If FadeIn ; slowly fade this animation in Until it has full weight newWeight = GetEntityAnimationWeight(1, Anim(FadeIn)) + deltaTime * #ANIM_FADE_SPEED Clamp(newWeight, 0, 1) SetEntityAnimationWeight(1, Anim(FadeIn), newWeight) If newWeight >= 1 FadeIn = #False EndIf EndIf If FadeOut ; slowly fade this animation out Until it has no weight, And then disable it newWeight.f = GetEntityAnimationWeight(1, Anim(FadeOut)) - deltaTime * #ANIM_FADE_SPEED Clamp(newWeight, 0, 1) SetEntityAnimationWeight(1, Anim(FadeOut), newWeight) If newWeight <= 0 StopEntityAnimation(1, Anim(FadeOut)) FadeOut = #False EndIf EndIf EndProcedure Procedure.f WrapPi(Angle.f) Angle + 180 Angle - Round(Angle * 1/360.0, #PB_Round_Down) * 360 Angle - 180 ProcedureReturn Angle EndProcedure Procedure.f CurveAngle(Actuelle.f, Target.f, P.f) Delta.f = WrapPi(Target-Actuelle) If P > 1000 : P = 1000 : EndIf Valeur.f = Actuelle + (Delta * P / 1000) ProcedureReturn WrapPi(Valeur) EndProcedure