X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Fdispenser.cpp;h=da9514b513f45339654634bb407ab16b5f775f6f;hb=ce5cd45751145ae967ba5491313b6edd952523a4;hp=32498562db2b2c77268ed7ae8829952f3230900a;hpb=09c91c0f9f096f2b045912b2bfbbd27ea25d00fa;p=supertux.git diff --git a/src/badguy/dispenser.cpp b/src/badguy/dispenser.cpp index 32498562d..da9514b51 100644 --- a/src/badguy/dispenser.cpp +++ b/src/badguy/dispenser.cpp @@ -200,22 +200,39 @@ Dispenser::launch_badguy() return; } - GameObject* badguy_object = NULL; - try { + GameObject *game_object; + MovingObject *moving_object; Vector spawnpoint; + Rectf object_bbox; + + /* Need to allocate the badguy first to figure out its bounding box. */ + game_object = ObjectFactory::instance().create(badguy, get_pos(), launchdir); + if (game_object == NULL) + throw std::runtime_error("Creating " + badguy + " object failed."); + + moving_object = dynamic_cast (game_object); + if (moving_object == NULL) + throw std::runtime_error(badguy + " is not a moving object."); - if (type == "dropper") - spawnpoint = Vector(get_pos().x, get_pos().y+32); - else if (type == "cannon") - spawnpoint = Vector(get_pos().x + (launchdir == LEFT ? -32 : 32), get_pos().y); - else if (type == "rocketlauncher") - spawnpoint = Vector(get_pos().x + (launchdir == LEFT ? -32 : 32), get_pos().y); + object_bbox = moving_object->get_bbox (); + + if (type == "dropper") { + spawnpoint = get_anchor_pos (get_bbox (), ANCHOR_BOTTOM); + spawnpoint.x -= 0.5 * object_bbox.get_width (); + } + else if ((type == "cannon") || (type == "rocketlauncher")) { + spawnpoint = get_pos (); /* top-left corner of the cannon */ + if (launchdir == LEFT) + spawnpoint.x -= object_bbox.get_width () + 1; + else + spawnpoint.x += get_bbox ().get_width () + 1; + } - badguy_object = ObjectFactory::instance().create(badguy, spawnpoint, launchdir); + /* Now we set the real spawn position */ + moving_object->set_pos (spawnpoint); - if (badguy_object) - Sector::current()->add_object(badguy_object); + Sector::current()->add_object(moving_object); } catch(std::exception& e) { log_warning << "Error dispensing badguy: " << e.what() << std::endl; return;