X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Fstar.cpp;h=fb505b684094c3da07b3bc20cfa3405b91723cdb;hb=2e163cb10e0a6af504275585e7c31091931dd7b2;hp=e9090316e1f39800dd049ad708db4ed980870a62;hpb=c0093d25093395cb62fc2526ab42be65a9f015b8;p=supertux.git diff --git a/src/object/star.cpp b/src/object/star.cpp index e9090316e..fb505b684 100644 --- a/src/object/star.cpp +++ b/src/object/star.cpp @@ -1,76 +1,104 @@ -// $Id$ -// // SuperTux -// Copyright (C) 2005 Matthias Braun +// Copyright (C) 2006 Matthias Braun // -// 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 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 3 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 +// along with this program. If not, see . -#include "star.h" -#include "resources.h" -#include "player.h" -#include "player_status.h" -#include "sprite/sprite_manager.h" -#include "video/drawing_context.h" +#include "math/random_generator.hpp" +#include "object/player.hpp" +#include "object/sprite_particle.hpp" +#include "object/star.hpp" +#include "sprite/sprite.hpp" +#include "sprite/sprite_manager.hpp" +#include "supertux/object_factory.hpp" +#include "supertux/sector.hpp" -static const float INITIALJUMP = 400; -static const float SPEED = 150; -static const float JUMPSPEED = 300; +static const float INITIALJUMP = -400; +static const float STAR_SPEED = 150; +static const float JUMPSTAR_SPEED = -300; -Star::Star(const Vector& pos) +Star::Star(const Vector& pos, Direction direction) : + MovingSprite(pos, "images/powerups/star/star.sprite", LAYER_OBJECTS, COLGROUP_MOVING), + physic(), + light(0.0f,0.0f,0.0f), + lightsprite(SpriteManager::current()->create("images/objects/lightmap_light/lightmap_light-small.sprite")) { - bbox.set_pos(pos); - bbox.set_size(32, 32); - sprite = sprite_manager->create("star"); - physic.set_velocity(SPEED, INITIALJUMP); + physic.set_velocity((direction == LEFT) ? -STAR_SPEED : STAR_SPEED, INITIALJUMP); + //set light for glow effect + lightsprite->set_blend(Blend(GL_SRC_ALPHA, GL_ONE)); + lightsprite->set_color(Color(0.4f, 0.4f, 0.4f)); } -Star::~Star() +void +Star::update(float elapsed_time) { - delete sprite; + movement = physic.get_movement(elapsed_time); + + // when near Tux, spawn particles + Player* player = Sector::current()->get_nearest_player (this->get_bbox ()); + if (player) { + float disp_x = player->get_bbox().p1.x - bbox.p1.x; + float disp_y = player->get_bbox().p1.y - bbox.p1.y; + if (disp_x*disp_x + disp_y*disp_y <= 256*256) + { + if (graphicsRandom.rand(0, 2) == 0) { + float px = graphicsRandom.randf(bbox.p1.x+0, bbox.p2.x-0); + float py = graphicsRandom.randf(bbox.p1.y+0, bbox.p2.y-0); + Vector ppos = Vector(px, py); + Vector pspeed = Vector(0, 0); + Vector paccel = Vector(0, 0); + Sector::current()->add_object(std::make_shared( + "images/objects/particles/sparkle.sprite", + // draw bright sparkles when very close to Tux, dark sparkles when slightly further + (disp_x*disp_x + disp_y*disp_y <= 128*128) ? + // make every other a longer sparkle to make trail a bit fuzzy + (size_t(game_time*20)%2) ? "small" : "medium" : "dark", + ppos, ANCHOR_MIDDLE, pspeed, paccel, LAYER_OBJECTS+1+5)); + } + } + } } void -Star::action(float elapsed_time) -{ - movement = physic.get_movement(elapsed_time); +Star::draw(DrawingContext& context){ + //Draw the Sprite. + MovingSprite::draw(context); + //Draw the light when dark + context.get_light( get_bbox().get_middle(), &light ); + if (light.red + light.green + light.blue < 3.0){ + MovingSprite::draw(context); + context.push_target(); + context.set_target(DrawingContext::LIGHTMAP); + lightsprite->draw(context, get_bbox().get_middle(), 0); + context.pop_target(); + } } void -Star::draw(DrawingContext& context) +Star::collision_solid(const CollisionHit& hit) { - sprite->draw(context, get_pos(), LAYER_OBJECTS); + if(hit.bottom) { + physic.set_velocity_y(JUMPSTAR_SPEED); + } else if(hit.top) { + physic.set_velocity_y(0); + } else if(hit.left || hit.right) { + physic.set_velocity_x(-physic.get_velocity_x()); + } } HitResponse -Star::collision(GameObject& other, const CollisionHit& hit) +Star::collision(GameObject& other, const CollisionHit& ) { - if(other.get_flags() & FLAG_SOLID) { - if(hit.normal.y < -.5) { // ground - physic.set_velocity_y(JUMPSPEED); - } else if(hit.normal.y > .5) { // roof - physic.set_velocity_y(0); - } else { // bumped left or right - physic.set_velocity_x(-physic.get_velocity_x()); - } - - return CONTINUE; - } - Player* player = dynamic_cast (&other); if(player) { player->make_invincible(); @@ -81,3 +109,4 @@ Star::collision(GameObject& other, const CollisionHit& hit) return FORCE_MOVE; } +/* EOF */