⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bonus.cpp

📁 吃豆子游戏源码
💻 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 + -