Browse Source

change InventoryTrait to new trait system

opengl-renderer-broken
Martin Dørum 4 years ago
parent
commit
cc1c71717a

+ 12
- 13
core.mod/src/entities/PlayerEntity.h View File

@@ -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
- 0
libswan/CMakeLists.txt View File

@@ -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

+ 21
- 43
libswan/include/swan/traits/InventoryTrait.h View File

@@ -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;
};
};

}
}

+ 27
- 0
libswan/src/traits/InventoryTrait.cc View File

@@ -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;
}

}

Loading…
Cancel
Save