www.pudn.com > ATimeToKill.rar > world.cpp


#include "world.h" 
 
CWorld::CWorld() 
{ 
	terrain = new CTerrain(32, 0.5); 
} 
 
CWorld::~CWorld() 
{ 
	audioSystem->Shutdown(); 
 
	delete gui; 
	delete terrain; 
	delete audioSystem; 
	delete worldSound; 
 
	gui = NULL; 
	terrain = NULL; 
	audioSystem = NULL; 
	worldSound = NULL; 
} 
 
CWorld::CWorld(CCamera *c) 
{ 
	camera = c; 
	terrain = new CTerrain(32, 1.0f); 
	player = new CPlayer; 
	audioSystem = new CAudioSystem; 
	gui = new CGUI; 
 
	gameDone = false;		// game is just starting 
 
	audioSystem->InitDirectXAudio(NULL); 
 
	player->AttachTo(terrain); 
	player->SetCamera(camera); 
	player->SetTerrain(terrain); 
 
	worldSound = audioSystem->Create("ambient.wav", false); 
	audioSystem->Play(worldSound, DMUS_SEG_REPEAT_INFINITE); 
 
	player->SetAudioSystem(audioSystem); 
 
	LoadWorld(); 
	timeStart = 300.0;			// 300 seconds = 5 minutes 
	timeElapsed = 0.0; 
	gui->SetCurrentTime(timeStart); 
	gui->SetEnemiesLeft(numOgros + numSods); 
} 
 
void CWorld::Animate(float deltaTime) 
{ 
	// set camera height based on player position on terrain 
	camera->position.y = terrain->GetHeight(camera->position.x, camera->position.z) + player->size; 
 
	if (camera->position.x <= terrain->GetScanDepth()) 
		camera->position.x = terrain->GetScanDepth(); 
	if (camera->position.x >= terrain->GetWidth()*terrain->GetMul() - terrain->GetScanDepth()) 
		camera->position.x = terrain->GetWidth()*terrain->GetMul() - terrain->GetScanDepth(); 
	if (camera->position.z <= terrain->GetScanDepth()) 
		camera->position.z = terrain->GetScanDepth(); 
	if (camera->position.z >= terrain->GetWidth()*terrain->GetMul() - terrain->GetScanDepth()) 
		camera->position.z = terrain->GetWidth()*terrain->GetMul() - terrain->GetScanDepth(); 
 
	terrain->Animate(deltaTime);                 // animate terrain 
 
	const type_info &ogro = typeid(COgroEnemy);  // get ogro typeid 
	const type_info &sod = typeid(CSodEnemy);    // get sod typeid 
 
	numOgros = CountObjectTypes(ogro);           // count ogros 
	numSods = CountObjectTypes(sod);             // count sods 
 
	gui->SetEnemiesLeft(numOgros + numSods); 
	gui->SetCurrentTime(timeStart - timeElapsed); 
 
	if (!gameDone) 
		timeElapsed += deltaTime; 
	else 
		timeElapsed = timeStart; 
} 
 
void CWorld::FadeScreen() 
{ 
	glPushMatrix(); 
	glLoadIdentity(); 
	glEnable(GL_BLEND); 
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
	glDisable(GL_TEXTURE_2D); 
	glColor4f(0.0, 0.0, 0.0, 0.7); 
	glBegin(GL_QUADS); 
	glVertex3f(-5, -5, -3.0); 
	glVertex3f(5, -5, -3.0); 
	glVertex3f(5, 5, -3.0); 
	glVertex3f(-5, 5, -3.0); 
	glEnd(); 
	glColor4f(1.0, 1.0, 1.0, 1.0); 
	glEnable(GL_TEXTURE_2D); 
	glDisable(GL_BLEND); 
	glPopMatrix(); 
} 
 
void CWorld::SetScreen(int width, int height) 
{ 
	screenWidth = width; 
	screenHeight = height; 
} 
 
void CWorld::Draw(CCamera *camera) 
{ 
	terrain->Draw(camera); 
	gui->Draw(); 
 
	if (gameDone) 
	{ 
		FadeScreen(); 
		if (numOgros + numSods <=0) 
			gui->DrawWinner(); 
		else 
			gui->DrawLoser(); 
	} 
} 
 
void CWorld::OnPrepare() 
{ 
	glClearColor(terrain->fogColor[0], terrain->fogColor[1], terrain->fogColor[2], terrain->fogColor[3]); 
	terrain->Prepare(); 
 
	if ((numOgros + numSods <= 0) || (timeElapsed >= timeStart)) 
		gameDone = true; 
} 
 
// LoadWorld() 
// desc: initializes the world 
void CWorld::LoadWorld() 
{ 
	int enemyIdx = 0; 
	int rndInt = 0; 
 
	numOgros = 0; 
	numSods = 0; 
 
	srand((unsigned int)time(NULL)); 
	 
	rndInt = (rand() % (MAX_ENEMIES-4)) + 4;	// random # from 4 to MAX 
	numOgros = numSods = rndInt; 
 
	// generate ogros 
	for (enemyIdx = 0; enemyIdx < numOgros; enemyIdx++) 
	{ 
		ogroEnemy = new COgroEnemy; 
		ogroEnemy->AttachTo(terrain); 
		ogroEnemy->SetPlayer(player); 
		ogroEnemy->SetAudioSystem(audioSystem); 
		ogroEnemy->position.x = (float)(rand() % (int)(terrain->GetWidth() * terrain->GetMul())); 
		ogroEnemy->position.y = 0.0f; 
		ogroEnemy->position.z = (float)(rand() % (int)(terrain->GetWidth() * terrain->GetMul())); 
	} 
 
	// generate sods 
	for (enemyIdx = 0; enemyIdx < numSods; enemyIdx++) 
	{ 
		sodEnemy = new CSodEnemy; 
		sodEnemy->AttachTo(terrain); 
		sodEnemy->SetPlayer(player); 
		sodEnemy->SetAudioSystem(audioSystem); 
		sodEnemy->position.x = (float)(rand() % (int)(terrain->GetWidth() * terrain->GetMul())); 
		sodEnemy->position.y = 0.0f; 
		sodEnemy->position.z = (float)(rand() % (int)(terrain->GetWidth() * terrain->GetMul())); 
	} 
} 
 
// CountObjectTypes 
// desc: counts the number of objects passed as classID in the hierarchy 
int CWorld::CountObjectTypes(const type_info &classID) 
{ 
	int count = 0; 
	CObject *c1; 
	CObject *c2; 
 
	c1 = (CObject*)terrain->childNode; 
 
	while (c1 != NULL) 
	{ 
		c2 = c1; 
		do 
		{ 
			if (typeid(*c2) == classID) 
				count++; 
			c2 = (CObject*)c2->nextNode; 
		} while (!c2->IsFirstChild()); 
 
		count--; 
 
		c1 = (CObject*)c1->childNode; 
	} 
 
	return count; 
}