[Super-tux-commit] supertux/src gameloop.cpp,1.197,1.198 player.cpp,1.202,1.203 sector.cpp,1.42,1.43
Brought to you by:
wkendrick
From: Matze B. <mat...@us...> - 2004-11-24 03:43:07
|
Update of /cvsroot/super-tux/supertux/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22752/src Modified Files: gameloop.cpp player.cpp sector.cpp Log Message: Improved collision detection by taking movement into account. Fixed long standing bug where returning from bonuslevel to mainmenu and going back to bonuslevels makes supertux crash Index: player.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/player.cpp,v retrieving revision 1.202 retrieving revision 1.203 diff -u -d -r1.202 -r1.203 --- player.cpp 23 Nov 2004 22:44:31 -0000 1.202 +++ player.cpp 24 Nov 2004 03:42:57 -0000 1.203 @@ -728,7 +728,7 @@ else tux_body = big_tux; - int layer = LAYER_OBJECTS - 1; + int layer = LAYER_OBJECTS + 10; /* Set Tux sprite action */ if (duck && size == BIG) @@ -858,15 +858,15 @@ && !dying) { if (size == SMALL || duck) - smalltux_star->draw(context, get_pos(), LAYER_OBJECTS + 2); + smalltux_star->draw(context, get_pos(), layer + 5); else - bigtux_star->draw(context, get_pos(), LAYER_OBJECTS + 2); + bigtux_star->draw(context, get_pos(), layer + 5); } if (debug_mode) context.draw_filled_rect(get_pos(), Vector(bbox.get_width(), bbox.get_height()), - Color(75,75,75, 150), LAYER_OBJECTS+1); + Color(75,75,75, 150), LAYER_OBJECTS+20); } HitResponse @@ -882,7 +882,7 @@ physic.set_velocity_y(0); on_ground_flag = true; } else if(hit.normal.y > 0) { // bumped against the roof - physic.set_velocity_y(0); + physic.set_velocity_y(.1); } if(hit.normal.x != 0) { // hit on the side? Index: sector.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/sector.cpp,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- sector.cpp 23 Nov 2004 22:22:14 -0000 1.42 +++ sector.cpp 24 Nov 2004 03:42:57 -0000 1.43 @@ -668,13 +668,15 @@ break; } - if(Collision::rectangle_aatriangle(temphit, dest, triangle)) { + if(Collision::rectangle_aatriangle(temphit, dest, object->movement, + triangle)) { if(temphit.depth > hit.depth) hit = temphit; } } else { // normal rectangular tile Rectangle rect(x*32, y*32, (x+1)*32, (y+1)*32); - if(Collision::rectangle_rectangle(temphit, dest, rect)) { + if(Collision::rectangle_rectangle(temphit, dest, + object->movement, rect)) { if(temphit.depth > hit.depth) hit = temphit; } @@ -683,7 +685,7 @@ } // did we collide at all? - if(hit.depth == -1) + if(hit.depth < 0) return; // call collision function @@ -708,19 +710,27 @@ dest1.move(object1->get_movement()); Rectangle dest2 = object2->get_bbox(); dest2.move(object2->get_movement()); - if(Collision::rectangle_rectangle(hit, dest1, dest2)) { - HitResponse response = object1->collision(*object2, hit); - if(response == ABORT_MOVE) { - object1->movement = Vector(0, 0); - } else if(response == CONTINUE) { - object1->movement += hit.normal * (hit.depth/2 + .001); - } + + Vector movement = object1->get_movement() - object2->get_movement(); + if(Collision::rectangle_rectangle(hit, dest1, movement, dest2)) { + HitResponse response1 = object1->collision(*object2, hit); + Vector hitnormal1 = hit.normal; hit.normal *= -1; - response = object2->collision(*object1, hit); - if(response == ABORT_MOVE) { - object2->movement = Vector(0, 0); - } else if(response == CONTINUE) { - object2->movement += hit.normal * (hit.depth/2 + .001); + HitResponse response2 = object2->collision(*object1, hit); + + if(response1 != CONTINUE) { + if(response1 == ABORT_MOVE) + object1->movement = Vector(0, 0); + if(response2 == CONTINUE) + object2->movement += hit.normal * (hit.depth + .1); + } else if(response2 != CONTINUE) { + if(response2 == ABORT_MOVE) + object2->movement = Vector(0, 0); + if(response1 == CONTINUE) + object1->movement += hitnormal1 * (hit.depth + .1); + } else { + object1->movement += hitnormal1 * (hit.depth/2 + 1); + object2->movement += hit.normal * (hit.depth/2 + 1); } } } @@ -737,7 +747,7 @@ MovingObject* movingobject = dynamic_cast<MovingObject*> (gameobject); if(!movingobject) continue; - + // collision with tilemap if(! (movingobject->movement == Vector(0, 0))) collision_tilemap(movingobject, 0); @@ -755,7 +765,7 @@ collision_object(movingobject, movingobject2); } - + movingobject->bbox.move(movingobject->get_movement()); movingobject->movement = Vector(0, 0); } Index: gameloop.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/gameloop.cpp,v retrieving revision 1.197 retrieving revision 1.198 diff -u -d -r1.197 -r1.198 --- gameloop.cpp 23 Nov 2004 13:41:23 -0000 1.197 +++ gameloop.cpp 24 Nov 2004 03:42:57 -0000 1.198 @@ -724,8 +724,8 @@ global_time += elapsed_time; lastticks = ticks; // 40fps is minimum - if(elapsed_time > .05) - elapsed_time = .05; + if(elapsed_time > .025) + elapsed_time = .025; /* Handle events: */ currentsector->player->input.old_fire = currentsector->player->input.fire; |