+ tilemap(name),
+ animation(name)
+{
+ mState.init();
+
+ mState.mass = 1.0;
+ mState.inverseMass = 1.0 / mState.mass;
+
+ // forces
+ mState.force = Mf::Vector2(0.0, 0.0);
+ //mState.forces.push_back(SpringForce(Mf::Vector2(500.0, 200.0)));
+ mState.forces.push_back(ResistanceForce(2.0));
+ //mState.forces.push_back(Mf::LinearState<2>::GravityForce(-400.0));
+
+ // starting position
+ mState.position = Mf::Vector2(5.0, 5.0);
+ mState.momentum = Mf::Vector2(0.0, 0.0);
+ mState.recalculate();
+
+ mPrevState = mState;
+}
+
+
+void Character::update(Mf::Scalar t, Mf::Scalar dt)
+{
+ Mf::RigidBody2::update(t, dt); // update physics
+
+ animation.update(t, dt);
+
+ Mf::Vector3 center(mState.position[0], mState.position[1], mZCoord);
+ Mf::Vector3 a(mState.position[0] - 0.5, mState.position[1] - 0.5, mZCoord);
+ Mf::Vector3 b(mState.position[0] + 0.5, mState.position[1] + 0.5, mZCoord);
+
+ mAabb.init(a, b);
+ mSphere.init(center, a);
+}
+
+
+void Character::draw(Mf::Scalar alpha) const
+{
+ //Mf::Vector2 position = cml::lerp(mPrevState.position, mState.position, alpha);
+ Mf::State2 state = getState(alpha);
+ Mf::Vector2 position = state.position;
+
+ //glColor3f(1.0f, 1.0f, 1.0f);
+ tilemap.bind();
+
+ Tilemap::Index frame = animation.getFrame();
+
+ Tilemap::Orientation orientation = Tilemap::NORMAL;
+
+ if (mState.velocity[0] < 0.0) orientation = Tilemap::REVERSE;
+
+ Mf::Scalar coords[8];
+ tilemap.getTileCoords(frame, coords, orientation);
+
+ Mf::Scalar s = 0.5;
+
+ glBegin(GL_TRIANGLE_FAN);
+ glTexCoord2f(coords[0], coords[1]);
+ glVertex3(position[0]-s, position[1]-s, mZCoord);
+ glTexCoord2f(coords[2], coords[3]);
+ glVertex3(position[0]+s, position[1]-s, mZCoord);
+ glTexCoord2f(coords[4], coords[5]);
+ glVertex3(position[0]+s, position[1]+s, mZCoord);
+ glTexCoord2f(coords[6], coords[7]);
+ glVertex3(position[0]-s, position[1]+s, mZCoord);
+ glEnd();
+}
+
+void Character::setZCoord(Mf::Scalar z)
+{
+ mZCoord = z;
+}
+