X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fspecial.cpp;h=227251270a904b90f0e7808280da9dd5e2d205cd;hb=63934f5f4c15f059c9b60499575870ebb7c923a0;hp=ff1db1343e6d2cf84e94d751127d3f954924c973;hpb=73f0a062817f8ec1276aff4cc1428609672ab98d;p=supertux.git diff --git a/src/special.cpp b/src/special.cpp index ff1db1343..227251270 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -1,15 +1,23 @@ +// $Id$ // -// C Implementation: special +// SuperTux - A Jump'n Run +// Copyright (C) 2003 Tobias Glaesser // -// Description: -// -// -// Author: Tobias Glaesser & Bill Kendrick, (C) 2004 -// -// Copyright: See COPYING file that comes with this distribution +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. // +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +#include #include "SDL.h" #include "defines.h" #include "special.h" @@ -19,19 +27,20 @@ #include "scene.h" #include "globals.h" #include "player.h" +#include "sprite_manager.h" #include "resources.h" -texture_type img_bullet; -texture_type img_golden_herring; -bitmask* bm_bullet; +Surface* img_bullet; -void create_special_bitmasks() -{ - bm_bullet = bitmask_create_SDL(img_bullet.sdl_surface); -} +Sprite* img_star; +Sprite* img_growup; +Sprite* img_iceflower; +Sprite* img_1up; + +#define GROWUP_SPEED 1.0f void -Bullet::init(float x, float y, float xm, int dir) +Bullet::init(float x, float y, float xm, Direction dir) { base.width = 4; base.height = 4; @@ -53,7 +62,22 @@ Bullet::init(float x, float y, float xm, int dir) } void -Bullet::action() +Bullet::remove_me() +{ + std::vector& bullets = World::current()->bullets; + for(std::vector::iterator i = bullets.begin(); + i != bullets.end(); ++i) { + if( & (*i) == this) { + bullets.erase(i); + return; + } + } + + assert(false); +} + +void +Bullet::action(double frame_ratio) { base.x = base.x + base.xm * frame_ratio; base.y = base.y + base.ym * frame_ratio; @@ -75,7 +99,7 @@ Bullet::action() issolid(base.x + 4, base.y + 2) || issolid(base.x, base.y + 2)) { - World::current()->bullets.erase(static_cast::iterator>(this)); + remove_me(); } } @@ -86,7 +110,7 @@ Bullet::draw() if (base.x >= scroll_x - base.width && base.x <= scroll_x + screen->w) { - texture_draw(&img_bullet, base.x - scroll_x, base.y, 255, + img_bullet->draw( base.x - scroll_x, base.y, 255, NO_UPDATE); } } @@ -95,101 +119,113 @@ void Bullet::collision(int c_object) { if(c_object == CO_BADGUY) { - std::vector::iterator i; - - for(i = World::current()->bullets.begin(); i != World::current()->bullets.end(); ++i) - { - if(&(*i) == this) - { - World::current()->bullets.erase(i); - return; - } - } + remove_me(); } } void -Upgrade::init(float x_, float y_, int dir_, int kind_) +Upgrade::init(float x_, float y_, Direction dir_, UpgradeKind kind_) { + kind = kind_; + dir = dir_; + base.width = 32; base.height = 0; - kind = kind_; base.x = x_; base.y = y_; + old_base = base; - if(dir_ == LEFT) - base.xm = -2; - else - base.xm = 2; + physic.reset(); + physic.enable_gravity(false); + + if(kind == UPGRADE_1UP || kind == UPGRADE_HERRING) { + physic.set_velocity(dir == LEFT ? -1 : 1, 4); + physic.enable_gravity(true); + base.height = 32; + } else if (kind == UPGRADE_ICEFLOWER) { + // nothing + } else if (kind == UPGRADE_GROWUP) { + physic.set_velocity(dir == LEFT ? -GROWUP_SPEED : GROWUP_SPEED, 0); + } else { + physic.set_velocity(dir == LEFT ? -2 : 2, 0); + } +} - base.ym = -2; - base.height = 0; - old_base = base; +void +Upgrade::remove_me() +{ + std::vector& upgrades = World::current()->upgrades; + for(std::vector::iterator i = upgrades.begin(); + i != upgrades.end(); ++i) { + if( & (*i) == this) { + upgrades.erase(i); + return; + } + } + + assert(false); } void -Upgrade::action() +Upgrade::action(double frame_ratio) { - if (base.height < 32) - { + if (kind == UPGRADE_ICEFLOWER || kind == UPGRADE_GROWUP) { + if (base.height < 32) { /* Rise up! */ - base.height = base.height + 0.7 * frame_ratio; if(base.height > 32) base.height = 32; - } - else - { - /* Move around? */ - - if (kind == UPGRADE_MINTS || - kind == UPGRADE_HERRING) - { - base.x = base.x + base.xm * frame_ratio; - base.y = base.y + base.ym * frame_ratio; - collision_swept_object_map(&old_base,&base); - - /* Off the screen? Kill it! */ + return; + } + } - if (base.x < scroll_x - base.width) - World::current()->upgrades.erase(static_cast::iterator>(this)); - if (base.y > screen->h) - World::current()->upgrades.erase(static_cast::iterator>(this)); + /* Off screen? Kill it! */ + if(base.x < scroll_x - base.width || base.y > screen->h) { + remove_me(); + return; + } - if (issolid(base.x + 1, base.y + 32.) || - issolid(base.x + 31., base.y + 32.)) - { - if (base.ym > 0) - { - if (kind == UPGRADE_MINTS) - { - base.ym = 0; - } - else if (kind == UPGRADE_HERRING) - { - base.ym = -8; - } - - base.y = (int)(base.y / 32) * 32; - } - } - else - base.ym = base.ym + GRAVITY * frame_ratio; + /* Move around? */ + physic.apply(frame_ratio, base.x, base.y); + if(kind == UPGRADE_GROWUP) { + collision_swept_object_map(&old_base, &base); + } - if (issolid(base.x - 1, (int) base.y)) - { - if(base.xm < 0) - base.xm = -base.xm; - } - else if (issolid(base.x + base.width, (int) base.y)) - { - if(base.xm > 0) - base.xm = -base.xm; - } + // fall down? + if(kind == UPGRADE_GROWUP || kind == UPGRADE_HERRING) { + // falling? + if(physic.get_velocity_y() != 0) { + if(issolid(base.x, base.y + base.height)) { + base.y = int(base.y / 32) * 32; + old_base = base; + if(kind == UPGRADE_GROWUP) { + physic.enable_gravity(false); + physic.set_velocity(dir == LEFT ? -GROWUP_SPEED : GROWUP_SPEED, 0); + } else if(kind == UPGRADE_HERRING) { + physic.set_velocity(dir == LEFT ? -2 : 2, 3); } + } + } else { + if((physic.get_velocity_x() < 0 + && !issolid(base.x+base.width, base.y + base.height)) + || (physic.get_velocity_x() > 0 + && !issolid(base.x, base.y + base.height))) { + physic.enable_gravity(true); + } + } + } + // horizontal bounce? + if(kind == UPGRADE_GROWUP || kind == UPGRADE_HERRING) { + if ( (physic.get_velocity_x() < 0 + && issolid(base.x, (int) base.y + base.height/2)) + || (physic.get_velocity_x() > 0 + && issolid(base.x + base.width, (int) base.y + base.height/2))) { + physic.set_velocity(-physic.get_velocity_x(),physic.get_velocity_y()); + dir = dir == LEFT ? RIGHT : LEFT; } + } } void @@ -205,30 +241,36 @@ Upgrade::draw() dest.w = 32; dest.h = (int)base.height; - if (kind == UPGRADE_MINTS) - texture_draw_part(&img_mints,0,0,dest.x,dest.y,dest.w,dest.h); - else if (kind == UPGRADE_COFFEE) - texture_draw_part(&img_coffee,0,0,dest.x,dest.y,dest.w,dest.h); + if (kind == UPGRADE_GROWUP) + img_growup->draw_part(0,0,dest.x,dest.y,dest.w,dest.h); + else if (kind == UPGRADE_ICEFLOWER) + img_iceflower->draw_part(0,0,dest.x,dest.y,dest.w,dest.h); else if (kind == UPGRADE_HERRING) - texture_draw_part(&img_golden_herring,0,0,dest.x,dest.y,dest.w,dest.h); + img_star->draw_part(0,0,dest.x,dest.y,dest.w,dest.h); + else if (kind == UPGRADE_1UP) + img_1up->draw_part( 0, 0, dest.x, dest.y, dest.w, dest.h); } else { - if (kind == UPGRADE_MINTS) + if (kind == UPGRADE_GROWUP) { - texture_draw(&img_mints, + img_growup->draw( base.x - scroll_x, base.y); } - else if (kind == UPGRADE_COFFEE) + else if (kind == UPGRADE_ICEFLOWER) { - texture_draw(&img_coffee, + img_iceflower->draw( base.x - scroll_x, base.y); } else if (kind == UPGRADE_HERRING) { - texture_draw(&img_golden_herring, + img_star->draw( base.x - scroll_x, base.y); } + else if (kind == UPGRADE_1UP) + { + img_1up->draw( base.x - scroll_x, base.y); + } } } @@ -245,11 +287,9 @@ Upgrade::collision(void* p_c_object, int c_object) /* p_c_object is CO_PLAYER, so assign it to pplayer */ pplayer = (Player*) p_c_object; - World::current()->upgrades.erase(static_cast::iterator>(this)); - /* Affect the player: */ - if (kind == UPGRADE_MINTS) + if (kind == UPGRADE_GROWUP) { play_sound(sounds[SND_EXCELLENT], SOUND_CENTER_SPEAKER); pplayer->size = BIG; @@ -261,19 +301,16 @@ Upgrade::collision(void* p_c_object, int c_object) pplayer->base.y += 32; pplayer->duck = true; } - timer_start(&super_bkgd_timer, 350); } - else if (kind == UPGRADE_COFFEE) + else if (kind == UPGRADE_ICEFLOWER) { play_sound(sounds[SND_COFFEE], SOUND_CENTER_SPEAKER); pplayer->got_coffee = true; - timer_start(&super_bkgd_timer, 250); } else if (kind == UPGRADE_HERRING) { play_sound(sounds[SND_HERRING], SOUND_CENTER_SPEAKER); - timer_start(&pplayer->invincible_timer,TUX_INVINCIBLE_TIME); - timer_start(&super_bkgd_timer, 250); + pplayer->invincible_timer.start(TUX_INVINCIBLE_TIME); /* play the herring song ^^ */ if (get_current_music() != HURRYUP_MUSIC) { @@ -281,7 +318,32 @@ Upgrade::collision(void* p_c_object, int c_object) play_current_music(); } } - break; + else if (kind == UPGRADE_1UP) + { + if(player_status.lives < MAX_LIVES) { + player_status.lives++; + play_sound(sounds[SND_LIFEUP], SOUND_CENTER_SPEAKER); + } + } + + remove_me(); + return; } } +void load_special_gfx() +{ + img_growup = sprite_manager->load("egg"); + img_iceflower = sprite_manager->load("iceflower"); + img_star = sprite_manager->load("star"); + img_1up = sprite_manager->load("1up"); + + img_bullet = new Surface(datadir + "/images/shared/bullet.png", + USE_ALPHA); +} + +void free_special_gfx() +{ + delete img_bullet; +} +