#define OLC_PGE_APPLICATION #include "olcPixelGameEngine.h" #include "olcUTIL_Camera2D.h" #define OLC_PGEX_TRANSFORMEDVIEW #include "olcPGEX_TransformedView.h" #include "olcUTIL_Animate2D.h" #include "Monster.h" #include "Animation.h" const vi2d WINDOW_SIZE={24*8,24*8}; extern std::mapMONSTER_DATA; std::mapANIMATION_DATA; struct Player{ private: int hp=100,maxhp=hp; int atk=10; vf2d pos; float moveSpd=1.0f; float size=1.0f; float attack_range=1.5f; AnimationState animState=AnimationState::IDLE_S; Animate2D::Animationanimation; Animate2D::AnimationState internal_animState; Key lastReleasedMovementKey; public: Player(){}; Player(vf2d pos): pos(pos){ }; void SetX(float x){ pos.x=x; }; void SetY(float y){ pos.y=y; } void SetPos(vf2d pos){ this->pos=pos; } vf2d&GetPos(){ return pos; } float GetX(){ return pos.x; } float GetY(){ return pos.y; } int GetHealth(){ return hp; } int GetMaxHealth(){ return maxhp; } int GetAttack(){ return atk; } float GetMoveSpdMult(){ return moveSpd; } float GetSizeMult(){ return size; } float GetAttackRangeMult(){ return attack_range; } void Update(float fElapsedTime){ animation.UpdateState(internal_animState,fElapsedTime); } void AddAnimation(AnimationState state){ animation.AddState(state,ANIMATION_DATA[state]); }; void UpdateAnimation(AnimationState animState){ animation.ChangeState(internal_animState,animState); } Animate2D::Frame GetFrame(){ return animation.GetFrame(internal_animState); } void SetLastReleasedMovementKey(Key k){ lastReleasedMovementKey=k; } Key GetLastReleasedMovementKey(){ return lastReleasedMovementKey; } }; class Crawler : public olc::PixelGameEngine { const vi2d WORLD_SIZE={64,8}; Camera2D camera; TileTransformedView view; Player player=Player{{}}; Renderable GFX_Pl_Sheet,GFX_Slime_Sheet; public: Crawler() { sAppName = "Crawler Concept"; } public: bool OnUserCreate() override { //Initialize Camera. camera=Camera2D{WINDOW_SIZE}; camera.SetMode(olc::utils::Camera2D::Mode::LazyFollow); camera.SetTarget(player.GetPos()); camera.SetWorldBoundary({0,0},WORLD_SIZE*24); camera.EnableWorldBoundary(true); //Graphics GFX_Pl_Sheet.Load("assets/nico-warrior.png"); GFX_Slime_Sheet.Load("assets/slime.png"); //Animations InitializeAnimations(); player.AddAnimation(AnimationState::WALK_N); player.AddAnimation(AnimationState::WALK_E); player.AddAnimation(AnimationState::WALK_S); player.AddAnimation(AnimationState::WALK_W); player.AddAnimation(AnimationState::IDLE_N); player.AddAnimation(AnimationState::IDLE_E); player.AddAnimation(AnimationState::IDLE_S); player.AddAnimation(AnimationState::IDLE_W); view=TileTransformedView{GetScreenSize(),{1,1}}; player.SetPos({4*24,4*24}); player.UpdateAnimation(AnimationState::IDLE_S); std::cout<0){ player.SetX(player.GetX()-fElapsedTime*100*player.GetMoveSpdMult()); } else { player.SetX(12); } if(setIdleAnimation){ player.UpdateAnimation(AnimationState::WALK_W); } setIdleAnimation=false; } if(GetKey(UP).bHeld){ if(player.GetPos().y-12+fElapsedTime*100*player.GetMoveSpdMult()>0){ player.SetY(player.GetY()-fElapsedTime*100*player.GetMoveSpdMult()); } else { player.SetY(12); } if(setIdleAnimation){ player.UpdateAnimation(AnimationState::WALK_N); } setIdleAnimation=false; } if(GetKey(DOWN).bHeld){ if(player.GetPos().y+12+fElapsedTime*100*player.GetMoveSpdMult()Decal(),player.GetFrame().GetSourceRect().pos,player.GetFrame().GetSourceRect().size); } }; int main() { Crawler demo; if (demo.Construct(WINDOW_SIZE.x, WINDOW_SIZE.y, 4, 4)) demo.Start(); return 0; }