?? bullet.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()
{
}
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 + -