📄 bonus.cpp
字号:
/**
* File : Bonus.cpp
* Author : Kevin Lynx
* Date : 2007/8/1
*/
#include "stdafx.h"
#include "Bonus.h"
#include "Player.h"
#include "World.h"
////////////////////////////////////////////////////////////////////////////////////////////
//
// Bonus class
//
////////////////////////////////////////////////////////////////////////////////////////////
Bonus::Bonus( int bonusType ) :
Sprite( Sprite::ST_BONUS, 0, vector3df( 0, 0, 0 ) )
{
mBonusType = bonusType;
mExistTime = 0.0f;
}
Bonus::~Bonus()
{
}
bool Bonus::init( ISceneManager *smgr, IAnimatedMesh *mesh, const vector3df &pos )
{
if( Sprite::init( smgr, mesh, 0) )
{
setPosition( pos );
/// the resource is not good, so i should make some details
if( mBonusType == World::B_4_SIDES )
{
mNode->setScale( vector3df( 0.5f, 0.5f, 0.5f ));
mNode->setRotation( vector3df( 90, 0, 0 ));
const vector3df pos = mNode->getPosition();
this->setPosition( vector3df( pos.X, pos.Y + 20, pos.Z ) );
}
if( mBonusType == World::B_MONEY )
{
mNode->setScale( vector3df( 0.5f, 0.5f, 0.5f ) );
mNode->setRotation( vector3df( 0, 30, 30 ) );
}
if( mBonusType == World::B_SUPER_FIRE )
{
mNode->setRotation( vector3df(90, 30, 30 ) );
}
if( mBonusType == World::B_TIME )
{
mNode->setRotation( vector3df(90, 30, 30 ) );
}
if( mBonusType == World::B_LIFE )
{
mNode->setRotation( vector3df( 30, 30, 0 ) );
}
/// animator
ISceneNodeAnimator *anim = smgr->createFlyCircleAnimator(
this->getPosition(), 5, 0.005f, vector3df( 1, 0, 0 ) );
mNode->addAnimator( anim );
anim->drop();
return true;
}
else
{
return false;
}
}
bool Bonus::collision( const aabbox3df &box )
{
return Sprite::getWorldAABB().intersectsWithBox( box );
}
const vector3df Bonus::getExpPosition()
{
const vector3df pos = getPosition();
return vector3df( pos.X, pos.Y + 20, pos.Z );
}
void Bonus::update( float dt )
{
mExistTime += dt;
}
bool Bonus::disappear()
{
return mExistTime > BONUS_EXIST_TIME;
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// BonusManager class
//
////////////////////////////////////////////////////////////////////////////////////////////
BonusManager::BonusManager( IrrlichtDevice *device )
{
mDevice = device;
}
BonusManager::~BonusManager()
{
release();
}
bool BonusManager::init()
{
reset();
return true;
}
void BonusManager::release()
{
for( tBonuses::iterator it = mBonuses.begin();
it != mBonuses.end();
++ it )
{
delete *it;
}
mBonuses.clear();
}
void BonusManager::reset()
{
release();
}
void BonusManager::update( float dt )
{
for( tBonuses::iterator it = mBonuses.begin();
it != mBonuses.end();
++ it )
{
(*it)->update( dt );
if( (*it)->disappear() )
{
/// the bonus will disappear
delete *it;
it = mBonuses.erase( it );
}
}
}
bool BonusManager::checkPlayer( Player *player )
{
aabbox3df box = player->getWorldAABB();
for( tBonuses::iterator it = mBonuses.begin();
it != mBonuses.end();
++ it )
{
if( (*it)->collision( box ) )
{
/// the player got a bonus
Player::GetSingletonPtr()->sendBonus( (*it)->mBonusType );
delete *it;
it = mBonuses.erase( it );
return true;
}
}
return false;
}
void BonusManager::createBonus( const vector3df &pos )
{
if( rand() % 100 < 60 )
{
return ;
}
int type = rand() % 100;
if( type >= 0 && type < 40 )
{
type = World::B_MONEY;
}
if( type >= 40 && type < 60 )
{
type = World::B_TIME;
}
if( type >= 60 && type < 80 )
{
type = World::B_SUPER_FIRE ;
}
if( type >= 80 && type < 90 )
{
type = World::B_4_SIDES;
}
if( type >= 90 && type < 100 )
{
type = World::B_LIFE ;
}
IAnimatedMesh *mesh = 0;
if( !World::GetSingletonPtr()->getBonusRes( type, mesh ) )
{
return ;
}
Bonus *newBonus = new Bonus( type );
newBonus->init( mDevice->getSceneManager(), mesh, pos );
mBonuses.push_back( newBonus );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -