📄 monstermanager.cpp
字号:
/**
* File : MonsterManager.cpp
* Author : Kevin Lynx
* Date : 2007/7/31
*/
#include "stdafx.h"
#include "World.h"
#include "Player.h"
#include "Monster.h"
#include "MonsterManager.h"
#include "Bullet.h"
#include "Effect.h"
#include "ResourceMgr.h"
#include "SoundManager.h"
MonsterManager::MonsterManager( IrrlichtDevice *device )
{
mDevice = device;
}
MonsterManager::~MonsterManager()
{
release();
}
void MonsterManager::release()
{
for( tAliveMonsters::iterator it = mAliveMonsters.begin();
it != mAliveMonsters.end();
++ it )
{
delete (*it);
}
mAliveMonsters.clear();
mDeadMonsters.clear();
}
bool MonsterManager::init( FILE *fp )
{
release();
const float y = 30; /// should be adjusted
int count;
float x, z;
int ax, az;
int type;
World *world = World::GetSingletonPtr();
fscanf( fp, "%d", &count );
for( int i = 0; i < count; ++ i )
{
fscanf( fp, "%d%d%d", &ax, &az, &type );
world->mapToWorld( ax, az, x, z );
/// adjust the coordinate to the center
x += world->mStoneSize.Width / 2;
z -= world->mStoneSize.Height / 2;
/// create a monster
createMonster( type, vector3df( x, y, z ) );
}
return true;
}
void MonsterManager::createMonster( int type, const vector3df &pos )
{
IAnimatedMesh *mesh = 0;
ITexture *texture = 0;
if( World::GetSingletonPtr()->getMonsterRes( type, mesh, texture ) )
{
Monster *newMon = new Monster( type );
newMon->init( mDevice->getSceneManager(), mesh, texture );
newMon->setPosition( pos );
/// store the monster
mAliveMonsters.push_back( newMon );
}
}
bool MonsterManager::checkPlayer( Player *player )
{
for( tAliveMonsters::iterator it = mAliveMonsters.begin();
it != mAliveMonsters.end();
++ it )
{
if( !(*it)->isNormalStatus() )
continue;
aabbox3df box1 = (*it)->getWorldAABB();
aabbox3df box2 = player->getWorldAABB();
if( player->getWorldAABB().intersectsWithBox( (*it)->getWorldAABB() ) )
{
return true;
}
}
return false;
}
void MonsterManager::recordDead( int type )
{
}
void MonsterManager::update( float dt )
{
BulletManager *bmgr = BulletManager::GetSingletonPtr();
for( tAliveMonsters::iterator it = mAliveMonsters.begin();
it != mAliveMonsters.end();
++ it )
{
(*it)->update( dt );
if( !(*it)->isNormalStatus() )
continue;
/// collision check with monsters and player bullets
bmgr->beginCheckPlayerBullet();
Bullet *bullet = bmgr->getCurrentPlayerBullet();
while( bullet != 0 )
{
if( bullet->collision( (*it)->getWorldAABB() ) )
{
/// add a sound effect
SoundManager::GetSingletonPtr()->playSound( SoundManager::SND_DEATH_2,
(*it)->getExpPosition() );
/// add the player's score
Player::GetSingletonPtr()->addScore( (*it)->mAddScore );
/// decress the monster's hp
(*it)->hurt( bullet->mDamage );
/// the monster is shoot by the player
bmgr->delCurrentPlayerBullet();
/// if the monster is not dead, create exp1
/// if dead , create exp2
EffectManager::GetSingletonPtr()->createExp( ResourceMgr::EXP_HURT_SPRITE,
(*it)->getExpPosition() );
cout << "The monster was SHOOT!" << endl;
}
else
{
bmgr->advanceCurrentPlayerBullet();
}
bullet = bmgr->getCurrentPlayerBullet();
}//end if
}// end for
}
void MonsterManager::killAll()
{
for( tAliveMonsters::iterator it = mAliveMonsters.begin();
it != mAliveMonsters.end();
++ it )
{
Player::GetSingletonPtr()->addScore( (*it)->mAddScore );
EffectManager::GetSingletonPtr()->createExp( ResourceMgr::EXP_HURT_SPRITE,
(*it)->getExpPosition() );
(*it)->hurt( Monster::MONSTER_MAX_HP );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -