X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fbackground.cpp;h=f60f18435537493adaa6104b82b597c9ff7dfedd;hb=04a3157ef478169b5a3fc05dae00ed6ee6a1fae2;hp=15333dd20dda4be64f68dc30be667ee66fb7e6d3;hpb=ef57479f613b900b73eba8e8f4d026aae0de25cc;p=supertux.git diff --git a/src/object/background.cpp b/src/object/background.cpp index 15333dd20..f60f18435 100644 --- a/src/object/background.cpp +++ b/src/object/background.cpp @@ -1,7 +1,7 @@ // $Id$ // -// SuperTux - A Jump'n Run -// Copyright (C) 2004 Matthias Braun // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -19,112 +19,114 @@ #include -#include "background.h" -#include "app/globals.h" -#include "camera.h" -#include "video/drawing_context.h" -#include "lisp/lisp.h" -#include "lisp/writer.h" +#include +#include "background.hpp" +#include "camera.hpp" +#include "video/drawing_context.hpp" +#include "lisp/lisp.hpp" +#include "lisp/writer.hpp" +#include "object_factory.hpp" +#include "resources.hpp" +#include "main.hpp" +#include "log.hpp" Background::Background() - : type(INVALID), layer(LAYER_BACKGROUND0), image(0) + : layer(LAYER_BACKGROUND0) { } Background::Background(const lisp::Lisp& reader) - : type(INVALID), layer(LAYER_BACKGROUND0), image(0) + : layer(LAYER_BACKGROUND0) { + // read position, defaults to (0,0) + float px = 0; + float py = 0; + reader.get("x", px); + reader.get("y", py); + this->pos = Vector(px,py); + + speed = 1.0; + speed_y = 1.0; + reader.get("layer", layer); - if(reader.get("image", imagefile) - && reader.get("speed", speed)) { - set_image(imagefile, speed); - } + if(!reader.get("image", imagefile) || !reader.get("speed", speed)) + throw std::runtime_error("Must specify image and speed for background"); - std::vector bkgd_top_color, bkgd_bottom_color; - if(reader.get_vector("top_color", bkgd_top_color) && - reader.get_vector("bottom_color", bkgd_bottom_color)) - set_gradient(Color(bkgd_top_color), Color(bkgd_bottom_color)); + set_image(imagefile, speed); + reader.get("speed-y", speed_y); + if (reader.get("image-top", imagefile_top)) { + image_top.reset(new Surface(imagefile_top)); + } + if (reader.get("image-bottom", imagefile_bottom)) { + image_bottom.reset(new Surface(imagefile_bottom)); + } } Background::~Background() { - delete image; } void Background::write(lisp::Writer& writer) { - if(type == INVALID) - return; - writer.start_list("background"); - if(type == IMAGE) { - writer.write_string("image", imagefile); - writer.write_float("speed", speed); - } else if(type == GRADIENT) { - std::vector bkgd_top_color, bkgd_bottom_color; - bkgd_top_color.push_back(gradient_top.red); - bkgd_top_color.push_back(gradient_top.green); - bkgd_top_color.push_back(gradient_top.blue); - bkgd_bottom_color.push_back(gradient_top.red); - bkgd_bottom_color.push_back(gradient_top.green); - bkgd_bottom_color.push_back(gradient_top.blue); - writer.write_int_vector("top_color", bkgd_top_color); - writer.write_int_vector("bottom_color", bkgd_bottom_color); - } + if (image_top.get() != NULL) + writer.write_string("image-top", imagefile_top); + + writer.write_string("image", imagefile); + if (image_bottom.get() != NULL) + writer.write_string("image-bottom", imagefile_bottom); + + writer.write_float("speed", speed); + writer.write_float("speed-y", speed_y); writer.write_int("layer", layer); - + writer.end_list("background"); } void -Background::action(float) +Background::update(float) { } void Background::set_image(const std::string& name, float speed) { - this->type = IMAGE; this->imagefile = name; this->speed = speed; - delete image; - image = new Surface(datadir + "/images/background/" + name, false); -} - -void -Background::set_gradient(Color top, Color bottom) -{ - type = GRADIENT; - gradient_top = top; - gradient_bottom = bottom; - - delete image; - image = new Surface(top, bottom, screen->w, screen->h); + image.reset(new Surface(name)); } void Background::draw(DrawingContext& context) { - if(type == GRADIENT) { - context.push_transform(); - context.set_translation(Vector(0, 0)); - context.draw_surface(image, Vector(0, 0), layer); - context.pop_transform(); - } else if(type == IMAGE) { - if(!image) - return; - - int sx = int(-context.get_translation().x * speed) % image->w - image->w; - int sy = int(-context.get_translation().y * speed) % image->h - image->h; - context.push_transform(); - context.set_translation(Vector(0, 0)); - for(int x = sx; x < screen->w; x += image->w) - for(int y = sy; y < screen->h; y += image->h) - context.draw_surface(image, Vector(x, y), layer); - context.pop_transform(); + if(image.get() == NULL) + return; + + int w = (int) image->get_width(); + int h = (int) image->get_height(); + int sx = int(pos.x-context.get_translation().x * speed) % w - w; + int sy = int(pos.y-context.get_translation().y * speed_y) % h - h; + int center_image_py = int(pos.y-context.get_translation().y * speed_y); + int bottom_image_py = int(pos.y-context.get_translation().y * speed_y) + h; + context.push_transform(); + context.set_translation(Vector(0, 0)); + for(int x = sx; x < SCREEN_WIDTH; x += w) { + for(int y = sy; y < SCREEN_HEIGHT; y += h) { + if (image_top.get() != NULL && (y < center_image_py)) { + context.draw_surface(image_top.get(), Vector(x, y), layer); + continue; + } + if (image_bottom.get() != NULL && (y >= bottom_image_py)) { + context.draw_surface(image_bottom.get(), Vector(x, y), layer); + continue; + } + context.draw_surface(image.get(), Vector(x, y), layer); + } } + context.pop_transform(); } +IMPLEMENT_FACTORY(Background, "background");