X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameobjs.cpp;h=9075f2c730301ac7e44aa246ebc90d7ca8ea0c8f;hb=3369ed08e4b7126af560dc5f9c3442fc76b43ab4;hp=743d9cb9b2be4df084791a4be28cfc2afaf56c38;hpb=b8c83bae1b0cd0367b6e3ac8c4c28e077eb1b594;p=supertux.git diff --git a/src/gameobjs.cpp b/src/gameobjs.cpp index 743d9cb9b..9075f2c73 100644 --- a/src/gameobjs.cpp +++ b/src/gameobjs.cpp @@ -20,20 +20,19 @@ // 02111-1307, USA. #include #include -#include "world.h" +#include #include "tile.h" #include "gameloop.h" #include "gameobjs.h" #include "sprite_manager.h" #include "resources.h" -#include "level.h" -#include "display_manager.h" +#include "sector.h" +#include "tilemap.h" -BouncyDistro::BouncyDistro(DisplayManager& displaymanager, const Vector& pos) +BouncyDistro::BouncyDistro(const Vector& pos) : position(pos) { ym = -2; - displaymanager.add_drawable(this, LAYER_OBJECTS); } void @@ -47,17 +46,15 @@ BouncyDistro::action(float elapsed_time) } void -BouncyDistro::draw(Camera& viewport, int ) +BouncyDistro::draw(DrawingContext& context) { - img_distro[0]->draw(viewport.world2screen(position)); + context.draw_surface(img_distro[0], position, LAYER_OBJECTS); } -BrokenBrick::BrokenBrick(DisplayManager& displaymanager, Tile* ntile, - const Vector& pos, const Vector& nmovement) +BrokenBrick::BrokenBrick(Tile* ntile,const Vector& pos, const Vector& nmovement) : tile(ntile), position(pos), movement(nmovement) { - displaymanager.add_drawable(this, LAYER_OBJECTS); timer.start(200); } @@ -71,28 +68,19 @@ BrokenBrick::action(float elapsed_time) } void -BrokenBrick::draw(Camera& viewport, int ) +BrokenBrick::draw(DrawingContext& context) { - SDL_Rect src, dest; - src.x = rand() % 16; - src.y = rand() % 16; - src.w = 16; - src.h = 16; - - dest.x = (int)(position.x - viewport.get_translation().x); - dest.y = (int)(position.y - viewport.get_translation().y); - dest.w = 16; - dest.h = 16; - if (tile->images.size() > 0) - tile->images[0]->draw_part(src.x,src.y,dest.x,dest.y,dest.w,dest.h); + context.draw_surface_part(tile->images[0], + Vector(rand() % 16, rand() % 16), + Vector(16, 16), + position, LAYER_OBJECTS + 1); } -BouncyBrick::BouncyBrick(DisplayManager& displaymanager, const Vector& pos) +BouncyBrick::BouncyBrick(const Vector& pos) : position(pos), offset(0), offset_m(-BOUNCY_BRICK_SPEED) { - displaymanager.add_drawable(this, LAYER_OBJECTS); - shape = World::current()->get_level()->gettileid(pos.x, pos.y); + shape = Sector::current()->solids->get_tile_id_at(pos); } void @@ -110,16 +98,15 @@ BouncyBrick::action(float elapsed_time) } void -BouncyBrick::draw(Camera& viewport, int) +BouncyBrick::draw(DrawingContext& context) { - Tile::draw(viewport.world2screen(position + Vector(0, offset)), shape); + TileManager::instance()-> + draw_tile(context, shape, position + Vector(0, offset), LAYER_TILES+1); } -FloatingScore::FloatingScore(DisplayManager& displaymanager, - const Vector& pos, int score) +FloatingScore::FloatingScore(const Vector& pos, int score) : position(pos) { - displaymanager.add_drawable(this, LAYER_OBJECTS); timer.start(1000); snprintf(str, 10, "%d", score); position.x -= strlen(str) * 8; @@ -135,9 +122,9 @@ FloatingScore::action(float elapsed_time) } void -FloatingScore::draw(Camera& viewport, int ) +FloatingScore::draw(DrawingContext& context) { - gold_text->draw(str, viewport.world2screen(position)); + context.draw_text(gold_text, str, position, LAYER_OBJECTS); } /* Trampoline */ @@ -145,16 +132,14 @@ FloatingScore::draw(Camera& viewport, int ) #define TRAMPOLINE_FRAMES 4 Sprite *img_trampoline[TRAMPOLINE_FRAMES]; -Trampoline::Trampoline(DisplayManager& displaymanager, LispReader& reader) +Trampoline::Trampoline(LispReader& reader) { - displaymanager.add_drawable(this, LAYER_OBJECTS); - - reader.read_float("x", &base.x); - reader.read_float("y", &base.y); + 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); + reader.read_float("power", power); frame = 0; mode = M_NORMAL; @@ -174,9 +159,9 @@ Trampoline::write(LispWriter& writer) } void -Trampoline::draw(Camera& viewport, int ) +Trampoline::draw(DrawingContext& context) { - img_trampoline[frame]->draw(viewport.world2screen(Vector(base.x, base.y))); + img_trampoline[frame]->draw(context, Vector(base.x, base.y), LAYER_OBJECTS); frame = 0; } @@ -206,7 +191,7 @@ Trampoline::action(float frame_ratio) { /* FIXME: The trampoline object shouldn't know about pplayer objects. */ /* If we're holding the iceblock */ - Player& tux = *World::current()->get_tux(); + Player& tux = *Sector::current()->player; Direction dir = tux.dir; if(dir == RIGHT) @@ -284,15 +269,13 @@ Trampoline::collision(void *p_c_object, int c_object, CollisionType type) Sprite *img_flying_platform; -FlyingPlatform::FlyingPlatform(DisplayManager& displaymanager, LispReader& reader) +FlyingPlatform::FlyingPlatform(LispReader& reader) { - displaymanager.add_drawable(this, LAYER_OBJECTS); - - reader.read_int_vector("x", &pos_x); - reader.read_int_vector("y", &pos_y); + reader.read_int_vector("x", pos_x); + reader.read_int_vector("y", pos_y); velocity = 2.0; - reader.read_float("velocity", &velocity); + reader.read_float("velocity", velocity); base.x = pos_x[0]; base.y = pos_y[0]; @@ -302,6 +285,11 @@ FlyingPlatform::FlyingPlatform(DisplayManager& displaymanager, LispReader& reade point = 0; move = false; + float x = pos_x[point+1] - pos_x[point]; + float y = pos_y[point+1] - pos_y[point]; + vel_x = x*velocity / sqrt(x*x + y*y); + vel_y = -(velocity - vel_x); + frame = 0; } @@ -318,9 +306,9 @@ FlyingPlatform::write(LispWriter& writer) } void -FlyingPlatform::draw(Camera& viewport, int ) +FlyingPlatform::draw(DrawingContext& context) { -img_flying_platform->draw(viewport.world2screen(Vector(base.x, base.y))); + img_flying_platform->draw(context, Vector(base.x, base.y), LAYER_OBJECTS); } void @@ -341,6 +329,11 @@ if((unsigned)point+1 != pos_x.size()) pos_y[point] == pos_y[point+1])) { point++; + + float x = pos_x[point+1] - pos_x[point]; + float y = pos_y[point+1] - pos_y[point]; + vel_x = x*velocity / sqrt(x*x + y*y); + vel_y = -(velocity - vel_x); } } else // last point @@ -349,7 +342,7 @@ else // last point // reverse vector return; } - +/* if(pos_x[point+1] > base.x) base.x += velocity * frame_ratio; else if(pos_x[point+1] < base.x) @@ -359,15 +352,10 @@ if(pos_y[point+1] > base.y) base.y += velocity * frame_ratio; else if(pos_y[point+1] < base.y) base.y -= velocity * frame_ratio; -/* -float x = pos_x[point+1] - pos_x[point]; -float y = pos_y[point+1] - pos_y[point]; -float vel_x = x*velocity / sqrt(x*x + y*y); -float vel_y = velocity - vel_x; +*/ base.x += vel_x * frame_ratio; base.y += vel_y * frame_ratio; -*/ } void