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

📄 monstermanager.cpp

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