Thread: [Super-tux-commit] supertux/src lispreader.cpp,1.23,1.24 lispreader.h,1.13,1.14 tile.cpp,1.30,1.31
Brought to you by:
wkendrick
From: Ingo R. <gr...@us...> - 2004-06-15 12:19:08
|
Update of /cvsroot/super-tux/supertux/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5762 Modified Files: lispreader.cpp lispreader.h tile.cpp Log Message: - change subimage loading syntax to be more usefull, ie. now its (images "somefile" (region "somefile" 0 0 32 32") "someotherfile") Index: tile.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/tile.cpp,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- tile.cpp 14 Jun 2004 22:45:23 -0000 1.30 +++ tile.cpp 15 Jun 2004 12:18:59 -0000 1.31 @@ -28,6 +28,74 @@ #include "vector.h" #include "screen/drawing_context.h" +/** Dirty little helper to create a surface from a snipped of lisp: + * + * "filename" + * (region "filename" x y w h) + */ +static +Surface* create_surface(lisp_object_t* cur) +{ + if (lisp_string_p(cur)) + { + return new Surface(datadir + "/images/tilesets/" + lisp_string(cur), + USE_ALPHA); + } + else if (lisp_cons_p(cur) && lisp_symbol_p(lisp_car(cur))) + { + lisp_object_t* sym = lisp_car(cur); + lisp_object_t* data = lisp_cdr(cur); + + if (strcmp(lisp_symbol(sym), "region") == 0) + { + if (lisp_list_length(data) == 5) // (image-region filename x y w h) + { + return new Surface(datadir + "/images/tilesets/" + lisp_string(lisp_car(data)), + lisp_integer(lisp_list_nth(data, 1)), + lisp_integer(lisp_list_nth(data, 2)), + lisp_integer(lisp_list_nth(data, 3)), + lisp_integer(lisp_list_nth(data, 4)), + USE_ALPHA); + } + else + { + std::cout << "Tile: Type mispatch, should be '(region \"somestring\" x y w h)'" << std::endl; + return 0; + } + } + else + { + std::cout << "Tile: Unhandled tag: " << lisp_symbol(sym) << std::endl; + return 0; + } + } + + std::cout << "Tile: unhandled element" << std::endl; + return 0; +} + +/** Create a vector of surfaces (aka Sprite) from a piece of lisp: + ((image "bla.png") (image-region "bla.png") ...) + */ +static +std::vector<Surface*> create_surfaces(lisp_object_t* cur) +{ + std::vector<Surface*> surfs; + + while(cur) + { + Surface* surface = create_surface(lisp_car(cur)); + if (surface) + surfs.push_back(surface); + else + std::cout << "Tile: Couldn't create image" << std::endl; + + cur = lisp_cdr(cur); + } + + return surfs; +} + Tile::Tile() : id(-1), attributes(0), data(0), next_tile(0), anim_speed(25) { @@ -79,38 +147,9 @@ reader.read_int("anim-speed", anim_speed); reader.read_int("next-tile", next_tile); - std::vector<std::string> filenames; - reader.read_string_vector("images", filenames); - std::vector<std::string> editor_filenames; - reader.read_string_vector("editor-images", editor_filenames); - - std::vector<int> grid; - reader.read_int_vector("grid", grid); - - // read images - for(std::vector<std::string>::iterator i = filenames.begin(); - i != filenames.end(); ++i) - { - if (grid.size() == 4) - { - Surface* surface = new Surface(datadir + "/images/tilesets/" + *i, - grid[0], grid[1], grid[2], grid[3], - USE_ALPHA); - images.push_back(surface); - } - else - { - Surface* surface = new Surface(datadir + "/images/tilesets/" + *i, USE_ALPHA); - images.push_back(surface); - } - } - - for(std::vector<std::string>::iterator i = editor_filenames.begin(); - i != editor_filenames.end(); ++i) { - Surface* surface - = new Surface(datadir + "/images/tilesets/" + *i, USE_ALPHA); - editor_images.push_back(surface); - } + // FIXME: make images and editor_images a sprite + images = create_surfaces(reader.read_lisp("images")); + editor_images = create_surfaces(reader.read_lisp("editor-images")); return id; } Index: lispreader.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/lispreader.cpp,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- lispreader.cpp 9 Jun 2004 05:23:19 -0000 1.23 +++ lispreader.cpp 15 Jun 2004 12:18:59 -0000 1.24 @@ -1102,14 +1102,10 @@ return true; } -LispReader* +lisp_object_t* LispReader::read_lisp(const char* name) { - lisp_object_t* obj = search_for(name); - if(!obj) - return 0; - - return new LispReader(obj); + return search_for(name); } bool Index: lispreader.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/lispreader.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- lispreader.h 9 Jun 2004 05:23:20 -0000 1.13 +++ lispreader.h 15 Jun 2004 12:18:59 -0000 1.14 @@ -192,7 +192,7 @@ bool read_float(const char* name, float& f); bool read_bool(const char* name, bool& b); bool read_lisp(const char* name, lisp_object_t*& b); - LispReader* read_lisp(const char* name); + lisp_object_t* read_lisp(const char* name); static LispReader* load(const std::string& filename, const std::string& toplevellist); |