#include <swan/swan.h> | #include <swan/swan.h> | ||||
#include <array> | #include <array> | ||||
class PlayerEntity: public Swan::PhysicsEntity, public Swan::InventoryTrait::HasInventory { | |||||
class PlayerEntity: public Swan::PhysicsEntity, public Swan::InventoryTrait { | |||||
public: | public: | ||||
PlayerEntity(const Swan::Context &ctx, Swan::Vec2 pos); | PlayerEntity(const Swan::Context &ctx, Swan::Vec2 pos); | ||||
PlayerEntity(const Swan::Context &ctx, const PackObject &obj); | PlayerEntity(const Swan::Context &ctx, const PackObject &obj); | ||||
Swan::InventoryTrait::Inventory &getInventory() override { return inventory_; } | |||||
Inventory &get(InventoryTrait::Tag) override { return inventory_; } | |||||
void draw(const Swan::Context &ctx, Swan::Win &win) override; | void draw(const Swan::Context &ctx, Swan::Win &win) override; | ||||
void update(const Swan::Context &ctx, float dt) override; | void update(const Swan::Context &ctx, float dt) override; | ||||
static constexpr float DOWN_FORCE = 20 * MASS; | static constexpr float DOWN_FORCE = 20 * MASS; | ||||
static constexpr Swan::Vec2 SIZE = Swan::Vec2(0.6, 1.9); | static constexpr Swan::Vec2 SIZE = Swan::Vec2(0.6, 1.9); | ||||
enum class State { | |||||
IDLE, | |||||
RUNNING_L, | |||||
RUNNING_R, | |||||
COUNT, | |||||
}; | |||||
PlayerEntity(const Swan::Context &ctx): | PlayerEntity(const Swan::Context &ctx): | ||||
PhysicsEntity(SIZE), inventory_(INVENTORY_SIZE), | |||||
PhysicsEntity(SIZE), | |||||
anims_{ | anims_{ | ||||
Swan::Animation(ctx.resources.getImage("core/entity/player-still"), 0.8), | Swan::Animation(ctx.resources.getImage("core/entity/player-still"), 0.8), | ||||
Swan::Animation( | Swan::Animation( | ||||
Swan::Animation(ctx.resources.getImage("core/entity/player-running"), 1) | Swan::Animation(ctx.resources.getImage("core/entity/player-running"), 1) | ||||
} {} | } {} | ||||
Swan::InventoryTrait::BasicInventory inventory_; | |||||
enum class State { | |||||
IDLE, | |||||
RUNNING_L, | |||||
RUNNING_R, | |||||
COUNT, | |||||
}; | |||||
State state_ = State::IDLE; | State state_ = State::IDLE; | ||||
std::array<Swan::Animation, (int)State::COUNT> anims_; | std::array<Swan::Animation, (int)State::COUNT> anims_; | ||||
Swan::Clock jump_timer_; | Swan::Clock jump_timer_; | ||||
Swan::TilePos mouse_tile_; | Swan::TilePos mouse_tile_; | ||||
BasicInventory inventory_{INVENTORY_SIZE}; | |||||
}; | }; |
add_library(libswan SHARED | add_library(libswan SHARED | ||||
src/traits/BodyTrait.cc | src/traits/BodyTrait.cc | ||||
src/traits/InventoryTrait.cc | |||||
src/traits/PhysicsTrait.cc | src/traits/PhysicsTrait.cc | ||||
src/Animation.cc | src/Animation.cc | ||||
src/Chunk.cc | src/Chunk.cc |
namespace Swan { | namespace Swan { | ||||
namespace InventoryTrait { | |||||
struct InventoryTrait { | |||||
struct Inventory; | |||||
struct Tag {}; | |||||
virtual Inventory &get(Tag) = 0; | |||||
class Inventory; | |||||
class HasInventory { | |||||
public: | |||||
virtual Inventory &getInventory() = 0; | |||||
}; | |||||
struct Inventory { | |||||
virtual ~Inventory() = default; | |||||
class Inventory { | |||||
public: | |||||
virtual ~Inventory() = default; | |||||
virtual int size() = 0; | |||||
virtual ItemStack get(int slot) = 0; | |||||
virtual ItemStack set(int slot, ItemStack stack) = 0; | |||||
virtual ItemStack insert(int slot, ItemStack stack) = 0; | |||||
virtual int size() = 0; | |||||
virtual ItemStack get(int slot) = 0; | |||||
virtual ItemStack set(int slot, ItemStack stack) = 0; | |||||
virtual ItemStack insert(int slot, ItemStack stack) = 0; | |||||
ItemStack insert(ItemStack stack) { return insert(0, stack); } | |||||
}; | |||||
ItemStack insert(ItemStack stack) { return insert(0, stack); } | |||||
}; | |||||
struct BasicInventory: Inventory { | |||||
BasicInventory(int size): content(size) {} | |||||
class BasicInventory: public Inventory { | |||||
public: | |||||
BasicInventory(int size): size_(size), content_(size) {} | |||||
int size() override { return size_; } | |||||
ItemStack get(int slot) override { | |||||
if (slot < size_) | |||||
return content_[slot]; | |||||
return ItemStack(); | |||||
} | |||||
ItemStack set(int slot, ItemStack stack) override { | |||||
ItemStack st = content_[slot]; | |||||
content_[slot] = stack; | |||||
return st; | |||||
} | |||||
ItemStack insert(int slot, ItemStack stack) override { | |||||
for (int i = 0; !stack.empty() && i < size_; ++i) | |||||
stack = content_[i].insert(stack); | |||||
return stack; | |||||
} | |||||
private: | |||||
int size_; | |||||
std::vector<ItemStack> content_; | |||||
std::vector<ItemStack> content; | |||||
int size() override { return content.size(); } | |||||
ItemStack get(int slot) override; | |||||
ItemStack set(int slot, ItemStack stack) override; | |||||
ItemStack insert(int slot, ItemStack stack) override; | |||||
}; | |||||
}; | }; | ||||
} | } | ||||
} |
#include "traits/InventoryTrait.h" | |||||
namespace Swan { | |||||
ItemStack InventoryTrait::BasicInventory::get(int slot) { | |||||
if (slot >= (ssize_t)content.size()) | |||||
return ItemStack{}; | |||||
return content[slot]; | |||||
} | |||||
ItemStack InventoryTrait::BasicInventory::set(int slot, ItemStack stack) { | |||||
if (slot >= (ssize_t)content.size()) | |||||
return stack; | |||||
ItemStack st = content[slot]; | |||||
content[slot] = stack; | |||||
return st; | |||||
} | |||||
ItemStack InventoryTrait::BasicInventory::insert(int slot, ItemStack stack) { | |||||
for (int i = 0; !stack.empty() && i < (ssize_t)content.size(); ++i) | |||||
stack = content[i].insert(stack); | |||||
return stack; | |||||
} | |||||
} |