📄 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; // 游戏开始
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 + -