X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameobjs.cpp;h=76722c708e3e30fe5249725f9247eb7a458b8fc2;hb=5dba61177d71c5572fd29af172fcdab7b1f9a561;hp=2d90234853303903a41763ac0269479f03b26ca3;hpb=3a242221bb54f60c66895de5d26e164b3c69a6e4;p=supertux.git diff --git a/src/gameobjs.cpp b/src/gameobjs.cpp index 2d9023485..76722c708 100644 --- a/src/gameobjs.cpp +++ b/src/gameobjs.cpp @@ -27,73 +27,51 @@ #include "sprite_manager.h" #include "resources.h" #include "level.h" +#include "display_manager.h" -void -BouncyDistro::init(float x, float y) +BouncyDistro::BouncyDistro(DisplayManager& displaymanager, const Vector& pos) + : position(pos) { - base.x = x; - base.y = y; - base.ym = -2; + ym = -2; + displaymanager.add_drawable(this, LAYER_OBJECTS); } void -BouncyDistro::action(double frame_ratio) +BouncyDistro::action(float elapsed_time) { - base.y = base.y + base.ym * frame_ratio; - - base.ym += 0.1 * frame_ratio; + position.y += ym * elapsed_time; - if (base.ym >= 0) - { - std::vector::iterator i - = std::find(World::current()->bouncy_distros.begin(), - World::current()->bouncy_distros.end(), - this); - if (i != World::current()->bouncy_distros.end()) - World::current()->bouncy_distros.erase(i); - } + ym += 0.1 * elapsed_time; // not framerate independent... but who really cares + if(ym >= 0) + remove_me(); } void -BouncyDistro::draw() +BouncyDistro::draw(Camera& viewport, int ) { - img_distro[0]->draw(base.x - scroll_x, - base.y - scroll_y); + img_distro[0]->draw(viewport.world2screen(position)); } -void -BrokenBrick::init(Tile* tile_, float x, float y, float xm, float ym) +BrokenBrick::BrokenBrick(DisplayManager& displaymanager, Tile* ntile, + const Vector& pos, const Vector& nmovement) + : tile(ntile), position(pos), movement(nmovement) { - tile = tile_; - base.x = x; - base.y = y; - base.xm = xm; - base.ym = ym; - - timer.init(true); + displaymanager.add_drawable(this, LAYER_OBJECTS); timer.start(200); } void -BrokenBrick::action(double frame_ratio) +BrokenBrick::action(float elapsed_time) { - base.x = base.x + base.xm * frame_ratio; - base.y = base.y + base.ym * frame_ratio; + position += movement * elapsed_time; if (!timer.check()) - { - std::vector::iterator i - = std::find(World::current()->broken_bricks.begin(), - World::current()->broken_bricks.end(), - this); - if (i != World::current()->broken_bricks.end()) - World::current()->broken_bricks.erase(i); - } + remove_me(); } void -BrokenBrick::draw() +BrokenBrick::draw(Camera& viewport, int ) { SDL_Rect src, dest; src.x = rand() % 16; @@ -101,8 +79,8 @@ BrokenBrick::draw() src.w = 16; src.h = 16; - dest.x = (int)(base.x - scroll_x); - dest.y = (int)(base.y - scroll_y); + dest.x = (int)(position.x - viewport.get_translation().x); + dest.y = (int)(position.y - viewport.get_translation().y); dest.w = 16; dest.h = 16; @@ -110,107 +88,56 @@ BrokenBrick::draw() tile->images[0]->draw_part(src.x,src.y,dest.x,dest.y,dest.w,dest.h); } -void -BouncyBrick::init(float x, float y) +BouncyBrick::BouncyBrick(DisplayManager& displaymanager, const Vector& pos) + : position(pos), offset(0), offset_m(-BOUNCY_BRICK_SPEED) { - base.x = x; - base.y = y; - offset = 0; - offset_m = -BOUNCY_BRICK_SPEED; - shape = World::current()->get_level()->gettileid(x, y); + displaymanager.add_drawable(this, LAYER_OBJECTS); + shape = World::current()->get_level()->gettileid(pos.x, pos.y); } void -BouncyBrick::action(double frame_ratio) +BouncyBrick::action(float elapsed_time) { - offset = (offset + offset_m * frame_ratio); + offset += offset_m * elapsed_time; /* Go back down? */ if (offset < -BOUNCY_BRICK_MAX_OFFSET) offset_m = BOUNCY_BRICK_SPEED; - /* Stop bouncing? */ if (offset >= 0) - { - std::vector::iterator i - = std::find(World::current()->bouncy_bricks.begin(), - World::current()->bouncy_bricks.end(), - this); - if (i != World::current()->bouncy_bricks.end()) - World::current()->bouncy_bricks.erase(i); - } + remove_me(); } void -BouncyBrick::draw() +BouncyBrick::draw(Camera& viewport, int) { - SDL_Rect dest; - - if (base.x >= scroll_x - 32 && - base.x <= scroll_x + screen->w) - { - dest.x = (int)(base.x - scroll_x); - dest.y = (int)(base.y - scroll_y); - dest.w = 32; - dest.h = 32; - - Level* plevel = World::current()->get_level(); - - // FIXME: overdrawing hack to clean the tile from the screen to - // paint it later at on offseted position - if(plevel->bkgd_image[0] == '\0') - { - fillrect(base.x - scroll_x, base.y - scroll_y, - 32,32, - plevel->bkgd_top.red, plevel->bkgd_top.green, plevel->bkgd_top.blue, 0); -// FIXME: doesn't respect the gradient, futhermore is this necessary at all?? - } - else - { - int s = ((int)scroll_x / 2)%640; - plevel->img_bkgd->draw_part(dest.x + s, dest.y, - dest.x, dest.y,dest.w,dest.h); - } - - Tile::draw(base.x - scroll_x, - base.y - scroll_y + offset, - shape); - } + Tile::draw(viewport.world2screen(position + Vector(0, offset)), shape); } -void -FloatingScore::init(float x, float y, int s) +FloatingScore::FloatingScore(DisplayManager& displaymanager, + const Vector& pos, int score) + : position(pos) { - base.x = x; - base.y = y - 16; - timer.init(true); + displaymanager.add_drawable(this, LAYER_OBJECTS); timer.start(1000); - value = s; + snprintf(str, 10, "%d", score); + position.x -= strlen(str) * 8; } void -FloatingScore::action(double frame_ratio) +FloatingScore::action(float elapsed_time) { - base.y = base.y - 2 * frame_ratio; + position.y -= 2 * elapsed_time; if(!timer.check()) - { - std::vector::iterator i - = std::find(World::current()->floating_scores.begin(), - World::current()->floating_scores.end(), - this); - if (i != World::current()->floating_scores.end()) - World::current()->floating_scores.erase(i); - } + remove_me(); } void -FloatingScore::draw() +FloatingScore::draw(Camera& viewport, int ) { - char str[10]; - sprintf(str, "%d", value); - gold_text->draw(str, (int)base.x + 16 - strlen(str) * 8, (int)base.y, 1); + gold_text->draw(str, viewport.world2screen(position)); } /* Trampoline */ @@ -218,24 +145,16 @@ FloatingScore::draw() #define TRAMPOLINE_FRAMES 4 Sprite *img_trampoline[TRAMPOLINE_FRAMES]; -void load_object_gfx() +Trampoline::Trampoline(DisplayManager& displaymanager, LispReader& reader) { - char sprite_name[16]; - - for (int i = 0; i < TRAMPOLINE_FRAMES; i++) - { - sprintf(sprite_name, "trampoline-%i", i+1); - img_trampoline[i] = sprite_manager->load(sprite_name); - } -} - -void -Trampoline::init(float x, float y) -{ - base.x = x; - base.y = y; + displaymanager.add_drawable(this, LAYER_OBJECTS); + + 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; @@ -243,18 +162,26 @@ Trampoline::init(float x, float y) } void -Trampoline::draw() +Trampoline::write(LispWriter& writer) { - img_trampoline[frame]->draw((int)base.x, (int)base.y); + writer.start_list("trampoline"); - frame = 0; + writer.write_float("x", base.x); + writer.write_float("y", base.y); + writer.write_float("power", power); - if (debug_mode) - fillrect(base.x - scroll_x, base.y - scroll_y, base.width, base.height, 75, 75, 0, 150); + writer.end_list("trampoline"); } void -Trampoline::action(double frame_ratio) +Trampoline::draw(Camera& viewport, int ) +{ + img_trampoline[frame]->draw(viewport.world2screen(Vector(base.x, base.y))); + frame = 0; +} + +void +Trampoline::action(float frame_ratio) { // TODO: Remove if we're too far off the screen @@ -305,6 +232,12 @@ Trampoline::action(double frame_ratio) } void +Trampoline::collision(const MovingObject&, int) +{ + // comes later +} + +void Trampoline::collision(void *p_c_object, int c_object, CollisionType type) { Player* pplayer_c = NULL; @@ -331,8 +264,10 @@ Trampoline::collision(void *p_c_object, int c_object, CollisionType type) else frame = 0; - if (squish_amount < 20) + if (squish_amount < 20) { pplayer_c->physic.set_velocity_y(power); + pplayer_c->fall_mode = Player::TRAMPOLINE_JUMP; + } else if (pplayer_c->physic.get_velocity_y() < 0) pplayer_c->physic.set_velocity_y(-squish_amount/32); } @@ -345,5 +280,137 @@ Trampoline::collision(void *p_c_object, int c_object, CollisionType type) } } -/* EOF */ +/* Flying Platform */ + +Sprite *img_flying_platform; + +FlyingPlatform::FlyingPlatform(DisplayManager& displaymanager, LispReader& reader) +{ + displaymanager.add_drawable(this, LAYER_OBJECTS); + + reader.read_int_vector("x", &pos_x); + reader.read_int_vector("y", &pos_y); + + velocity = 2.0; + reader.read_float("velocity", &velocity); + + base.x = pos_x[0]; + base.y = pos_y[0]; + base.width = 96; + base.height = 40; + + 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; +} + +void +FlyingPlatform::write(LispWriter& writer) +{ + writer.start_list("flying-trampoline"); + + writer.write_int_vector("x", pos_x); + writer.write_int_vector("y", pos_y); + writer.write_float("velocity", velocity); + + writer.end_list("flying-trampoline"); +} + +void +FlyingPlatform::draw(Camera& viewport, int ) +{ +img_flying_platform->draw(viewport.world2screen(Vector(base.x, base.y))); +} + +void +FlyingPlatform::action(float frame_ratio) +{ + // TODO: Remove if we're too far off the screen + +if(!move) + return; + +if((unsigned)point+1 != pos_x.size()) + { + if(((pos_x[point+1] > pos_x[point] && base.x >= pos_x[point+1]) || + (pos_x[point+1] < pos_x[point] && base.x <= pos_x[point+1]) || + pos_x[point] == pos_x[point+1]) && + ((pos_y[point+1] > pos_y[point] && base.y >= pos_y[point+1]) || + (pos_y[point+1] < pos_y[point] && base.y <= pos_y[point+1]) || + 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 + { + // point = 0; + // reverse vector + return; + } +/* +if(pos_x[point+1] > base.x) + base.x += velocity * frame_ratio; +else if(pos_x[point+1] < base.x) + base.x -= velocity * frame_ratio; + +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; +*/ + +base.x += vel_x * frame_ratio; +base.y += vel_y * frame_ratio; +} + +void +FlyingPlatform::collision(const MovingObject&, int) +{ + // comes later +} + +void +FlyingPlatform::collision(void *p_c_object, int c_object, CollisionType type) +{ +(void) p_c_object; +(void) type; + +// Player* pplayer_c = NULL; + switch (c_object) + { + case CO_PLAYER: +// pplayer_c = (Player*) p_c_object; + move = true; + + break; + + default: + break; + + } +} + +void load_object_gfx() +{ + char sprite_name[16]; + for (int i = 0; i < TRAMPOLINE_FRAMES; i++) + { + sprintf(sprite_name, "trampoline-%i", i+1); + img_trampoline[i] = sprite_manager->load(sprite_name); + } + + img_flying_platform = sprite_manager->load("flying_platform"); +}