// ---------------------------------------------------------------- // From Game Programming in C++ by Sanjay Madhav // Copyright (C) 2017 Sanjay Madhav. All rights reserved. // // Released under the BSD License // See LICENSE in root directory for full details. // ---------------------------------------------------------------- #include "FollowActor.h" #include "SkeletalMeshComponent.h" #include "Game.h" #include "Renderer.h" #include "FollowCamera.h" #include "MoveComponent.h" #include "MirrorCamera.h" #include "LevelLoader.h" FollowActor::FollowActor(Game* game) :Actor(game) ,mMoving(false) { mMeshComp = new SkeletalMeshComponent(this); mMeshComp->SetMesh(game->GetRenderer()->GetMesh("Assets/CatWarrior.gpmesh")); mMeshComp->SetSkeleton(game->GetSkeleton("Assets/CatWarrior.gpskel")); mMeshComp->PlayAnimation(game->GetAnimation("Assets/CatActionIdle.gpanim")); SetPosition(Vector3(0.0f, 0.0f, -100.0f)); mMoveComp = new MoveComponent(this); mCameraComp = new FollowCamera(this); mCameraComp->SnapToIdeal(); // Add a component for the mirror camera MirrorCamera* mirror = new MirrorCamera(this); mirror->SnapToIdeal(); game->SetFollowActor(this); } void FollowActor::ActorInput(const uint8_t* keys) { float forwardSpeed = 0.0f; float angularSpeed = 0.0f; // wasd movement if (keys[SDL_SCANCODE_W]) { forwardSpeed += 400.0f; } if (keys[SDL_SCANCODE_S]) { forwardSpeed -= 400.0f; } if (keys[SDL_SCANCODE_A]) { angularSpeed -= Math::Pi; } if (keys[SDL_SCANCODE_D]) { angularSpeed += Math::Pi; } // Did we just start moving? if (!mMoving && !Math::NearZero(forwardSpeed)) { mMoving = true; mMeshComp->PlayAnimation(GetGame()->GetAnimation("Assets/CatRunSprint.gpanim"), 1.25f); } // Or did we just stop moving? else if (mMoving && Math::NearZero(forwardSpeed)) { mMoving = false; mMeshComp->PlayAnimation(GetGame()->GetAnimation("Assets/CatActionIdle.gpanim")); } mMoveComp->SetForwardSpeed(forwardSpeed); mMoveComp->SetAngularSpeed(angularSpeed); } void FollowActor::SetVisible(bool visible) { mMeshComp->SetVisible(visible); } void FollowActor::LoadProperties(const rapidjson::Value& inObj) { Actor::LoadProperties(inObj); JsonHelper::GetBool(inObj, "moving", mMoving); } void FollowActor::SaveProperties(rapidjson::Document::AllocatorType& alloc, rapidjson::Value& inObj) const { Actor::SaveProperties(alloc, inObj); JsonHelper::AddBool(alloc, inObj, "moving", mMoving); }