#include <bicycle_platform.hpp>
Inherits MovingSprite.
Public Member Functions | |
BicyclePlatform (const Reader &reader) | |
BicyclePlatform (BicyclePlatform *master) | |
virtual | ~BicyclePlatform () |
virtual HitResponse | collision (GameObject &other, const CollisionHit &hit) |
this function is called when the object collided with any other object | |
virtual void | update (float elapsed_time) |
This function is called once per frame and allows the object to update it's state. | |
Protected Attributes | |
BicyclePlatform * | master |
pointer to BicyclePlatform that does movement calculation | |
BicyclePlatform * | slave |
pointer to BicyclePlatform that reacts to master platform's movement calculation | |
Vector | center |
pivot point | |
float | radius |
radius of circle | |
float | angle |
current angle | |
float | angular_speed |
angular speed in rad per second | |
std::set< GameObject * > | contacts |
objects that are currently pushing on the platform | |
float | momentum |
Private Member Functions | |
BicyclePlatform (const BicyclePlatform &) | |
angular momentum in rad per second per second | |
BicyclePlatform & | operator= (const BicyclePlatform &) |
Definition at line 25 of file bicycle_platform.hpp.
BicyclePlatform::BicyclePlatform | ( | const Reader & | reader | ) |
Definition at line 26 of file bicycle_platform.cpp.
References center, and MovingObject::get_pos().
Referenced by update().
00026 : 00027 MovingSprite(reader, LAYER_OBJECTS, COLGROUP_STATIC), 00028 master(0), 00029 slave(0), 00030 center(), 00031 radius(128), 00032 angle(0), 00033 angular_speed(0), 00034 contacts(), 00035 momentum(0) 00036 { 00037 center = get_pos(); 00038 }
BicyclePlatform::BicyclePlatform | ( | BicyclePlatform * | master | ) |
Definition at line 40 of file bicycle_platform.cpp.
References MovingObject::get_bbox(), MovingObject::get_pos(), Rectf::get_width(), master, MovingObject::set_pos(), and slave.
00040 : 00041 MovingSprite(*master), 00042 master(master), 00043 slave(this), 00044 center(master->center), 00045 radius(master->radius), 00046 angle(master->angle + M_PI), 00047 angular_speed(0), 00048 contacts(), 00049 momentum(0) 00050 { 00051 set_pos(get_pos() + Vector(master->get_bbox().get_width(), 0)); 00052 master->master = master; 00053 master->slave = this; 00054 }
BicyclePlatform::~BicyclePlatform | ( | ) | [virtual] |
Definition at line 56 of file bicycle_platform.cpp.
00057 { 00058 if ((this == master) && (master)) { 00059 slave->master = 0; 00060 slave->slave = 0; 00061 } 00062 if ((master) && (this == slave)) { 00063 master->master = 0; 00064 master->slave = 0; 00065 } 00066 master = 0; 00067 slave = 0; 00068 }
BicyclePlatform::BicyclePlatform | ( | const BicyclePlatform & | ) | [private] |
angular momentum in rad per second per second
HitResponse BicyclePlatform::collision | ( | GameObject & | other, | |
const CollisionHit & | hit | |||
) | [virtual] |
this function is called when the object collided with any other object
Implements MovingObject.
Definition at line 71 of file bicycle_platform.cpp.
References contacts, FORCE_MOVE, MovingObject::get_bbox(), Player::get_grabbed_object(), Player::is_big(), momentum, Rectf::p2, and Vector::y.
00072 { 00073 00074 // somehow the hit parameter does not get filled in, so to determine (hit.top == true) we do this: 00075 MovingObject* mo = dynamic_cast<MovingObject*>(&other); 00076 if (!mo) return FORCE_MOVE; 00077 if ((mo->get_bbox().p2.y) > (get_bbox().p1.y + 2)) return FORCE_MOVE; 00078 00079 Player* pl = dynamic_cast<Player*>(mo); 00080 if (pl) { 00081 if (pl->is_big()) momentum += 1; 00082 Portable* po = pl->get_grabbed_object(); 00083 MovingObject* pomo = dynamic_cast<MovingObject*>(po); 00084 if (contacts.insert(pomo).second) momentum += 1; 00085 } 00086 00087 if (contacts.insert(&other).second) momentum += 1; 00088 return FORCE_MOVE; 00089 }
void BicyclePlatform::update | ( | float | elapsed_time | ) | [virtual] |
This function is called once per frame and allows the object to update it's state.
The elapsed_time is the time since the last frame in seconds and should be the base for all timed calculations (don't use SDL_GetTicks directly as this will fail in pause mode)
Reimplemented from MovingSprite.
Definition at line 92 of file bicycle_platform.cpp.
References Sector::add_object(), angle, angular_speed, MovingObject::bbox, BicyclePlatform(), center, contacts, Sector::current(), MovingObject::dest, MovingObject::get_pos(), Rectf::get_size(), master, momentum, MovingObject::movement, radius, and slave.
00093 { 00094 if (!slave) { 00095 Sector::current()->add_object(new BicyclePlatform(this)); 00096 return; 00097 } 00098 if (!master) { 00099 return; 00100 } 00101 if (this == slave) { 00102 angle = master->angle + M_PI; 00103 while (angle < 0) { angle += 2*M_PI; } 00104 while (angle > 2*M_PI) { angle -= 2*M_PI; } 00105 Vector dest = center + Vector(cosf(angle), sinf(angle)) * radius - (bbox.get_size() * 0.5); 00106 movement = dest - get_pos(); 00107 } 00108 if (this == master) { 00109 float momentum_diff = momentum - slave->momentum; 00110 contacts.clear(); momentum = 0; 00111 slave->contacts.clear(); slave->momentum = 0; 00112 00113 float angular_momentum = cosf(angle) * momentum_diff; 00114 00115 angular_speed += (angular_momentum * elapsed_time) * M_PI; 00116 angular_speed *= 1 - elapsed_time * 0.2; 00117 angle += angular_speed * elapsed_time; 00118 while (angle < 0) { angle += 2*M_PI; } 00119 while (angle > 2*M_PI) { angle -= 2*M_PI; } 00120 angular_speed = std::min(std::max(angular_speed, static_cast<float>(-128*M_PI*elapsed_time)), static_cast<float>(128*M_PI*elapsed_time)); 00121 Vector dest = center + Vector(cosf(angle), sinf(angle)) * radius - (bbox.get_size() * 0.5); 00122 movement = dest - get_pos(); 00123 00124 center += Vector(angular_speed, 0) * elapsed_time * 32; 00125 slave->center += Vector(angular_speed, 0) * elapsed_time * 32; 00126 00127 } 00128 }
BicyclePlatform& BicyclePlatform::operator= | ( | const BicyclePlatform & | ) | [private] |
BicyclePlatform* BicyclePlatform::master [protected] |
pointer to BicyclePlatform that does movement calculation
Definition at line 36 of file bicycle_platform.hpp.
Referenced by BicyclePlatform(), update(), and ~BicyclePlatform().
BicyclePlatform* BicyclePlatform::slave [protected] |
pointer to BicyclePlatform that reacts to master platform's movement calculation
Definition at line 37 of file bicycle_platform.hpp.
Referenced by BicyclePlatform(), update(), and ~BicyclePlatform().
Vector BicyclePlatform::center [protected] |
pivot point
Definition at line 38 of file bicycle_platform.hpp.
Referenced by BicyclePlatform(), and update().
float BicyclePlatform::radius [protected] |
float BicyclePlatform::angle [protected] |
float BicyclePlatform::angular_speed [protected] |
angular speed in rad per second
Definition at line 41 of file bicycle_platform.hpp.
Referenced by update().
std::set<GameObject*> BicyclePlatform::contacts [protected] |
objects that are currently pushing on the platform
Definition at line 42 of file bicycle_platform.hpp.
Referenced by collision(), and update().
float BicyclePlatform::momentum [protected] |