Browse Source

some redesign and getting rid of some warnings

master
Martin Dørum 2 years ago
parent
commit
f1db1a121e

+ 1
- 1
core.mod/src/entities/ItemStackEntity.h View File

@@ -2,7 +2,7 @@

#include <swan/swan.h>

class ItemStackEntity: public Swan::PhysicsEntity {
class ItemStackEntity final: public Swan::PhysicsEntity {
public:
ItemStackEntity(const Swan::Context &ctx, Swan::Vec2 pos, const std::string &item);
ItemStackEntity(const Swan::Context &ctx, const PackObject &obj);

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

@@ -3,7 +3,7 @@
#include <swan/swan.h>
#include <array>

class PlayerEntity: public Swan::PhysicsEntity, public Swan::InventoryTrait {
class PlayerEntity final: public Swan::PhysicsEntity, public Swan::InventoryTrait {
public:
PlayerEntity(const Swan::Context &ctx, Swan::Vec2 pos);
PlayerEntity(const Swan::Context &ctx, const PackObject &obj);
@@ -51,5 +51,5 @@ private:
Swan::TilePos lightTile_;
bool placedLight_ = false;

BasicInventory inventory_{INVENTORY_SIZE};
Swan::BasicInventory inventory_{INVENTORY_SIZE};
};

+ 4
- 4
libswan/include/swan/Entity.h View File

@@ -27,12 +27,12 @@ public:
Entity() = default;
Entity(Entity &&) = default;

virtual ~Entity() = default;

Entity &operator=(Entity &&) = default;

void despawn(const Swan::Context &ctx);

virtual ~Entity() = default;

virtual void draw(const Context &ctx, Cygnet::Renderer &rnd) {}
virtual void update(const Context &ctx, float dt) {}
virtual void tick(const Context &ctx, float dt) {}
@@ -54,7 +54,7 @@ public:

void physics(
const Context &ctx, float dt,
const PhysicsTrait::PhysicsProps &props) {
const BasicPhysics::Props &props) {

physics_.standardForces(props.mass);
physics_.update(ctx, dt, body_, props);
@@ -62,7 +62,7 @@ public:

protected:
BodyTrait::Body body_;
PhysicsTrait::Physics physics_;
BasicPhysics physics_;
};

}

+ 4
- 1
libswan/include/swan/EventEmitter.h View File

@@ -11,6 +11,9 @@ namespace Swan {
class EventEmitterInterface {
public:
virtual void unsubscribe(size_t id) = 0;

protected:
~EventEmitterInterface() = default;
};

class EventListener: NonCopyable {
@@ -50,7 +53,7 @@ private:
};

template<typename... Evt>
class EventEmitter: public EventEmitterInterface {
class EventEmitter final: public EventEmitterInterface {
public:
using Callback = std::function<void(Evt...)>;


+ 2
- 0
libswan/include/swan/LightServer.h View File

@@ -36,6 +36,8 @@ struct LightChunk {

class LightCallback {
public:
virtual ~LightCallback() = default;

virtual void onLightChunkUpdated(const LightChunk &chunk, ChunkPos pos) = 0;
};


+ 5
- 5
libswan/include/swan/traits/BodyTrait.h View File

@@ -5,11 +5,9 @@
namespace Swan {

struct BodyTrait {
struct Body;
struct Tag {};
virtual Body &get(Tag) = 0;

struct Body {
struct Body final {
Vec2 pos{};
Vec2 size{};

@@ -29,9 +27,11 @@ struct BodyTrait {
Vec2 topRight() { return { right(), top() }; }
Vec2 midRight() { return { right(), midY() }; }
Vec2 bottomRight() { return { right(), bottom() }; }

//void outline(Win &win); TODO
};

virtual ~BodyTrait() = default;

virtual Body &get(Tag) = 0;
};

}

+ 12
- 10
libswan/include/swan/traits/InventoryTrait.h View File

@@ -9,9 +9,7 @@
namespace Swan {

struct InventoryTrait {
struct Inventory;
struct Tag {};
virtual Inventory &get(Tag) = 0;

struct Inventory {
virtual ~Inventory() = default;
@@ -24,16 +22,20 @@ struct InventoryTrait {
ItemStack insert(ItemStack stack) { return insert(0, stack); }
};

struct BasicInventory: Inventory {
BasicInventory(int size): content(size) {}
virtual ~InventoryTrait() = default;

virtual Inventory &get(Tag) = 0;
};

struct BasicInventory final: InventoryTrait::Inventory {
BasicInventory(int size): content(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;
};
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;
};

}

+ 38
- 16
libswan/include/swan/traits/PhysicsTrait.h View File

@@ -6,41 +6,63 @@
namespace Swan {

struct PhysicsTrait {
struct Physics;
struct Tag {};

struct Physics {
virtual ~Physics() = default;

virtual void applyForce(Vec2 force) = 0;
virtual void addVelocity(Vec2 vel) = 0;
virtual Vec2 getVelocity() = 0;
};

virtual ~PhysicsTrait() = default;

virtual Physics &get(Tag) = 0;
};

struct PhysicsProps {
struct BasicPhysics final: public PhysicsTrait::Physics {
struct Props {
float mass;
float bounciness = 0;
float mushyness = 2;
};

struct Physics {
Vec2 vel{};
Vec2 force{};
bool onGround = false;
Vec2 vel{};
Vec2 force{};
bool onGround = false;

void friction(Vec2 coef = Vec2(400, 50));
void gravity(float mass, Vec2 g = Vec2(0, 20));
void standardForces(float mass) { friction(); gravity(mass); }
void friction(Vec2 coef = Vec2(400, 50));
void gravity(float mass, Vec2 g = Vec2(0, 20));
void standardForces(float mass) { friction(); gravity(mass); }

void update(
const Swan::Context &ctx, float dt,
BodyTrait::Body &body, const PhysicsProps &props);
};
void applyForce(Vec2 f) override;
void addVelocity(Vec2 v) override;
Vec2 getVelocity() override { return vel; }

void update(
const Swan::Context &ctx, float dt,
BodyTrait::Body &body, const Props &props);
};

/*
* Physics
* BasicPhysics
*/

inline void PhysicsTrait::Physics::friction(Vec2 coef) {
inline void BasicPhysics::friction(Vec2 coef) {
force += -vel * coef;
}

inline void PhysicsTrait::Physics::gravity(float mass, Vec2 g) {
inline void BasicPhysics::gravity(float mass, Vec2 g) {
force += g * mass;
}

inline void BasicPhysics::applyForce(Vec2 f) {
force += f;
}

inline void BasicPhysics::addVelocity(Vec2 v) {
vel += v;
}

}

+ 0
- 1
libswan/meson.build View File

@@ -6,7 +6,6 @@ libswan = declare_dependency(
include_directories: 'include',
dependencies: libswan_deps,
link_with: library('swan',
'src/traits/BodyTrait.cc',
'src/traits/InventoryTrait.cc',
'src/traits/PhysicsTrait.cc',
'src/Animation.cc',

+ 0
- 10
libswan/src/traits/BodyTrait.cc View File

@@ -1,10 +0,0 @@
#include "traits/BodyTrait.h"

namespace Swan {

/*
void BodyTrait::Body::outline(Win &win) {
win.drawRect(pos, size);
} TODO */

}

+ 3
- 3
libswan/src/traits/InventoryTrait.cc View File

@@ -2,14 +2,14 @@

namespace Swan {

ItemStack InventoryTrait::BasicInventory::get(int slot) {
ItemStack BasicInventory::get(int slot) {
if (slot >= (ssize_t)content.size())
return ItemStack{};

return content[slot];
}

ItemStack InventoryTrait::BasicInventory::set(int slot, ItemStack stack) {
ItemStack BasicInventory::set(int slot, ItemStack stack) {
if (slot >= (ssize_t)content.size())
return stack;

@@ -18,7 +18,7 @@ ItemStack InventoryTrait::BasicInventory::set(int slot, ItemStack stack) {
return st;
}

ItemStack InventoryTrait::BasicInventory::insert(int slot, ItemStack stack) {
ItemStack 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;

+ 6
- 6
libswan/src/traits/PhysicsTrait.cc View File

@@ -7,8 +7,8 @@ namespace Swan {
static float epsilon = 0.05;

static void collideX(
PhysicsTrait::Physics &phys, BodyTrait::Body &body,
WorldPlane &plane, const PhysicsTrait::PhysicsProps &props) {
BasicPhysics &phys, BodyTrait::Body &body,
WorldPlane &plane, const BasicPhysics::Props &props) {
bool collided = false;

for (int y = (int)floor(body.top() + epsilon); y <= (int)floor(body.bottom() - epsilon); ++y) {
@@ -37,8 +37,8 @@ static void collideX(
}

static void collideY(
PhysicsTrait::Physics &phys, BodyTrait::Body &body,
WorldPlane &plane, const PhysicsTrait::PhysicsProps &props) {
BasicPhysics &phys, BodyTrait::Body &body,
WorldPlane &plane, const BasicPhysics::Props &props) {
bool collided = false;
phys.onGround = false;

@@ -68,9 +68,9 @@ static void collideY(
}
}

void PhysicsTrait::Physics::update(
void BasicPhysics::update(
const Swan::Context &ctx, float dt,
BodyTrait::Body &body, const PhysicsProps &props) {
BodyTrait::Body &body, const BasicPhysics::Props &props) {
vel += (force / props.mass) * dt;
force = { 0, 0 };


Loading…
Cancel
Save