X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2FCharacter.hh;h=d1ec2c313713314bf0c3857002e33387c6a85680;hb=23d8f7a5fbd1eca7f46f2342c20ac5e28ae0128a;hp=b1965ce7dd129076ff82b3af3484ae3599157270;hpb=c2321281bf12a7efaedde930422c7ddbc92080d4;p=chaz%2Fyoink diff --git a/src/Character.hh b/src/Character.hh index b1965ce..d1ec2c3 100644 --- a/src/Character.hh +++ b/src/Character.hh @@ -29,37 +29,139 @@ #ifndef _CHARACTER_HH_ #define _CHARACTER_HH_ -#include -#include -#include -#include +#include +#include +#include +#include +#include + +#include "Animation.hh" +#include "Tilemap.hh" -/** - * Parent class of animate objects with "personalities." - */ -class Character : public Mf::Drawable -{ -public: - Character(const std::string& name); - ~Character(); - void draw(Mf::Scalar alpha); +struct Character; +typedef boost::shared_ptr CharacterP; - Mf::Tilemap& getTilemap(); - Mf::Animation& getAnimation(); +/** + * Parent class of animate objects with "personalities." This basically + * includes the heroine herself and the bad guys. + */ + +struct Character : public Mf::Entity +{ + /* + 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 Exception : public std::runtime_error + 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 recalculate() + { + velocity = momentum * 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; + + //Mf::Vector2 x = position - Mf::Vector2(500.0, 200.0); + //derivative.force += -15.0 * x - 1.5 * velocity; + } + + void applyDerivative(const Derivative& derivative, Mf::Scalar dt) + { + position += dt * derivative.velocity; + momentum += dt * derivative.force; + recalculate(); + } + + // these two operator overloads all using the state in generic + // interpolator implementations + + State operator*(Mf::Scalar scalar) const + { + State state = *this; + state.position *= scalar; + state.momentum *= scalar; + state.recalculate(); + return state; + } + + State operator+(const State& state) const + { + State newState = *this; + newState.position += state.position; + newState.momentum += state.momentum; + newState.recalculate(); + return newState; + } }; +*/ + + Mf::State2 previous; + Mf::State2 current; + private: - Mf::Tilemap tilemap; - Mf::Animation animation; + + static const Mf::Scalar z = 96.0; + +protected: + + Mf::Vector2 userForce; + +public: + + Character(const std::string& name); + virtual ~Character() {} + + virtual void update(Mf::Scalar t, Mf::Scalar dt); + virtual void draw(Mf::Scalar alpha) const; + + + Tilemap tilemap; + Animation animation; };