X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FCharacter.hh;h=a92992c6e3eca9fc4e6bb22581b8903f80bcdf58;hp=c9cf11a0542635798f2eeba1b18ea92e6058a680;hb=bfa6212d09d8735d8fd5e2638188e4a99f21ada4;hpb=7d15b919681bb9ec0088b4b27c6abf62d6dfb9b1 diff --git a/src/Character.hh b/src/Character.hh index c9cf11a..a92992c 100644 --- a/src/Character.hh +++ b/src/Character.hh @@ -29,38 +29,143 @@ #ifndef _CHARACTER_HH_ #define _CHARACTER_HH_ -#include "resource.hh" -#include "drawable.hh" -#include "animation.hh" -#include "tilemap.hh" +#include + +#include +#include +#include +#include +#include +#include +#include /** - * Parent class of animate objects with "personalities." + * Parent class of animate objects with "personalities." This basically + * includes the heroine herself and the bad guys. */ -class Character : public dc::drawable +class Character : public Mf::Entity { public: - struct exception : public std::runtime_error + + struct Derivative + { + Mf::Vector2 velocity; + Mf::Vector2 force; + + Derivative operator*(Mf::Scalar dt) const + { + Derivative derivative; + derivative.velocity = dt * velocity; + derivative.force = dt * force; + return derivative; + } + + Derivative operator+(const Derivative& other) const + { + Derivative derivative; + derivative.velocity = velocity + other.velocity; + derivative.force = force + other.force; + return derivative; + } + }; + + struct State { - explicit exception(const std::string& what_arg) : - std::runtime_error(what_arg) {} + // primary + + Mf::Vector2 position; + Mf::Vector2 momentum; + Mf::Vector2 force; + + // secondary + + Mf::Vector2 velocity; + + // constant + + Mf::Scalar mass; + Mf::Scalar inverseMass; + + + void getDerivative(Derivative& derivative, Mf::Scalar t) const + { + //derivative.velocity = Mf::Vector2(0.0, 0.0); + //derivative.force = Mf::Vector2(0.0, 0.0); + derivative.velocity = velocity; + derivative.force = force; + } + + void recalculate() + { + velocity = momentum * inverseMass; + } + + void applyDerivative(const Derivative& derivative, Mf::Scalar dt) + { + position += dt * derivative.velocity; + momentum += dt * derivative.force; + recalculate(); + } + + State operator*(Mf::Scalar scalar) const + { + State state = *this; + state.position *= scalar; + state.momentum *= scalar; + state.recalculate(); + return state; + } + + State operator+(State state) const + { + State newState = *this; + newState.position += state.position; + newState.momentum += state.momentum; + newState.recalculate(); + return newState; + } }; + Character(const std::string& name); - ~Character(); + virtual ~Character(); + + void update(Mf::Scalar t, Mf::Scalar dt); + void handleEvent(const Mf::Event& event); + void draw(Mf::Scalar alpha) const; + + Mf::Tilemap& getTilemap(); + Mf::Animation& getAnimation(); - void draw(dc::scalar alpha); + State previous; + State current; - dc::tilemap& getTilemap(); - dc::animation& getAnimation(); + stlplus::ntree::iterator treeNode; private: - dc::tilemap texture; - dc::animation anim; + + void updateContainers(); + + static const Mf::Scalar z = 96.0; + + Mf::Tilemap tilemap_; + Mf::Animation animation_; }; +typedef boost::shared_ptr CharacterPtr; + + +inline Character::State operator*(Mf::Scalar scalar, const Character::State& state) +{ + Character::State newState = state; + newState.position *= scalar; + newState.momentum *= scalar; + newState.recalculate(); + return newState; +} + #endif // _CHARACTER_HH_