+ // 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;
+
+ // 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())