X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameobjs.cpp;h=5340bfb57b31712ce8c70592b46490391501aa3e;hb=e4db6eb50cd6bcba607858b5e6c4c5d53531ed1f;hp=3d9c20e68970b59fcdb810c7a22c04e5c1d0481d;hpb=308f11e38981077626fe0ea9887094f3c28b02f9;p=supertux.git diff --git a/src/gameobjs.cpp b/src/gameobjs.cpp index 3d9c20e68..5340bfb57 100644 --- a/src/gameobjs.cpp +++ b/src/gameobjs.cpp @@ -23,13 +23,17 @@ #include #include +#include "app/globals.h" #include "tile.h" +#include "tile_manager.h" #include "gameloop.h" #include "gameobjs.h" -#include "sprite_manager.h" +#include "special/sprite_manager.h" #include "resources.h" #include "sector.h" #include "tilemap.h" +#include "video/drawing_context.h" +#include "camera.h" BouncyDistro::BouncyDistro(const Vector& pos) : position(pos) @@ -80,9 +84,10 @@ BrokenBrick::draw(DrawingContext& context) } BouncyBrick::BouncyBrick(const Vector& pos) - : position(pos), offset(0), offset_m(-BOUNCY_BRICK_SPEED) -{ - shape = Sector::current()->solids->get_tile_id_at(pos); + : position(pos), offset(0), offset_m(-BOUNCY_BRICK_SPEED), + shape(Sector::current()->solids->get_tile_id_at(pos)) +{ + shape.hidden = true; } void @@ -96,43 +101,71 @@ BouncyBrick::action(float elapsed_time) /* Stop bouncing? */ if (offset >= 0) - remove_me(); + { + shape.hidden = false; + remove_me(); + } } void BouncyBrick::draw(DrawingContext& context) { TileManager::instance()-> - draw_tile(context, shape, position + Vector(0, offset), LAYER_TILES+1); + draw_tile(context, shape.id, position + Vector(0, offset), LAYER_TILES+1); +} + +FloatingText::FloatingText(const Vector& pos, const std::string& text_) + : position(pos), text(text_) +{ + timer.start(1000); + position.x -= text.size() * 8; } -FloatingScore::FloatingScore(const Vector& pos, int score) +FloatingText::FloatingText(const Vector& pos, int score) : position(pos) { timer.start(1000); + + // turn int into a string + char str[10]; snprintf(str, 10, "%d", score); - position.x -= strlen(str) * 8; + text = str; + + position.x -= text.size() * 8; } void -FloatingScore::action(float elapsed_time) +FloatingText::action(float elapsed_time) { - position.y -= 2 * elapsed_time; + position.y -= 1.4 * elapsed_time; if(!timer.check()) remove_me(); } +#define FADING_TIME 350 + void -FloatingScore::draw(DrawingContext& context) +FloatingText::draw(DrawingContext& context) { - context.draw_text(gold_text, str, position, LAYER_OBJECTS); + // make an alpha animation when disapearing + int alpha; + if(timer.get_left() < FADING_TIME) + alpha = timer.get_left() * 255 / FADING_TIME; + else + alpha = 255; + + context.push_transform(); + context.set_alpha(alpha); + + context.draw_text(gold_text, text, position, LEFT_ALLIGN, LAYER_OBJECTS+1); + + context.pop_transform(); } /* Trampoline */ -#define TRAMPOLINE_FRAMES 4 -Sprite *img_trampoline[TRAMPOLINE_FRAMES]; +Sprite *img_trampoline; Trampoline::Trampoline(LispReader& reader) { @@ -148,6 +181,19 @@ Trampoline::Trampoline(LispReader& reader) physic.reset(); } +Trampoline::Trampoline(float x, float y) +{ + base.x = x; + base.y = y; + base.width = 32; + base.height = 32; + power = 7.5; + + frame = 0; + mode = M_NORMAL; + physic.reset(); +} + void Trampoline::write(LispWriter& writer) { @@ -163,7 +209,8 @@ Trampoline::write(LispWriter& writer) void Trampoline::draw(DrawingContext& context) { - img_trampoline[frame]->draw(context, Vector(base.x, base.y), LAYER_OBJECTS); + img_trampoline->set_frame(frame); + img_trampoline->draw(context, base, LAYER_OBJECTS); frame = 0; } @@ -214,7 +261,7 @@ Trampoline::action(float frame_ratio) } } - physic.apply(frame_ratio, base.x, base.y); + physic.apply(frame_ratio, base.x, base.y, Sector::current()->gravity); collision_swept_object_map(&old_base, &base); } @@ -295,6 +342,14 @@ FlyingPlatform::FlyingPlatform(LispReader& reader) frame = 0; } +FlyingPlatform::FlyingPlatform(int x, int y) +{ +base.x = x; +base.y = y; +point = 0; +move = false; +} + void FlyingPlatform::write(LispWriter& writer) { @@ -310,7 +365,7 @@ FlyingPlatform::write(LispWriter& writer) void FlyingPlatform::draw(DrawingContext& context) { - img_flying_platform->draw(context, Vector(base.x, base.y), LAYER_OBJECTS); + img_flying_platform->draw(context, base, LAYER_OBJECTS); } void @@ -387,15 +442,101 @@ FlyingPlatform::collision(void *p_c_object, int c_object, CollisionType type) } } -void load_object_gfx() +Sprite *img_smoke_cloud; + +SmokeCloud::SmokeCloud(const Vector& pos) + : position(pos) { - char sprite_name[16]; + timer.start(300); +} - for (int i = 0; i < TRAMPOLINE_FRAMES; i++) - { - sprintf(sprite_name, "trampoline-%i", i+1); - img_trampoline[i] = sprite_manager->load(sprite_name); - } +void +SmokeCloud::action(float elapsed_time) +{ + position.y -= 1.2 * elapsed_time; + + if(!timer.check()) + remove_me(); +} +void +SmokeCloud::draw(DrawingContext& context) +{ + img_smoke_cloud->draw(context, position, LAYER_OBJECTS+1); +} + +Particles::Particles(const Vector& epicenter, const Vector& velocity, const Vector& acceleration, int number, Color color_, int size_, int life_time) + : color(color_), size(size_), vel(velocity), accel(acceleration) +{ + if(life_time == 0) + { + live_forever = true; + } + else + { + live_forever = false; + timer.start(life_time); + } + + // create particles + for(int p = 0; p < number; p++) + { + Particle* particle = new Particle; + particle->pos = epicenter; + particle->angle = (rand() % 360) * (M_PI / 180); // in radius + + particles.push_back(particle); + } +} + +Particles::~Particles() +{ + // free particles + for(std::vector::iterator i = particles.begin(); i < particles.end(); i++) + delete (*i); +} + +void +Particles::action(float elapsed_time) +{ + vel.x += accel.x * elapsed_time; + vel.y += accel.y * elapsed_time; + + int camera_x = (int)Sector::current()->camera->get_translation().x; + int camera_y = (int)Sector::current()->camera->get_translation().y; + + // update particles + for(std::vector::iterator i = particles.begin(); i < particles.end(); i++) + { + (*i)->pos.x += sin((*i)->angle) * vel.x * elapsed_time; + (*i)->pos.y += cos((*i)->angle) * vel.y * elapsed_time; + + if((*i)->pos.x < camera_x || (*i)->pos.x > screen->w + camera_x || + (*i)->pos.y < camera_y || (*i)->pos.y > screen->h + camera_y) + { + delete (*i); + particles.erase(i); + } + } + + if((!timer.check() && !live_forever) || particles.size() == 0) + remove_me(); +} + +void +Particles::draw(DrawingContext& context) +{ + // draw particles + for(std::vector::iterator i = particles.begin(); i < particles.end(); i++) + { + context.draw_filled_rect((*i)->pos, Vector(size,size), color, LAYER_OBJECTS+10); + } +} + +void load_object_gfx() +{ + img_trampoline = sprite_manager->load("trampoline"); + img_trampoline->start_animation(0); img_flying_platform = sprite_manager->load("flying_platform"); + img_smoke_cloud = sprite_manager->load("stomp"); }