currentmusic(LEVEL_MUSIC)
{
song_title = "chipdisko.ogg";
- player = new Player(&player_status);
+ player = new Player(player_status);
add_object(player);
#ifdef USE_GRID
}
update_game_objects();
+
+ if(!solids)
+ throw std::runtime_error("sector does not contain a solid tile layer.");
+
fix_old_tiles();
if(!camera) {
std::cerr << "sector '" << name << "' does not contain a camera.\n";
update_game_objects();
add_object(new Camera(this));
}
- if(!solids)
- throw std::runtime_error("sector does not contain a solid tile layer.");
update_game_objects();
}
reader.get("bkgd_red_top", r);
reader.get("bkgd_green_top", g);
reader.get("bkgd_blue_top", b);
- bkgd_top.red = r;
- bkgd_top.green = g;
- bkgd_top.blue = b;
+ bkgd_top.red = static_cast<float> (r) / 255.0f;
+ bkgd_top.green = static_cast<float> (g) / 255.0f;
+ bkgd_top.blue = static_cast<float> (b) / 255.0f;
reader.get("bkgd_red_bottom", r);
reader.get("bkgd_green_bottom", g);
reader.get("bkgd_blue_bottom", b);
- bkgd_bottom.red = r;
- bkgd_bottom.green = g;
- bkgd_bottom.blue = b;
+ bkgd_bottom.red = static_cast<float> (r) / 255.0f;
+ bkgd_bottom.green = static_cast<float> (g) / 255.0f;
+ bkgd_bottom.blue = static_cast<float> (b) / 255.0f;
if(backgroundimage != "") {
Background* background = new Background;
song_title = "chipdisko.ogg";
reader.get("music", song_title);
- int width, height = 15;
+ int width = 30, height = 15;
reader.get("width", width);
reader.get("height", height);
add_object(camera);
update_game_objects();
+
+ if(solids == 0)
+ throw std::runtime_error("sector does not contain a solid tile layer.");
+
fix_old_tiles();
update_game_objects();
- if(solids == 0)
- throw std::runtime_error("sector does not contain a solid tile layer.");
}
void
add_object(new SequenceTrigger(pos, sequence));
solids->change(x, y, 0);
}
- }
+ }
}
}
#endif
/* Handle all possible collisions. */
- collision_handler();
+ handle_collisions();
update_game_objects();
}
Sector::update_game_objects()
{
/** cleanup marked objects */
+ for(std::vector<Bullet*>::iterator i = bullets.begin();
+ i != bullets.end(); /* nothing */) {
+ Bullet* bullet = *i;
+ if(bullet->is_valid()) {
+ ++i;
+ continue;
+ }
+
+ i = bullets.erase(i);
+ }
+ for(MovingObjects::iterator i = moving_objects.begin();
+ i != moving_objects.end(); /* nothing */) {
+ MovingObject* moving_object = *i;
+ if(moving_object->is_valid()) {
+ ++i;
+ continue;
+ }
+
+#ifdef USE_GRID
+ grid->remove_object(moving_object);
+#endif
+
+ i = moving_objects.erase(i);
+ }
for(std::vector<GameObject*>::iterator i = gameobjects.begin();
i != gameobjects.end(); /* nothing */) {
GameObject* object = *i;
continue;
}
- Bullet* bullet = dynamic_cast<Bullet*> (object);
- if(bullet) {
- bullets.erase(
- std::remove(bullets.begin(), bullets.end(), bullet),
- bullets.end());
- }
-#ifdef USE_GRID
- MovingObject* movingobject = dynamic_cast<MovingObject*> (object);
- if(movingobject) {
- grid->remove_object(movingobject);
- }
-#endif
delete *i;
i = gameobjects.erase(i);
}
if(bullet)
bullets.push_back(bullet);
-#ifdef USE_GRID
MovingObject* movingobject = dynamic_cast<MovingObject*> (object);
- if(movingobject)
+ if(movingobject) {
+ moving_objects.push_back(movingobject);
+ #ifdef USE_GRID
grid->add_object(movingobject);
#endif
+ }
TileMap* tilemap = dynamic_cast<TileMap*> (object);
if(tilemap && tilemap->is_solid()) {
}
void
-Sector::collision_handler()
+Sector::handle_collisions()
{
#ifdef USE_GRID
grid->check_collisions();
#else
- for(std::vector<GameObject*>::iterator i = gameobjects.begin();
- i != gameobjects.end(); ++i) {
- GameObject* gameobject = *i;
- if(!gameobject->is_valid())
+ // part1: COLGROUP_MOVING vs COLGROUP_STATIC and tilemap
+ for(MovingObjects::iterator i = moving_objects.begin();
+ i != moving_objects.end(); ++i) {
+ MovingObject* movingobject = *i;
+ if(movingobject->get_group() != COLGROUP_MOVING
+ || !movingobject->is_valid())
continue;
- MovingObject* movingobject = dynamic_cast<MovingObject*> (gameobject);
- if(!movingobject)
+
+ // collision with tilemap
+ collision_tilemap(movingobject, 0);
+
+ // collision with other objects
+ for(MovingObjects::iterator i2 = i+1;
+ i2 != moving_objects.end(); ++i2) {
+ MovingObject* movingobject2 = *i2;
+ if(movingobject2->get_group() != COLGROUP_STATIC
+ || !movingobject2->is_valid())
+ continue;
+
+ collision_object(movingobject, movingobject2);
+ }
+ }
+
+ // part2: COLGROUP_MOVING vs COLGROUP_TOUCHABLE
+ for(MovingObjects::iterator i = moving_objects.begin();
+ i != moving_objects.end(); ++i) {
+ MovingObject* moving_object = *i;
+ if(moving_object->get_group() != COLGROUP_MOVING
+ || !moving_object->is_valid())
+ continue;
+
+ for(MovingObjects::iterator i2 = moving_objects.begin();
+ i2 != moving_objects.end(); ++i2) {
+ MovingObject* moving_object_2 = *i2;
+ if(moving_object_2->get_group() != COLGROUP_TOUCHABLE
+ || !moving_object_2->is_valid())
+ continue;
+
+ collision_object(moving_object, moving_object_2);
+ }
+ }
+
+ // part3: COLGROUP_MOVING vs COLGROUP_MOVING
+ for(MovingObjects::iterator i = moving_objects.begin();
+ i != moving_objects.end(); ++i) {
+ MovingObject* moving_object = *i;
+
+ if(moving_object->get_group() != COLGROUP_MOVING
+ || !moving_object->is_valid())
+ continue;
+
+ for(MovingObjects::iterator i2 = i+1;
+ i2 != moving_objects.end(); ++i2) {
+ MovingObject* moving_object_2 = *i2;
+ if(moving_object_2->get_group() != COLGROUP_MOVING
+ || !moving_object_2->is_valid())
+ continue;
+
+ collision_object(moving_object, moving_object_2);
+ }
+ }
+
+ // apply object movement
+ for(MovingObjects::iterator i = moving_objects.begin();
+ i != moving_objects.end(); ++i) {
+ MovingObject* moving_object = *i;
+
+ moving_object->bbox.move(moving_object->get_movement());
+ moving_object->movement = Vector(0, 0);
+ }
+
+#if 0
+ for(MovingObjects::iterator i = moving_objects.begin();
+ i != moving_objects.end(); ++i) {
+ MovingObject* movingobject = *i;
+ if(!movingobject->is_valid())
continue;
if(movingobject->get_flags() & GameObject::FLAG_NO_COLLDET) {
movingobject->bbox.move(movingobject->movement);
collision_tilemap(movingobject, 0);
// collision with other objects
- for(std::vector<GameObject*>::iterator i2 = i+1;
- i2 != gameobjects.end(); ++i2) {
- GameObject* other_object = *i2;
- if(!other_object->is_valid()
- || other_object->get_flags() & GameObject::FLAG_NO_COLLDET)
- continue;
- MovingObject* movingobject2 = dynamic_cast<MovingObject*> (other_object);
- if(!movingobject2)
+ for(MovingObjects::iterator i2 = i+1;
+ i2 != moving_objects.end(); ++i2) {
+ MovingObject* movingobject2 = *i2;
+ if(!movingobject2->is_valid()
+ || movingobject2->get_flags() & GameObject::FLAG_NO_COLLDET)
continue;
collision_object(movingobject, movingobject2);
movingobject->movement = Vector(0, 0);
}
#endif
+
+#endif
}
bool
static const size_t MAX_ICE_BULLETS = 1;
Bullet* new_bullet = 0;
- if(player_status.bonus == FIRE_BONUS) {
+ if(player_status->bonus == FIRE_BONUS) {
if(bullets.size() > MAX_FIRE_BULLETS-1)
return false;
new_bullet = new Bullet(pos, xm, dir, FIRE_BULLET);
- } else if(player_status.bonus == ICE_BONUS) {
+ } else if(player_status->bonus == ICE_BONUS) {
if(bullets.size() > MAX_ICE_BULLETS-1)
return false;
new_bullet = new Bullet(pos, xm, dir, ICE_BULLET);