// $Id$
//
// SuperTux
-// Copyright (C) 2004 Ingo Ruhnke <grumbel@gmx.de>
+// Copyright (C) 2006 Matthias Braun <matze@braunis.de>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
#include <config.h>
#include <iostream>
#include "resources.hpp"
#include "video/drawing_context.hpp"
#include "lisp/list_iterator.hpp"
+#include "log.hpp"
SpriteData::Action::Action()
{
x_offset = 0;
y_offset = 0;
- z_order = 0;
+ hitbox_w = 0;
+ hitbox_h = 0;
+ z_order = 0;
fps = 10;
}
delete *i;
}
-SpriteData::SpriteData(const lisp::Lisp* lisp)
+SpriteData::SpriteData(const lisp::Lisp* lisp, const std::string& basedir)
{
lisp::ListIterator iter(lisp);
while(iter.next()) {
if(iter.item() == "name") {
iter.value()->get(name);
} else if(iter.item() == "action") {
- parse_action(iter.lisp());
+ parse_action(iter.lisp(), basedir);
} else {
- std::cerr << "Unknown sprite field: " << iter.item() << "\n";
+ log_warning << "Unknown sprite field: " << iter.item() << std::endl;
}
}
- if(name.empty())
- throw std::runtime_error("Error: Sprite wihtout name.");
if(actions.empty())
throw std::runtime_error("Error: Sprite wihtout actions.");
}
}
void
-SpriteData::parse_action(const lisp::Lisp* lisp)
+SpriteData::parse_action(const lisp::Lisp* lisp, const std::string& basedir)
{
Action* action = new Action;
throw std::runtime_error(
"If there are more than one action, they need names!");
}
- lisp->get("x-offset", action->x_offset);
- lisp->get("y-offset", action->y_offset);
+ std::vector<float> hitbox;
+ if (lisp->get_vector("hitbox", hitbox)) {
+ if (hitbox.size() != 4) throw std::runtime_error("hitbox must specify exactly 4 coordinates");
+ action->x_offset = hitbox[0];
+ action->y_offset = hitbox[1];
+ action->hitbox_w = hitbox[2];
+ action->hitbox_h = hitbox[3];
+ }
lisp->get("z-order", action->z_order);
lisp->get("fps", action->fps);
throw std::runtime_error("Could not mirror action. Action not found\n"
"Mirror actions must be defined after the real one!");
} else {
+ float max_w = 0;
+ float max_h = 0;
for(int i = 0; static_cast<unsigned int>(i) < act_tmp->surfaces.size();
i++) {
- Surface* surface = new Surface(sdl_surface_from_sdl_surface(
- act_tmp->surfaces[i]->impl->get_sdl_surface()), true);
- surface->apply_filter(HORIZONTAL_FLIP_FILTER);
+ Surface* surface = new Surface(*(act_tmp->surfaces[i]));
+ surface->hflip();
+ max_w = std::max(max_w, (float) surface->get_width());
+ max_h = std::max(max_h, (float) surface->get_height());
action->surfaces.push_back(surface);
}
+ if (action->hitbox_w < 1) action->hitbox_w = max_w;
+ if (action->hitbox_h < 1) action->hitbox_h = max_h;
}
} else { // Load images
std::vector<std::string> images;
throw std::runtime_error(msg.str());
}
+ float max_w = 0;
+ float max_h = 0;
for(std::vector<std::string>::size_type i = 0; i < images.size(); i++) {
- action->surfaces.push_back(new Surface("images/" + images[i], true));
+ Surface* surface = new Surface(basedir + images[i]);
+ max_w = std::max(max_w, (float) surface->get_width());
+ max_h = std::max(max_h, (float) surface->get_height());
+ action->surfaces.push_back(surface);
}
+ if (action->hitbox_w < 1) action->hitbox_w = max_w;
+ if (action->hitbox_h < 1) action->hitbox_h = max_h;
}
actions[action->name] = action;
}
}
return i->second;
}
-