X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameobjs.cpp;h=76722c708e3e30fe5249725f9247eb7a458b8fc2;hb=5dba61177d71c5572fd29af172fcdab7b1f9a561;hp=480b7468bd89b674e12ba6c28cbc071edd347ea4;hpb=403f2652505e814b645892bffaf89a584984f9b8;p=supertux.git diff --git a/src/gameobjs.cpp b/src/gameobjs.cpp index 480b7468b..76722c708 100644 --- a/src/gameobjs.cpp +++ b/src/gameobjs.cpp @@ -47,7 +47,7 @@ BouncyDistro::action(float elapsed_time) } void -BouncyDistro::draw(ViewPort& viewport, int ) +BouncyDistro::draw(Camera& viewport, int ) { img_distro[0]->draw(viewport.world2screen(position)); } @@ -71,7 +71,7 @@ BrokenBrick::action(float elapsed_time) } void -BrokenBrick::draw(ViewPort& viewport, int ) +BrokenBrick::draw(Camera& viewport, int ) { SDL_Rect src, dest; src.x = rand() % 16; @@ -110,7 +110,7 @@ BouncyBrick::action(float elapsed_time) } void -BouncyBrick::draw(ViewPort& viewport, int) +BouncyBrick::draw(Camera& viewport, int) { Tile::draw(viewport.world2screen(position + Vector(0, offset)), shape); } @@ -135,7 +135,7 @@ FloatingScore::action(float elapsed_time) } void -FloatingScore::draw(ViewPort& viewport, int ) +FloatingScore::draw(Camera& viewport, int ) { gold_text->draw(str, viewport.world2screen(position)); } @@ -145,17 +145,6 @@ FloatingScore::draw(ViewPort& viewport, int ) #define TRAMPOLINE_FRAMES 4 Sprite *img_trampoline[TRAMPOLINE_FRAMES]; -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); - } -} - Trampoline::Trampoline(DisplayManager& displaymanager, LispReader& reader) { displaymanager.add_drawable(this, LAYER_OBJECTS); @@ -185,7 +174,7 @@ Trampoline::write(LispWriter& writer) } void -Trampoline::draw(ViewPort& viewport, int ) +Trampoline::draw(Camera& viewport, int ) { img_trampoline[frame]->draw(viewport.world2screen(Vector(base.x, base.y))); frame = 0; @@ -275,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); } @@ -289,4 +280,137 @@ Trampoline::collision(void *p_c_object, int c_object, CollisionType type) } } +/* 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"); +}