Fixed compilation problems.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@11072 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk 2012-04-01 23:17:45 +00:00
parent 161be4d3bd
commit ee35086d20
3 changed files with 0 additions and 361 deletions

View File

@ -103,7 +103,6 @@ src/karts/controller/new_ai_controller.cpp
src/karts/controller/player_controller.cpp
src/karts/explosion_animation.cpp
src/karts/ghost_kart.cpp
src/karts/kart_animation.cpp
src/karts/kart.cpp
src/karts/kart_gfx.cpp
src/karts/kart_model.cpp
@ -347,7 +346,6 @@ src/karts/controller/new_ai_controller.hpp
src/karts/controller/player_controller.hpp
src/karts/explosion_animation.hpp
src/karts/ghost_kart.hpp
src/karts/kart_animation.hpp
src/karts/kart_gfx.hpp
src/karts/kart.hpp
src/karts/kart_model.hpp

View File

@ -1,267 +0,0 @@
//
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2010 Joerg Henrichs
//
// 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 "karts/kart_animation.hpp"
#include "graphics/camera.hpp"
#include "graphics/referee.hpp"
#include "graphics/stars.hpp"
#include "items/attachment.hpp"
#include "karts/kart.hpp"
#include "modes/world.hpp"
#include "modes/three_strikes_battle.hpp"
#include "physics/btKart.hpp"
#include "tracks/track.hpp"
#include "utils/constants.hpp"
/** The constructor stores a pointer to the kart this object is animating,
* and initialised the timer.
* \param kart Pointer to the kart which is animated.
*/
KartAnimation::KartAnimation(Kart *kart)
: I_KartAnimation(kart)
{
m_stars_effect = NULL;
m_referee = NULL;
m_kart = kart;
// Setting kart mode here is important! If the mode should be rescue when
// reset() is called, it is assumed that this was triggered by a restart,
// and that the vehicle must be added back to the physics world. Since
// reset() is also called at the very start, it must be guaranteed that
// rescue is not set.
m_kart_mode = KA_NONE;
}; // KartAnimation
//-----------------------------------------------------------------------------
KartAnimation::~KartAnimation()
{
if(m_stars_effect)
delete m_stars_effect;
} // ~KartAnimation
//-----------------------------------------------------------------------------
/** Resets all data at the beginning of a race.
*/
void KartAnimation::reset()
{
// Create the stars effect in the first reset
if(!m_stars_effect)
m_stars_effect =
new Stars(m_kart->getNode(),
core::vector3df(0.0f,
m_kart->getKartModel()->getModel()
->getBoundingBox().MaxEdge.Y,
0.0f) );
// Reset star effect in case that it is currently being shown.
m_stars_effect->reset();
// Note that this will only add the kart if it's not already
// in the world.
World::getWorld()->getPhysics()->addKart(m_kart);
m_timer = 0;
m_kart_mode = KA_NONE;
if(m_referee)
{
delete m_referee;
m_referee = NULL;
}
} // reset
//-----------------------------------------------------------------------------
/** Sets the mode of the kart to being rescued, attaches the rescue model
* and saves the current pitch and roll (for the rescue animation). It
* also removes the kart from the physics world.
*/
void KartAnimation::rescue(bool is_auto_rescue)
{
if(getKartAnimation()) return;
assert(!m_referee);
m_referee = new Referee(*m_kart);
m_kart->getNode()->addChild(m_referee->getSceneNode());
m_kart_mode = KA_RESCUE;
m_timer = m_kart->getKartProperties()->getRescueTime();
m_velocity = m_kart->getKartProperties()->getRescueHeight() / m_timer;
m_xyz = m_kart->getXYZ();
m_kart->getAttachment()->clear();
m_curr_rotation.setPitch(m_kart->getPitch());
m_curr_rotation.setRoll(m_kart->getRoll() );
m_curr_rotation.setHeading(0);
m_add_rotation = -m_curr_rotation/m_timer;
m_curr_rotation.setHeading(m_kart->getHeading());
World::getWorld()->getPhysics()->removeKart(m_kart);
// Add a hit unless it was auto-rescue
if(race_manager->getMinorMode()==RaceManager::MINOR_MODE_3_STRIKES &&
!is_auto_rescue)
{
ThreeStrikesBattle *world=(ThreeStrikesBattle*)World::getWorld();
world->kartHit(m_kart->getWorldKartId());
}
} // rescue
//-----------------------------------------------------------------------------
/** Starts an explosion animation.
* \param pos The coordinates of the explosion.
* \param direct_hig True if the kart was hit directly --> maximal impact.
*/
void KartAnimation::explode(const Vec3 &pos, bool direct_hit)
{
// Avoid doing another explosion while a kart is thrown around in the air.
if(playingAnimation())
return;
if(m_kart->isInvulnerable())
return;
m_xyz = m_kart->getXYZ();
// Ignore explosion that are too far away.
float r = m_kart->getKartProperties()->getExplosionRadius();
if(!direct_hit && pos.distance2(m_xyz)>r*r) return;
m_kart->playCustomSFX(SFXManager::CUSTOM_EXPLODE);
m_kart_mode = KA_EXPLOSION;
m_timer = m_kart->getKartProperties()->getExplosionTime();;
// Non-direct hits will be only affected half as much.
if(!direct_hit) m_timer*=0.5f;
// Half of the overall time is spent in raising, so only use
// half of the explosion time here.
// Velocity after t seconds is:
// v(t) = m_velocity + t*gravity
// Since v(explosion_time*0.5) = 0, the following forumla computes
// the right initial velocity for a kart to land back after
// the specified time.
m_velocity = 0.5f * m_timer * World::getWorld()->getTrack()->getGravity();
World::getWorld()->getPhysics()->removeKart(m_kart);
m_curr_rotation.setHeading(m_kart->getHeading());
m_curr_rotation.setPitch(m_kart->getPitch());
m_curr_rotation.setRoll(m_kart->getRoll());
const int max_rotation = direct_hit ? 2 : 1;
// To get rotations in both directions for each axis we determine a random
// number between -(max_rotation-1) and +(max_rotation-1)
float f=2.0f*M_PI/m_timer;
m_add_rotation.setHeading( (rand()%(2*max_rotation+1)-max_rotation)*f );
m_add_rotation.setPitch( (rand()%(2*max_rotation+1)-max_rotation)*f );
m_add_rotation.setRoll( (rand()%(2*max_rotation+1)-max_rotation)*f );
// Set invulnerable time, and graphical effects
float t = m_kart->getKartProperties()->getExplosionInvulnerabilityTime();
m_kart->setInvulnerableTime(t);
if ( UserConfigParams::m_graphical_effects )
{
m_stars_effect->showFor(t);
}
m_kart->getAttachment()->clear();
} // explode
// ----------------------------------------------------------------------------
/** Flies a kart to a given point with a specified speed. The physical body
* will be removed, and only the kart animation/interpolation will be shown.
* \param target Target coordinates.
* \param speed Speed to use.
*/
void KartAnimation::shootTo(const Vec3 &target, float speed)
{
m_xyz = m_kart->getXYZ();
m_kart_mode = KA_SHOOTING;
assert(speed>0);
Vec3 delta = target-m_kart->getXYZ();
m_timer = delta.length()/speed;
m_velocity = delta/m_timer;
World::getWorld()->getPhysics()->removeKart(m_kart);
m_curr_rotation.setHeading(m_kart->getHeading());
m_curr_rotation.setPitch(m_kart->getPitch());
m_curr_rotation.setRoll(m_kart->getRoll());
m_add_rotation.setHeading(0);
m_add_rotation.setPitch( 0);
m_add_rotation.setRoll( 0);
} // shootTo
// ----------------------------------------------------------------------------
/** Updates the kart animation.
* \param dt Time step size.
* \return True if the explosion is still shown, false if it has finished.
*/
void KartAnimation::update(float dt)
{
if ( UserConfigParams::m_graphical_effects )
{
// update star effect (call will do nothing if stars are not activated)
m_stars_effect->update(dt);
}
if(!playingAnimation()) return;
// See if the timer expires, if so return the kart to normal game play
m_timer -= dt;
if(m_timer<0)
{
if(m_kart_mode==KA_RESCUE)
{
World::getWorld()->moveKartAfterRescue(m_kart);
m_kart->getNode()->removeChild(m_referee->getSceneNode());
delete m_referee;
m_referee = NULL;
}
if(m_kart_mode==KA_SHOOTING)
{
btTransform trans = m_kart->getTrans();
trans.setOrigin(m_xyz);
m_kart->setTrans(trans);
m_kart->getBody()->setCenterOfMassTransform(trans);
}
else
{
m_kart->getBody()->setLinearVelocity(btVector3(0,0,0));
m_kart->getBody()->setAngularVelocity(btVector3(0,0,0));
}
World::getWorld()->getPhysics()->addKart(m_kart);
m_kart_mode = KA_NONE;
if(m_kart->getCamera() && m_kart->getCamera()->getMode() != Camera::CM_FINAL)
m_kart->getCamera()->setMode(Camera::CM_NORMAL);
return;
}
// Explosions change the upwards velocity:
if ( m_kart_mode==KA_EXPLOSION)
{
m_velocity -= Vec3(0,1,0)
* ( dt*World::getWorld()->getTrack()->getGravity() );
}
m_xyz += dt*m_velocity;
m_kart->setXYZ(m_xyz);
m_curr_rotation += dt*m_add_rotation;
btQuaternion q(m_curr_rotation.getHeading(), m_curr_rotation.getPitch(),
m_curr_rotation.getRoll());
m_kart->setRotation(q);
} // update

