Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ set(FRAMEWORK_SOURCES
"Font.cpp"
"Image.cpp"
"Spritesheet.cpp"
"Animation.cpp"

"Colour.cpp"

Expand Down
56 changes: 56 additions & 0 deletions include/framework/Animation.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#pragma once

#include <utility>
#include <vector>
#include <map>

#include "Maths.hpp"
#include "Spritesheet.hpp"

namespace Framework {
struct AnimationFrame {
uint16_t index;
float duration;
Framework::SpriteTransform transform;
};

// Multiple frames make an animation
typedef std::vector<AnimationFrame> Animation;

// Basic interface class
class AnimationInterface {
public:
virtual void update(float dt) = 0;
virtual void render(Framework::vec2 position) = 0;
};

class AnimationHandler : public AnimationInterface {
public:
AnimationHandler(const Framework::Spritesheet& _spritesheet, Animation _animation, float time_offset = 0.0f, Framework::vec2 _position_offset = Framework::VEC_NULL);

void update(float dt);
void render(Framework::vec2 position);

private:
const Framework::Spritesheet& spritesheet;
Animation animation;
Framework::vec2 position_offset;

float current_time = 0.0f;

uint16_t current_index = 0;
};

typedef std::map<Framework::vec2, Animation> MultiTileAnimation;

class MultiTileAnimationHandler : public AnimationInterface {
public:
MultiTileAnimationHandler(const Framework::Spritesheet& _spritesheet, MultiTileAnimation _animation, float time_offset = 0.0f, Framework::vec2 _position_offset = Framework::VEC_NULL);

void update(float dt);
void render(Framework::vec2 position);

private:
std::vector<AnimationHandler> animations;
};
}
6 changes: 6 additions & 0 deletions include/game/GameStages.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,18 @@

#include "MenuStages.hpp"

#include "Animation.hpp"

class GameStage : public Framework::BaseStage {
public:
void start();

bool update(float dt);
void render();

private:
std::unique_ptr<Framework::AnimationInterface> spinning_sword;
std::unique_ptr<Framework::AnimationInterface> big_animation;
};

class PausedStage : public Framework::BaseStage {
Expand Down
43 changes: 43 additions & 0 deletions src/framework/Animation.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#include "Animation.hpp"

namespace Framework {
AnimationHandler::AnimationHandler(const Framework::Spritesheet& _spritesheet, Animation _animation, float time_offset, Framework::vec2 _position_offset) : spritesheet(_spritesheet) {
animation = _animation;
current_time = time_offset;
position_offset = _position_offset;
}

void AnimationHandler::update(float dt) {
current_time += dt;
float t = animation.at(current_index).duration;
while (current_time >= t) {
current_time -= t;
current_index++;
current_index %= animation.size();
t = animation.at(current_index).duration;
}
}

void AnimationHandler::render(Framework::vec2 position) {
const AnimationFrame& current_frame = animation.at(current_index);
spritesheet.sprite(current_frame.index, position + position_offset, current_frame.transform);
}

MultiTileAnimationHandler::MultiTileAnimationHandler(const Framework::Spritesheet& _spritesheet, MultiTileAnimation _animation, float time_offset, Framework::vec2 _position_offset) {
for (const auto& [position, animation] : _animation) {
animations.push_back(AnimationHandler(_spritesheet, animation, time_offset, position + _position_offset));
}
}

void MultiTileAnimationHandler::update(float dt) {
for (AnimationHandler& animation_handler : animations) {
animation_handler.update(dt);
}
}

void MultiTileAnimationHandler::render(Framework::vec2 position) {
for (AnimationHandler& animation_handler : animations) {
animation_handler.render(position);
}
}
}
58 changes: 58 additions & 0 deletions src/game/GameStages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,66 @@ void GameStage::start() {

// Start transition
transition->open();

// Create animation
Framework::Animation demo_animation = {
{0, 0.5f, Framework::SpriteTransform::NONE},
{0, 0.5f, Framework::SpriteTransform::ROTATE_90_CW},
{0, 0.5f, Framework::SpriteTransform::ROTATE_180_CW},
{0, 0.5f, Framework::SpriteTransform::ROTATE_270_CW}
};
// Create animation handler
spinning_sword = std::make_unique<Framework::AnimationHandler>(graphics_objects->spritesheets[GRAPHICS_OBJECTS::SPRITESHEETS::MAIN_SPRITESHEET], demo_animation);

// Create big animation
Framework::MultiTileAnimation big_multi_animation = {
{
{0, 0},
{
{4, 1.0f, Framework::SpriteTransform::NONE},
{8, 0.4f, Framework::SpriteTransform::NONE},
{12, 0.2f, Framework::SpriteTransform::NONE},
{8, 0.4f, Framework::SpriteTransform::NONE},
}
},
{
{16, 0},
{
{5, 1.0f, Framework::SpriteTransform::NONE},
{9, 0.4f, Framework::SpriteTransform::NONE},
{13, 0.2f, Framework::SpriteTransform::NONE},
{9, 0.4f, Framework::SpriteTransform::NONE},
}
},
{
{32, 0},
{
{6, 1.0f, Framework::SpriteTransform::NONE},
{10, 0.4f, Framework::SpriteTransform::NONE},
{14, 0.2f, Framework::SpriteTransform::NONE},
{10, 0.4f, Framework::SpriteTransform::NONE},
}
},
{
{48, 0},
{
{7, 1.0f, Framework::SpriteTransform::NONE},
{11, 0.4f, Framework::SpriteTransform::NONE},
{15, 0.2f, Framework::SpriteTransform::NONE},
{11, 0.4f, Framework::SpriteTransform::NONE},
}
},
};
// Create animation handler
big_animation = std::make_unique<Framework::MultiTileAnimationHandler>(graphics_objects->spritesheets[GRAPHICS_OBJECTS::SPRITESHEETS::MAIN_SPRITESHEET], big_multi_animation);
}

bool GameStage::update(float dt) {
transition->update(dt);

spinning_sword->update(dt);
big_animation->update(dt);

if (input->just_down(Framework::KeyHandler::Key::ESCAPE) || input->just_down(Framework::KeyHandler::Key::P)) {
finish(new PausedStage(this), false);
}
Expand All @@ -25,6 +80,9 @@ void GameStage::render() {

graphics_objects->spritesheets[GRAPHICS_OBJECTS::SPRITESHEETS::MAIN_SPRITESHEET].sprite(0, Framework::Vec(128, 64));

spinning_sword->render({ 64, 64 });
big_animation->render({ 64, 96 });

transition->render();
}

Expand Down
Loading