SpriteImpl::SpriteImpl(const SpriteDescription& desc, ResourceModifier::Enum mod) : filename(desc.filename), framebuffer_surface(), offset(), frame_pos(), frame_size(), frame_delay(), array(), loop(), loop_last_cycle(), finished(false), frame(0), tick_count(0) { framebuffer_surface = load_framebuffer_surface(desc.filename, mod); frame_pos = desc.frame_pos; array = desc.array; frame_size.width = (desc.frame_size.width == -1) ? framebuffer_surface.get_width()/array.width : desc.frame_size.width; frame_size.height = (desc.frame_size.height == -1) ? framebuffer_surface.get_height()/array.height : desc.frame_size.height; frame_delay = desc.speed; loop = desc.loop; loop_last_cycle = false; offset = calc_origin(desc.origin, frame_size) - desc.offset; }
CL_Rectf ObjMapSpriteObjectImpl::get_bound_rect() const { CL_Point align = CL_Point(0, 0); CL_Origin origin_e; sprite.get_alignment(origin_e, align.x, align.y); CL_Point origin = calc_origin(origin_e, CL_Size(sprite.get_width(), sprite.get_height())); align.x = -align.x; // FIXME: This looks a bit hacky float scale_x, scale_y; sprite.get_scale(scale_x, scale_y); if (scale_x < 0) align.x += sprite.get_width(); if (scale_y < 0) align.y += sprite.get_height(); // if (scale_x > 1.0f && scale_y > 1.0f) // return CL_Rectf(pos - origin - align, // CL_Sizef(sprite.get_width() * scale_x, sprite.get_height() * scale_y)); // else return CL_Rectf(pos - origin - align, CL_Sizef(sprite.get_width(), sprite.get_height())); }
Rect Rect::get_rot_bounds(Origin origin, int x, int y, float angle) const { return get_rot_bounds( Point(left, top) + calc_origin(origin, get_size()) + Point(x, y), angle); }