View File

@ -1,92 +0,0 @@
//
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2010 Joerg Henrichs
//
// 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.
#ifndef HEADER_KART_ANIMATION_HPP
#define HEADER_KART_ANIMATION_HPP
#include "karts/i_kart_animation.hpp"
#include "utils/vec3.hpp"
class Kart;
class Referee;
class Stars;
/**
* \brief This class is a 'mixin' for kart, and handles the animated explosion.
* I.e. it will throw the kart a certain amount in the air, rotate it
* randomly, and after the specified time period let it land at the
* same spot where it was hit, therefore avoiding any problems of
* karts being pushed on wrong parts of the track, and making explosion
* more 'fair' (it can't happen that one explosion give you actually
* a benefit by pushing you forwards.
* The object is a base class for kart, but will only be used if an
* explosion happens.
* \ingroup karts
*/
class KartAnimation: public I_KartAnimation
{
protected:
/** The coordinates where the kart was hit originally. */
Vec3 m_xyz;
/** The kart's current rotation. */
Vec3 m_curr_rotation;
/** The artificial rotation to toss the kart around. It's in units
* of rotation per second. */
Vec3 m_add_rotation;
/** The velocity with which the kart is moved. */
Vec3 m_velocity;
/** Timer for the explosion. */
float m_timer;
/** Duration for this explosion. This can potentially be set
* with different values for different karts, or depending
* on difficulty (so that on easy you can drive again earlier. */
float m_duration;
/** A pointer to the class to which this object belongs. */
Kart *m_kart;
/** For stars rotating around head effect */
Stars *m_stars_effect;
/** The referee during a rescue operation. */
Referee *m_referee;
/** Different kart modes: normal racing, being rescued, showing end
* animation, explosions, kart eliminated, shooting. */
enum {KA_NONE, KA_RESCUE, KA_EXPLOSION, KA_SHOOTING}
m_kart_mode;
public:
KartAnimation(Kart *kart);
virtual ~KartAnimation();
void reset();
virtual void explode(const Vec3& pos, bool direct_hit);
virtual void rescue(bool is_auto_rescue=false);
virtual void shootTo(const Vec3 &target, float speed);
void update(float dt);
void eliminate();
// ------------------------------------------------------------------------
/** Returns a pointer to the stars effect. */
const Stars *getStarEffect () const {return m_stars_effect; }
}; // KartAnimationAll
#endif