X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fleveleditor.cpp;h=fdc34336ce36911040cda7f8fd5ed55bd4ccfa0d;hb=157cef71aeb9ae25b7bb90f37dda11bc09329d11;hp=f72328991331b912d50718009cd3c2d16b1a64aa;hpb=403f2652505e814b645892bffaf89a584984f9b8;p=supertux.git diff --git a/src/leveleditor.cpp b/src/leveleditor.cpp index f72328991..fdc34336c 100644 --- a/src/leveleditor.cpp +++ b/src/leveleditor.cpp @@ -19,6 +19,7 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include +#include #include #include #include @@ -27,6 +28,7 @@ #include #include #include +#include #include "leveleditor.h" #include "screen.h" @@ -42,6 +44,7 @@ #include "tile.h" #include "resources.h" #include "music_manager.h" +#include "background.h" #include "display_manager.h" /* definitions to aid development */ @@ -501,22 +504,21 @@ void le_init_menus() select_objects_menu->additem(MN_LABEL,"Objects",0,0); select_objects_menu->additem(MN_HL,"",0,0); // TODO fix this -#if 0 select_objects_menu->additem(MN_ACTION,"BadGuys",0,0,1); objects_map["BadGuys"] = new ButtonPanel(screen->w - 64,96, 64, 318); DisplayManager dummy; for(int i = 0; i < NUM_BadGuyKinds; ++i) { - BadGuy bad_tmp(dummy, 0,0,BadGuyKind(i),false); + BadGuy bad_tmp(dummy, BadGuyKind(i), 0, 0); objects_map["BadGuys"]->additem(new Button("", "BadGuy",(SDLKey)(i+'a'),0,0,32,32),1000000+i); objects_map["BadGuys"]->manipulate_button(i)->set_drawable(new BadGuy(dummy, + BadGuyKind(i), objects_map["BadGuys"]->manipulate_button(i)->get_pos().x, - objects_map["BadGuys"]->manipulate_button(i)->get_pos().y, - BadGuyKind(i), false)); + objects_map["BadGuys"]->manipulate_button(i)->get_pos().y + )); } -#endif select_objects_menu->additem(MN_HL,"",0,0); @@ -524,8 +526,6 @@ void le_init_menus() int le_init() { - - level_subsets = dsubdirs("/levels", "level1.stl"); le_level_subset = new LevelSubset; @@ -535,7 +535,6 @@ int le_init() active_tm = TM_IA; le_show_grid = true; show_selections = true; - scroll_x = 0; done = 0; le_frame = 0; /* support for frames in some tiles, like waves and bad guys */ @@ -869,7 +868,7 @@ void le_drawinterface() if(TileManager::instance()->get(le_current.tile)->editor_images.size() > 0) TileManager::instance()->get(le_current.tile)->editor_images[0]->draw( screen->w - 32, screen->h - 32); } -#if 0 // XXX FIXME TODO +#if 0 // XXX FIXME TODO: Do we have a new solution for draw_on_screen()? if(le_current.IsObject() && MouseCursor::current() != mouse_select_object) { le_current.obj->draw_on_screen(screen->w - 32, screen->h - 32); @@ -944,7 +943,7 @@ void le_drawlevel() Uint8 a; /* Draw the real background */ - le_world->get_level()->draw_bg(); + le_world->background->draw(*le_world->camera, LAYER_BACKGROUND0); if(le_current.IsTile()) { @@ -952,7 +951,7 @@ void le_drawlevel() if(!TileManager::instance()->get(le_current.tile)->images.empty()) fillrect(cursor_x-pos_x,cursor_y-pos_y,TileManager::instance()->get(le_current.tile)->images[0]->w,TileManager::instance()->get(le_current.tile)->images[0]->h,50,50,50,50); } -#if 0 // XXX FIXME TODO +#if 0 // XXX FIXME TODO: Do we have a new solution for move_to()? if(le_current.IsObject()) { le_current.obj->move_to(cursor_x, cursor_y); @@ -1013,7 +1012,7 @@ void le_drawlevel() continue; /* to support frames: img_bsod_left[(frame / 5) % 4] */ - ViewPort viewport; + Camera viewport; viewport.set_translation(Vector(pos_x, pos_y)); badguy->draw(viewport, 0); } @@ -1029,7 +1028,8 @@ void le_change_object_properties(GameObject *pobj) Menu* object_properties_menu = new Menu(); bool loop = true; - object_properties_menu->additem(MN_LABEL,pobj->type() + " Properties",0,0); + std::string type = typeid(pobj).name(); + object_properties_menu->additem(MN_LABEL, type + " Properties",0,0); object_properties_menu->additem(MN_HL,"",0,0); BadGuy* pbad = dynamic_cast(pobj); @@ -1415,7 +1415,7 @@ void le_checkevents() { if(pbutton->get_state() == BUTTON_CLICKED) { -#if 0 // TODO fixme!! +#if 0 // TODO FIXME XXX: New solution for this? le_current.Object(pbutton->get_drawable()); #endif } @@ -1507,20 +1507,25 @@ void le_checkevents() } else { -#if 0 // FIXME TODO + // FIXME TODO if(le_current.IsObject()) { le_level_changed = true; - std::string type = le_current.obj->type(); - if(type == "BadGuy") - { - BadGuy* pbadguy = dynamic_cast(le_current.obj); + BadGuy* pbadguy = dynamic_cast(le_current.obj); - le_world->bad_guys.push_back(new BadGuy(cursor_x+scroll_x, cursor_y,pbadguy->kind,false)); - le_world->get_level()->badguy_data.push_back(le_world->bad_guys.back()); + if(pbadguy) + { + Camera& camera = *le_world->camera; + DisplayManager dummy; + + le_world->bad_guys.push_back( + new BadGuy(dummy, pbadguy->kind, + cursor_x + camera.get_translation().x, + cursor_y + camera.get_translation().y)); + le_world->gameobjects.push_back(le_world->bad_guys.back()); } } -#endif + } le_mouse_clicked[LEFT] = false; @@ -1675,16 +1680,20 @@ void le_change(float x, float y, int tm, unsigned int c) /* if there is a bad guy over there, remove it */ // XXX TODO -#if 0 - for(std::list::iterator it = le_world->bad_guys.begin(); it != le_world->bad_guys.end(); ++it, ++i) - if(rectcollision(cursor_base,(*it)->base)) + for(std::vector::iterator it = le_world->gameobjects.begin(); + it != le_world->gameobjects.end(); ++it) { + BadGuy* badguy = dynamic_cast((*it)); + if (badguy) { - delete (*it); - le_world->bad_guys.erase(it); - le_world->get_level()->badguy_data.erase(le_world->get_level()->badguy_data.begin() + i); - break; + if(rectcollision(cursor_base, badguy->base)) + { + delete (*it); + //le_world->bad_guys.erase(it); + le_world->gameobjects.erase(std::remove(le_world->gameobjects.begin(), le_world->gameobjects.end(), *it), le_world->gameobjects.end()); + break; + } } -#endif + } break; case SQUARE: @@ -1716,25 +1725,26 @@ void le_change(float x, float y, int tm, unsigned int c) /* if there is a bad guy over there, remove it */ // TODO FIXME -#if 0 - for(std::list::iterator it = le_world->bad_guys.begin(); - it != le_world->bad_guys.end(); /* will be at end of loop */) + for(std::vector::iterator it = le_world->gameobjects.begin(); + it != le_world->gameobjects.end(); ++it /* will be at end of loop */) { - if((*it)->base.x/32 >= x1 && (*it)->base.x/32 <= x2 - && (*it)->base.y/32 >= y1 && (*it)->base.y/32 <= y2) - { - delete (*it); - it = le_world->bad_guys.erase(it); - le_world->get_level()->badguy_data.erase(le_world->get_level()->badguy_data.begin() + i); - continue; - } - else + MovingObject* pmobject = dynamic_cast (*it); + if (pmobject) { - ++i; - ++it; + if(pmobject->base.x/32 >= x1 && pmobject->base.x/32 <= x2 + && pmobject->base.y/32 >= y1 && pmobject->base.y/32 <= y2) + { + delete (*it); + //it = le_world->gameobjects.erase(it); + le_world->gameobjects.erase(std::remove(le_world->gameobjects.begin(), le_world->gameobjects.end(), *it), le_world->gameobjects.end()); + continue; + } + else + { + ++it; + } } } -#endif for(xx = x1; xx <= x2; xx++) for(yy = y1; yy <= y2; yy++)