diff --git a/data/sprites/monsters.sprite b/data/sprites/monsters.sprite index f54ce4e..e9270f0 100644 --- a/data/sprites/monsters.sprite +++ b/data/sprites/monsters.sprite @@ -57,7 +57,7 @@ "number_of_frames" : 3, "frame_time" : 150, "originx" : 16, - "originy" : 40 + "originy" : 16 }, "bat_W" : { @@ -69,7 +69,7 @@ "number_of_frames" : 3, "frame_time" : 150, "originx" : 16, - "originy" : 40 + "originy" : 16 }, "bat_S" : { @@ -81,7 +81,7 @@ "number_of_frames" : 3, "frame_time" : 150, "originx" : 16, - "originy" : 40 + "originy" : 16 }, "bat_E" : { @@ -93,7 +93,7 @@ "number_of_frames" : 3, "frame_time" : 150, "originx" : 16, - "originy" : 40 + "originy" : 16 } } diff --git a/src/saland/Game.cpp b/src/saland/Game.cpp index e4e52d2..f867f6b 100644 --- a/src/saland/Game.cpp +++ b/src/saland/Game.cpp @@ -121,6 +121,14 @@ Game::Game() { barrel.get()->X = 100.0f; barrel.get()->Y = 100.0f; data->placeables.push_back(barrel); + + + std::shared_ptr bat = std::make_shared(); + bat.get()->Radius = 16.0f; + bat.get()->race = "bat"; + bat.get()->X = 200.0f; + bat.get()->Y = 200.0f; + data->placeables.push_back(bat); data->placeables.push_back(data->human); @@ -138,6 +146,16 @@ Game::Game() { myFixtureDef.density = 10.0f; data->human->body->CreateFixture(&myFixtureDef); //add a fixture to the body + b2BodyDef batBodyDef; + batBodyDef.type = b2_dynamicBody; + batBodyDef.position.Set(0,0); + batBodyDef.linearDamping = 1.0f; + bat->body = data->physicsBox->CreateBody(&batBodyDef); + b2FixtureDef batDef; + batDef.shape = &circleShape; + batDef.density = 10.0f; + bat->body->CreateFixture(&batDef); + b2BodyDef barrelBodyDef; barrelBodyDef.type = b2_staticBody; barrelBodyDef.position.Set(barrel.get()->X/32.0f, barrel.get()->Y/32.0f); @@ -194,6 +212,18 @@ static void DrawHumanEntity(SDL_Renderer* target, sago::SagoSpriteHolder* sHolde myHair.Draw(target, time, entity->X-offsetX, entity->Y-offsetY);*/ } +static void DrawMonster(SDL_Renderer* target, sago::SagoSpriteHolder* sHolder, const Monster *entity, float time, int offsetX, int offsetY, bool drawCollision) { + if (drawCollision || true) { + circleRGBA(target, + entity->X-offsetX, entity->Y-offsetY, entity->Radius, + 255, 255, 0, 255); + } + const sago::SagoSprite &mySprite = sHolder->GetSprite(entity->race + "_"+std::string(1,entity->direction)); + mySprite.Draw(target, time, std::round(entity->X)-offsetX, std::round(entity->Y)-offsetY); +} + + + void Game::Draw(SDL_Renderer* target) { data->topx = std::round(data->center_x - 1024.0/2.0); data->topy = std::round(data->center_y - 768.0/2.0); @@ -225,6 +255,10 @@ void Game::Draw(SDL_Renderer* target) { if (h) { DrawHumanEntity(target, globalData.spriteHolder.get(), h, SDL_GetTicks(), data->topx, data->topy, false); } + Monster* monster = dynamic_cast(p.get()); + if (monster) { + DrawMonster(target, globalData.spriteHolder.get(), monster, SDL_GetTicks(), data->topx, data->topy, false); + } } } @@ -297,6 +331,13 @@ static void UpdateHuman(Human *entity, float fDeltaTime) { entity->Y = place.y*pixel2unit; } +static void UpdateMonster(Monster *entity, float fDeltaTime) { + SetCreatureMovementEntity(entity, entity->moveX, entity->moveY); + b2Vec2 place = entity->body->GetPosition(); + entity->X = place.x*pixel2unit; + entity->Y = place.y*pixel2unit; +} + void Game::Update() { Uint32 nowTime = SDL_GetTicks(); Uint32 deltaTime = nowTime - data->lastUpdate; @@ -318,6 +359,12 @@ void Game::Update() { data->human->moveX = deltaX; data->human->moveY = deltaY; UpdateHuman(data->human.get(), deltaTime); + for(auto& entity : data->placeables) { + Monster* monster = dynamic_cast(entity.get()); + if (monster) { + UpdateMonster(monster, deltaTime); + } + } data->center_x = std::round(data->human->X); data->center_y = std::round(data->human->Y); int mousex; diff --git a/src/saland/model/placeables.hpp b/src/saland/model/placeables.hpp index 39a2c51..d50ae49 100644 --- a/src/saland/model/placeables.hpp +++ b/src/saland/model/placeables.hpp @@ -50,6 +50,8 @@ public: float mana = 10.0; char direction = 'S'; bool moving = false; + float moveX = 0.0; + float moveY = 0.0; virtual bool isStatic() override { return false; } }; @@ -58,8 +60,11 @@ public: std::string race = "male"; float castTimeRemaining = 0; //If non-zero then we are casting a spell float castTime = 400; //Number of milliseconds it will take to complete the cast - float moveX = 0.0; - float moveY = 0.0; +}; + +class Monster : public Creature { +public: + std::string race = "bat"; }; #endif /* PLACEABLES_HPP */