+ remove_me();
+}
+
+void
+BouncyBrick::draw(DrawingContext& context)
+{
+ TileManager::instance()->
+ draw_tile(context, shape, position + Vector(0, offset), LAYER_TILES+1);
+}
+
+FloatingScore::FloatingScore(const Vector& pos, int score)
+ : position(pos)
+{
+ timer.start(1000);
+ snprintf(str, 10, "%d", score);
+ position.x -= strlen(str) * 8;
+}
+
+void
+FloatingScore::action(float elapsed_time)
+{
+ position.y -= 2 * elapsed_time;
+
+ if(!timer.check())
+ remove_me();
+}
+
+void
+FloatingScore::draw(DrawingContext& context)
+{
+ context.draw_text(gold_text, str, position, LAYER_OBJECTS);
+}
+
+/* Trampoline */
+
+#define TRAMPOLINE_FRAMES 4
+Sprite *img_trampoline[TRAMPOLINE_FRAMES];
+
+Trampoline::Trampoline(LispReader& reader)
+{
+ reader.read_float("x", base.x);
+ reader.read_float("y", base.y);
+ base.width = 32;
+ base.height = 32;
+ power = 7.5;
+ reader.read_float("power", power);
+
+ frame = 0;
+ mode = M_NORMAL;
+ physic.reset();
+}
+
+void
+Trampoline::write(LispWriter& writer)
+{
+ writer.start_list("trampoline");
+
+ writer.write_float("x", base.x);
+ writer.write_float("y", base.y);
+ writer.write_float("power", power);
+
+ writer.end_list("trampoline");
+}
+
+void
+Trampoline::draw(DrawingContext& context)
+{
+ img_trampoline[frame]->draw(context, Vector(base.x, base.y), LAYER_OBJECTS);
+ frame = 0;
+}
+
+void
+Trampoline::action(float frame_ratio)
+{
+ // TODO: Remove if we're too far off the screen
+
+ // Falling
+ if (mode != M_HELD)
+ {
+ if (issolid(base.x + base.width/2, base.y + base.height))
+ {
+ base.y = int((base.y + base.height)/32) * 32 - base.height;
+
+ physic.enable_gravity(false);
+ physic.set_velocity_y(0.0f);
+
+ physic.set_velocity_x(0);
+ }
+ else