X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameobjs.cpp;h=76722c708e3e30fe5249725f9247eb7a458b8fc2;hb=5dba61177d71c5572fd29af172fcdab7b1f9a561;hp=f85c89da9a8be87f63ae131cd6a41ede731cabd1;hpb=b145cb4377ee4ba2b2c725e3e1f36a27bcae2ff5;p=supertux.git diff --git a/src/gameobjs.cpp b/src/gameobjs.cpp index f85c89da9..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); } @@ -119,10 +119,10 @@ FloatingScore::FloatingScore(DisplayManager& displaymanager, const Vector& pos, int score) : position(pos) { - displaymanager.add_drawable(this, LAYER_OBJECTS+1); + displaymanager.add_drawable(this, LAYER_OBJECTS); timer.start(1000); snprintf(str, 10, "%d", score); - position.x += - strlen(str) * 8; + position.x -= strlen(str) * 8; } void @@ -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,24 +145,16 @@ 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); - } -} - -void -Trampoline::init(float x, float y) +Trampoline::Trampoline(DisplayManager& displaymanager, LispReader& reader) { - 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; @@ -170,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 @@ -232,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; @@ -258,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); } @@ -272,204 +280,137 @@ Trampoline::collision(void *p_c_object, int c_object, CollisionType type) } } +/* Flying Platform */ -/* Object Manager */ -//--------------------------------------------------------------------------- +Sprite *img_flying_platform; -ObjectManager::ObjectManager() +FlyingPlatform::FlyingPlatform(DisplayManager& displaymanager, LispReader& reader) { - std::string filename = datadir + "/images/tilesets/supertux.stbg"; - load_badguys(filename); -} + displaymanager.add_drawable(this, LAYER_OBJECTS); -ObjectManager::~ObjectManager() -{ - for(std::vector::iterator i = badguys.begin(); i != badguys.end(); ++i) { - delete *i; - } -} + reader.read_int_vector("x", &pos_x); + reader.read_int_vector("y", &pos_y); -void ObjectManager::load_badguys(std::string filename) -{ - (void) filename; -/* - lisp_object_t* root_obj = lisp_read_from_file(filename); + velocity = 2.0; + reader.read_float("velocity", &velocity); - if (!root_obj) - st_abort("Couldn't load file", filename); + base.x = pos_x[0]; + base.y = pos_y[0]; + base.width = 96; + base.height = 40; - if (strcmp(lisp_symbol(lisp_car(root_obj)), "supertux-badguys") == 0) - { - lisp_object_t* cur = lisp_cdr(root_obj); - - while(!lisp_nil_p(cur)) - { - lisp_object_t* element = lisp_car(cur); - - if (strcmp(lisp_symbol(lisp_car(element)), "badguy") == 0) - { - - - Tile* tile = new Tile; - tile->id = -1; - tile->solid = false; - tile->brick = false; - tile->ice = false; - tile->water = false; - tile->fullbox = false; - tile->distro = false; - tile->goal = false; - tile->data = 0; - tile->next_tile = 0; - tile->anim_speed = 25; - - LispReader reader(lisp_cdr(element)); - assert(reader.read_int("id", &tile->id)); - reader.read_bool("solid", &tile->solid); - reader.read_bool("brick", &tile->brick); - reader.read_bool("ice", &tile->ice); - reader.read_bool("water", &tile->water); - reader.read_bool("fullbox", &tile->fullbox); - reader.read_bool("distro", &tile->distro); - reader.read_bool("goal", &tile->goal); - reader.read_int("data", &tile->data); - reader.read_int("anim-speed", &tile->anim_speed); - reader.read_int("next-tile", &tile->next_tile); - reader.read_string_vector("images", &tile->filenames); - reader.read_string_vector("editor-images", &tile->editor_filenames); - - for(std::vector::iterator it = tile-> - filenames.begin(); - it != tile->filenames.end(); - ++it) - { - Surface* cur_image; - tile->images.push_back(cur_image); - tile->images[tile->images.size()-1] = new Surface( - datadir + "/images/tilesets/" + (*it), - USE_ALPHA); - } - for(std::vector::iterator it = tile->editor_filenames.begin(); - it != tile->editor_filenames.end(); - ++it) - { - Surface* cur_image; - tile->editor_images.push_back(cur_image); - tile->editor_images[tile->editor_images.size()-1] = new Surface( - datadir + "/images/tilesets/" + (*it), - USE_ALPHA); - } - - if (tile->id + tileset_id >= int(tiles.size()) - ) - tiles.resize(tile->id + tileset_id+1); - - tiles[tile->id + tileset_id] = tile; - } - else if (strcmp(lisp_symbol(lisp_car(element)), "tileset") == 0) - { - LispReader reader(lisp_cdr(element)); - std::string filename; - reader.read_string("file", &filename); - filename = datadir + "/images/tilesets/" + filename; - load_tileset(filename); - } - else if (strcmp(lisp_symbol(lisp_car(element)), "tilegroup") == 0) - { - TileGroup new_; - LispReader reader(lisp_cdr(element)); - reader.read_string("name", &new_.name); - reader.read_int_vector("tiles", &new_.tiles); - if(!tilegroups_) - tilegroups_ = new std::set; - tilegroups_->insert(new_).first; - } - else if (strcmp(lisp_symbol(lisp_car(element)), "properties") == 0) - { - LispReader reader(lisp_cdr(element)); - reader.read_int("id", &tileset_id); - tileset_id *= 1000; - } - else - { - puts("Unhandled symbol"); - } - - cur = lisp_cdr(cur); - } - } - else - { - assert(0); - } + point = 0; + move = false; - lisp_free(root_obj); -*/ + 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 ObjectManager::draw_bg() +void +FlyingPlatform::write(LispWriter& writer) { -/* - for (unsigned int i = 0; i < bouncy_bricks.size(); ++i) - bouncy_bricks[i]->draw(); + writer.start_list("flying-trampoline"); - for (BadGuys::iterator i = bad_guys.begin(); i != bad_guys.end(); ++i) - (*i)->draw(); + writer.write_int_vector("x", pos_x); + writer.write_int_vector("y", pos_y); + writer.write_float("velocity", velocity); - for (Trampolines::iterator i = trampolines.begin(); i != trampolines.end(); ++i) - (*i)->draw(); -*/ + writer.end_list("flying-trampoline"); } -void ObjectManager::draw_fg() +void +FlyingPlatform::draw(Camera& viewport, int ) { -/* - for (unsigned int i = 0; i < bullets.size(); ++i) - bullets[i].draw(); +img_flying_platform->draw(viewport.world2screen(Vector(base.x, base.y))); +} - for (unsigned int i = 0; i < floating_scores.size(); ++i) - floating_scores[i]->draw(); +void +FlyingPlatform::action(float frame_ratio) +{ + // TODO: Remove if we're too far off the screen - for (unsigned int i = 0; i < upgrades.size(); ++i) - upgrades[i].draw(); +if(!move) + return; - for (unsigned int i = 0; i < bouncy_distros.size(); ++i) - bouncy_distros[i]->draw(); +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++; - for (unsigned int i = 0; i < broken_bricks.size(); ++i) - broken_bricks[i]->draw(); + 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 ObjectManager::actions() +void +FlyingPlatform::collision(const MovingObject&, int) { -/* - for (unsigned int i = 0; i < bouncy_distros.size(); i++) - bouncy_distros[i]->action(frame_ratio); - - for (unsigned int i = 0; i < broken_bricks.size(); i++) - broken_bricks[i]->action(frame_ratio); + // comes later +} - // Handle all kinds of game objects - for (unsigned int i = 0; i < bouncy_bricks.size(); i++) - bouncy_bricks[i]->action(frame_ratio); - - for (unsigned int i = 0; i < floating_scores.size(); i++) - floating_scores[i]->action(frame_ratio); +void +FlyingPlatform::collision(void *p_c_object, int c_object, CollisionType type) +{ +(void) p_c_object; +(void) type; - for (unsigned int i = 0; i < bullets.size(); ++i) - bullets[i].action(frame_ratio); - - for (unsigned int i = 0; i < upgrades.size(); i++) - upgrades[i].action(frame_ratio); +// Player* pplayer_c = NULL; + switch (c_object) + { + case CO_PLAYER: +// pplayer_c = (Player*) p_c_object; + move = true; - for (BadGuys::iterator i = bad_guys.begin(); i != bad_guys.end(); ++i) - (*i)->action(frame_ratio); + break; - for (Trampolines::iterator i = trampolines.begin(); i != trampolines.end(); ++i) - (*i)->action(frame_ratio); -*/ + default: + break; + + } } -/* EOF */ +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"); +}