@@ -3,12 +3,12 @@ | |||
#include <swan/swan.h> | |||
#include <array> | |||
class PlayerEntity: public Swan::PhysicsEntity, public Swan::InventoryTrait::HasInventory { | |||
class PlayerEntity: public Swan::PhysicsEntity, public Swan::InventoryTrait { | |||
public: | |||
PlayerEntity(const Swan::Context &ctx, Swan::Vec2 pos); | |||
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 update(const Swan::Context &ctx, float dt) override; | |||
@@ -24,8 +24,15 @@ private: | |||
static constexpr float DOWN_FORCE = 20 * MASS; | |||
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): | |||
PhysicsEntity(SIZE), inventory_(INVENTORY_SIZE), | |||
PhysicsEntity(SIZE), | |||
anims_{ | |||
Swan::Animation(ctx.resources.getImage("core/entity/player-still"), 0.8), | |||
Swan::Animation( | |||
@@ -34,19 +41,11 @@ private: | |||
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; | |||
std::array<Swan::Animation, (int)State::COUNT> anims_; | |||
Swan::Clock jump_timer_; | |||
Swan::TilePos mouse_tile_; | |||
BasicInventory inventory_{INVENTORY_SIZE}; | |||
}; |
@@ -1,5 +1,6 @@ | |||
add_library(libswan SHARED | |||
src/traits/BodyTrait.cc | |||
src/traits/InventoryTrait.cc | |||
src/traits/PhysicsTrait.cc | |||
src/Animation.cc | |||
src/Chunk.cc |
@@ -8,54 +8,32 @@ | |||
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; | |||
}; | |||
}; | |||
} | |||
} |
@@ -0,0 +1,27 @@ | |||
#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; | |||
} | |||
} |