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

📄 world.cpp

📁 “恐怖之战”游戏源码
💻 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;		// 游戏开始

	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;		
	timeElapsed = 0.0;
	gui->SetCurrentTime(timeStart);
	gui->SetEnemiesLeft(numOgros + numSods);
}

void CWorld::Animate(float deltaTime)
{
	// 根据地形设置摄像机的高度位置
	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);                 // 动画地形

	const type_info &ogro = typeid(COgroEnemy);  // 获取ogro类型id
	const type_info &sod = typeid(CSodEnemy);    // 获取sod类型id

	numOgros = CountObjectTypes(ogro);           // ogro计数
	numSods = CountObjectTypes(sod);             // sod计数

	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;
}

// 初始化场景
void CWorld::LoadWorld()
{
	int enemyIdx = 0;
	int rndInt = 0;

	numOgros = 0;
	numSods = 0;

	srand((unsigned int)time(NULL));
	
	rndInt = (rand() % (MAX_ENEMIES-4)) + 4;
	numOgros = numSods = rndInt;
	// 生成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()));
	}
	// 生成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()));
	}
}

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;
}

⌨️ 快捷键说明

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