From 315ca2fb388f790791c9ce372cf44e00d51e0e7f Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Tue, 9 Feb 2021 20:34:59 -0500 Subject: Added trigger zones to the map Walking into a trigger zone runs a script. --- src/character_system.cpp | 13 +++++++++++++ src/main.cpp | 11 +++++++++-- src/map.cpp | 15 +++++++++++++++ src/map.h | 10 ++++++++++ src/renderer.cpp | 10 ++++++---- src/sprite.h | 2 ++ src/transform_system.cpp | 31 ++++++++++++++++++++----------- src/transform_system.h | 2 +- 8 files changed, 76 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/character_system.cpp b/src/character_system.cpp index fcd69dd..d4765bf 100644 --- a/src/character_system.cpp +++ b/src/character_system.cpp @@ -5,6 +5,7 @@ #include "game.h" #include "transform_system.h" #include "animation_system.h" +#include "script_system.h" void CharacterSystem::initSprite(int spriteId) { Sprite& sprite = game_.getSprite(spriteId); @@ -83,10 +84,22 @@ void CharacterSystem::tick(double dt) { if (collision.horiz.blocked) { pLoc.x() = sprite.loc.x();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; + } else if (collision.horiz.colliderSprite != -1) { + Sprite& collider = game_.getSprite(collision.horiz.colliderSprite); + + if (collider.walkthroughScript != "") { + game_.getSystem().runScript(collider.walkthroughScript); + } } if (collision.vert.blocked) { pLoc.y() = sprite.loc.y();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; + } else if (collision.vert.colliderSprite != -1) { + Sprite& collider = game_.getSprite(collision.vert.colliderSprite); + + if (collider.walkthroughScript != "") { + game_.getSystem().runScript(collider.walkthroughScript); + } } if (blocked && sprite.characterState == CharacterState::Running) { diff --git a/src/main.cpp b/src/main.cpp index 62c81f3..a350c8d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,7 +27,7 @@ void loop(Renderer& renderer) { int lucasSprite = game.emplaceSprite("lucas"); game.getSystem().initSprite(lucasSprite, game.getMap().getWarpPoint("spawn")); - game.getSystem().setUpCollision(lucasSprite, {-8, -8}, {12, 8}); + game.getSystem().setUpCollision(lucasSprite, {-8, -8}, {12, 8}, true); game.getSystem().initSprite(lucasSprite, "../res/sprites/lucas_anim.txt", renderer); game.getSprite(lucasSprite).controllable = true; game.getSystem().initSprite(lucasSprite); @@ -50,11 +50,18 @@ void loop(Renderer& renderer) { for (const Prototype& p : game.getMap().getPrototypes()) { int spriteId = game.emplaceSprite(p.name); game.getSystem().initSprite(spriteId, p.pos); - game.getSystem().setUpCollision(spriteId, p.collisionOffset, p.collisionSize); + game.getSystem().setUpCollision(spriteId, p.collisionOffset, p.collisionSize, true); game.getSystem().initSprite(spriteId, p.animationFilename, renderer); game.getSprite(spriteId).interactionScript = p.interactionScript; } + for (const Trigger& t : game.getMap().getTriggers()) { + int spriteId = game.emplaceSprite(t.name); + game.getSystem().initSprite(spriteId, t.pos); + game.getSystem().setUpCollision(spriteId, {0, 0}, t.size, false); + game.getSprite(spriteId).walkthroughScript = t.script; + } + game.getSystem().setFollowingSprite(lucasSprite); game.getSystem().unlockCamera(); diff --git a/src/map.cpp b/src/map.cpp index 2214d17..b6f6755 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -84,6 +84,21 @@ Map::Map(std::string_view filename, Renderer& renderer) { point.y() = object.getPosition().y; warpPoints_[object.getName()] = std::move(point); + } else if (object.getType() == "trigger") { + Trigger t; + t.name = object.getName(); + t.pos.x() = object.getPosition().x; + t.pos.y() = object.getPosition().y; + t.size.w() = object.getAABB().width; + t.size.h() = object.getAABB().height; + + for (const tmx::Property& property : object.getProperties()) { + if (property.getName() == "script") { + t.script = property.getStringValue(); + } + } + + triggers_.push_back(std::move(t)); } } } diff --git a/src/map.h b/src/map.h index 7bfb15e..4c5d6d4 100644 --- a/src/map.h +++ b/src/map.h @@ -28,6 +28,13 @@ struct Prototype { std::string interactionScript; }; +struct Trigger { + std::string name; + vec2i pos; + vec2i size; + std::string script; +}; + class Map { public: @@ -51,6 +58,8 @@ public: const vec2i& getWarpPoint(const std::string& name) const { return warpPoints_.at(name); } + const std::vector& getTriggers() const { return triggers_; } + private: vec2i mapSize_; @@ -60,6 +69,7 @@ private: int tilesetColumns_; std::vector prototypes_; std::map warpPoints_; + std::vector triggers_; }; #endif /* end of include guard: MAP_H_D95D6D47 */ diff --git a/src/renderer.cpp b/src/renderer.cpp index 0035ce2..87bbbcd 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -114,10 +114,12 @@ void Renderer::render(Game& game) { SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, nullptr); for (const Sprite& sprite : game.getSystem().getSpritesByY() | game.spriteView()) { - const SpriteFrame& frame = sprite.frames.at(sprite.animations.at(sprite.animationId).at(sprite.animationFrame)); - const SDL_Rect& src = frame.srcRect; - SDL_Rect dest { sprite.loc.x() - frame.center.x(), sprite.loc.y() - frame.center.y(), frame.size.w(), frame.size.h() }; - SDL_RenderCopy(ren_.get(), textures_.at(sprite.textureId).get(), &src, &dest); + if (sprite.isAnimated) { + const SpriteFrame& frame = sprite.frames.at(sprite.animations.at(sprite.animationId).at(sprite.animationFrame)); + const SDL_Rect& src = frame.srcRect; + SDL_Rect dest { sprite.loc.x() - frame.center.x(), sprite.loc.y() - frame.center.y(), frame.size.w(), frame.size.h() }; + SDL_RenderCopy(ren_.get(), textures_.at(sprite.textureId).get(), &src, &dest); + } } SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, nullptr); diff --git a/src/sprite.h b/src/sprite.h index b2cca87..4a65763 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -34,9 +34,11 @@ public: // Transform vec2i loc { 0, 0 }; bool collidable = false; + bool solid = false; vec2i collisionOffset; vec2i collisionSize; std::string interactionScript; + std::string walkthroughScript; // Animation bool isAnimated = false; diff --git a/src/transform_system.cpp b/src/transform_system.cpp index 3d65acb..2ec133e 100644 --- a/src/transform_system.cpp +++ b/src/transform_system.cpp @@ -8,11 +8,12 @@ void TransformSystem::initSprite(int spriteId, vec2i loc) { spritesByY_.emplace(loc.y(), spriteId); } -void TransformSystem::setUpCollision(int spriteId, vec2i offset, vec2i size) { +void TransformSystem::setUpCollision(int spriteId, vec2i offset, vec2i size, bool solid) { Sprite& sprite = game_.getSprite(spriteId); sprite.collidable = true; sprite.collisionOffset = offset; sprite.collisionSize = size; + sprite.solid = solid; addCollidable(spriteId); } @@ -74,9 +75,11 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire it++) { if (newColDR.y() >= it->second.lower && newColUL.y() <= it->second.upper) { - result.horiz.blocked = true; + int colliderSpriteId = std::get<1>(it->first); + Sprite& collider = game_.getSprite(colliderSpriteId); + result.horiz.blocked = collider.solid; result.horiz.dir = Direction::right; - result.horiz.colliderSprite = std::get<1>(it->first); + result.horiz.colliderSprite = colliderSpriteId; break; } @@ -104,9 +107,11 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire it++) { if (newColDR.y() >= it->second.lower && newColUL.y() <= it->second.upper) { - result.horiz.blocked = true; + int colliderSpriteId = std::get<1>(it->first); + Sprite& collider = game_.getSprite(colliderSpriteId); + result.horiz.blocked = collider.solid; result.horiz.dir = Direction::left; - result.horiz.colliderSprite = std::get<1>(it->first); + result.horiz.colliderSprite = colliderSpriteId; break; } @@ -134,9 +139,11 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire it++) { if (newColDR.x() >= it->second.lower && newColUL.x() <= it->second.upper) { - result.vert.blocked = true; - result.vert.dir = Direction::down; - result.vert.colliderSprite = std::get<1>(it->first); + int colliderSpriteId = std::get<1>(it->first); + Sprite& collider = game_.getSprite(colliderSpriteId); + result.horiz.blocked = collider.solid; + result.horiz.dir = Direction::down; + result.horiz.colliderSprite = colliderSpriteId; break; } @@ -164,9 +171,11 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire it++) { if (newColDR.x() >= it->second.lower && newColUL.x() <= it->second.upper) { - result.vert.blocked = true; - result.vert.dir = Direction::up; - result.vert.colliderSprite = std::get<1>(it->first); + int colliderSpriteId = std::get<1>(it->first); + Sprite& collider = game_.getSprite(colliderSpriteId); + result.horiz.blocked = collider.solid; + result.horiz.dir = Direction::up; + result.horiz.colliderSprite = colliderSpriteId; break; } diff --git a/src/transform_system.h b/src/transform_system.h index a7294ce..10e33db 100644 --- a/src/transform_system.h +++ b/src/transform_system.h @@ -31,7 +31,7 @@ public: void initSprite(int spriteId, vec2i loc); - void setUpCollision(int spriteId, vec2i offset, vec2i size); + void setUpCollision(int spriteId, vec2i offset, vec2i size, bool solid); void moveSprite(int spriteId, vec2i newLoc); -- cgit 1.4.1