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

📄 bullet.cpp

📁 吃豆子游戏源码
💻 CPP
字号:
/**
 *	File	:	Bullet.cpp
 *  Author	:	Kevin Lynx
 *	Date	:	2007/8/1
 */
#include "stdafx.h"
#include "Bullet.h"
#include "World.h"
#include "ResourceMgr.h"
#include "Player.h"
#include "Effect.h"
#include "SoundManager.h"

////////////////////////////////////////////////////////////////////////////////////////////
//
//	Bullet class
//
////////////////////////////////////////////////////////////////////////////////////////////
Bullet::Bullet( vector3df dir ) :
	Sprite( Sprite::ST_BULLET, DEFAULT_BULLET_SPEED, dir )
{
	mDamage = BulletManager::BD_DAMAGE ;
}

Bullet::~Bullet()
{
}

bool	Bullet::collision( const aabbox3df &box )
{
	return Sprite::getWorldAABB().intersectsWithBox( box );
}

void	Bullet::update( float dt )
{
	Sprite::move( dt );
}

bool	Bullet::isFireStone()
{
	return mCollResult > 0 && mCollResult < World::STONE_COUNT ;
}

const vector3df Bullet::getExpPosition()
{
	const vector3df pos = getPosition();
	return vector3df( pos.X, pos.Y + 40, pos.Z );
}

////////////////////////////////////////////////////////////////////////////////////////////
//
//	BulletManager class
//
////////////////////////////////////////////////////////////////////////////////////////////
BulletManager::BulletManager( IrrlichtDevice *device )
{
	mDevice = device;
}

BulletManager::~BulletManager()
{
	release();
}

bool	BulletManager::init()
{
	reset();
	return true;
}

void	BulletManager::release()
{
	for( tBullets::iterator it = mPlayerBullets.begin();
		 it != mPlayerBullets.end();
		 ++ it )
	{
		delete *it;
	}
	for( tBullets::iterator it = mMonsterBullets.begin();
		 it != mMonsterBullets.end();
		 ++ it )
	{
		delete *it;
	}

	mPlayerBullets.clear();
	mMonsterBullets.clear();
}

void	BulletManager::reset()
{
	release();
	mCurPlayerBullet = mPlayerBullets.begin();
}

void	BulletManager::update( float dt )
{
	for( tBullets::iterator it = mPlayerBullets.begin();
		 it != mPlayerBullets.end();
		 ++ it )
	{
		(*it)->update( dt );

		if( (*it)->isFireStone() ||
			World::GetSingletonPtr()->isOutOfWorld( (*it)->getXZRect() ) )
		{
			//fire on a stone, it will destroy the stone, and 
			//destroy the bullet
			//make an effect first
				
			SoundManager::GetSingletonPtr()->playSound( SoundManager::SND_EXPLODE,
				(*it)->getExpPosition() ); 

			EffectManager::GetSingletonPtr()->createExp( ResourceMgr::EXP_STONE, 
				(*it)->getExpPosition() );

			delete *it;
			it = mPlayerBullets.erase( it );
		}
	}

	for( tBullets::iterator it = mMonsterBullets.begin();
		 it != mMonsterBullets.end();
		 ++ it )
	{
		(*it)->update( dt );

		if( (*it)->isFireStone() ||
			World::GetSingletonPtr()->isOutOfWorld( (*it)->getXZRect() ))
		{
			//fire on a stone, it will destroy the stone, and 
			//destroy the bullet
			//make an effect first
			SoundManager::GetSingletonPtr()->playSound( SoundManager::SND_EXPLODE, 
				(*it)->getExpPosition() ); 

			EffectManager::GetSingletonPtr()->createExp( ResourceMgr::EXP_STONE, 
				(*it)->getExpPosition() );

			delete *it;
			it = mMonsterBullets.erase( it );
		}
	}

}

bool	BulletManager::checkPlayer( Player *player )
{
	aabbox3df box = player->getWorldAABB();

	for( tBullets::iterator it = mMonsterBullets.begin();
		 it != mMonsterBullets.end();
		 ++ it )
	{
		if( (*it)->collision( box ) )
		{
			/// the player was shoot
			delete *it;
			it = mMonsterBullets.erase( it );

			return true;
		}
	}	

	return false;
}

Bullet	*BulletManager::createBullet( const vector3df &pos, vector3df dir )
{
	Bullet *newBullet = new Bullet( dir );
	newBullet->init( mDevice->getSceneManager(), ResourceMgr::GetSingletonPtr()->mBulletMesh, 0 );
	newBullet->setPosition( pos );

	return newBullet;
}

void	BulletManager::createPlayerBullet( const vector3df &pos, vector3df dir )
{
	mPlayerBullets.push_back( createBullet( pos, dir ) );
}

void	BulletManager::createMonsterBullet( const vector3df &pos, vector3df dir )
{
	mMonsterBullets.push_back( createBullet( pos, dir ) );
}

void	BulletManager::beginCheckPlayerBullet()
{
	mCurPlayerBullet = mPlayerBullets.begin();
}

Bullet *BulletManager::getCurrentPlayerBullet()
{
	if( mCurPlayerBullet == mPlayerBullets.end() )
	{
		mCurPlayerBullet = mPlayerBullets.begin();
		return NULL;
	}
	else
	{
		Bullet *bullet = *mCurPlayerBullet;
		return bullet;
	}
}

void	BulletManager::delCurrentPlayerBullet()
{
	if( mCurPlayerBullet != mPlayerBullets.end() )
	{
		delete *mCurPlayerBullet;
		mCurPlayerBullet = mPlayerBullets.erase( mCurPlayerBullet );
	}
}

void	BulletManager::advanceCurrentPlayerBullet()
{
	if( mCurPlayerBullet != mPlayerBullets.end() )
	{
		mCurPlayerBullet ++;
	}
}

int 	BulletManager::getPlayerBulletCount()
{
	return (int)mPlayerBullets.size();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -