📄 game.cpp
字号:
#include "StdAfx.h"
#include "../common/myd3d.h"
#include "game.h"
//#include "output.h"
extern const int SCREEN_Width = 640;
extern const int SCREEN_Height = 480;
extern IDirect3DDevice9* g_device;
extern HWND g_hwnd;
extern BOOL g_bActive;
//前向声明
bool ptopCheck( D3DXVECTOR3 v1, D3DXVECTOR3 v2, float dis);
bool collisionCheck(d3d::BoundingBox bBox, d3d::BoundingSphere bSphere);
bool collisionCheck(d3d::BoundingBox bBox1, d3d::BoundingBox bBox2);
bool collisionCheck(d3d::BoundingSphere bSphere1, d3d::BoundingSphere bSphere2);
bool isCarInTrack( Car &car);
bool isBulletInTrack( Bullet &bullet);
void drawBoundBox(Mymesh* mesh);
void drawBoundSphere(Mymesh* mesh);
Game::Game(void)
{
}
Game::~Game(void)
{
}
int Game::EnterMsgLoop(void)
{
MSG msg;
::ZeroMemory(&msg, sizeof(MSG));
static float lastTime = (float)timeGetTime();
while(msg.message != WM_QUIT)
{
if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else
{
float currTime = (float)timeGetTime();
float timeDelta = (currTime - lastTime)*0.001f;
GameDisplay(timeDelta);//空闲时显示游戏
if( g_bActive )
lastTime = currTime;
else
lastTime = (float)timeGetTime();
if(_gameState == GameState_Finish )
{
break;
}
}
}
return (int)msg.wParam;
}
bool Game::GameInit(void)
{
_gameViewType = SLANT;
_topView = false;
_freeView = false;
_pFont =0;
_gameState =GameState_Begin;
_timeLimit =150.0f;//(秒)
//初始化文字渲染接口
//(hp,time,lap)
_pFont = new CD3DFont("Times New Roman", 14, 0);
_pFont->InitDeviceObjects( g_device );
_pFont->RestoreDeviceObjects();
//(3,2,1,go)
_pFont1 = new CD3DFont("Times New Roman", 100, 0);
_pFont1->InitDeviceObjects( g_device );
_pFont1->RestoreDeviceObjects();
//dialogue
_pFont2 = new CD3DFont("Times New Roman", 20, 0);
_pFont2->InitDeviceObjects( g_device );
_pFont2->RestoreDeviceObjects();
//赛道初始化
track.Init("data/model/track.X");
//圈数检测器初试化
_circler.Init("data/model/circler.x");
//初始化计时器
_timer.Init();
//障碍物初始化
_obstacle.Init("data/model/obstacle.X");
//赛车初始化
car1.Init("data/model/car1.X");
car1.SetPosition( &D3DXVECTOR3(-145.0f, 0.0f, 40.0f));
car1.SetMaxSpeed(100.0f);
car2.Init("data/model/car2.x");
car2.SetPosition( &D3DXVECTOR3(-155.0f, 0.0f, 50.0f) );
car3.Init("data/model/car3.x");
car3.SetPosition( &D3DXVECTOR3(-165.0f, 0.0f, 70.0f) );
car3.SetSpeed(3.0f);
car4.Init("data/model/car4.x");
car4.SetPosition( &D3DXVECTOR3(-160.0f, 0.0f, 90.0f) );
car4.SetSpeed(5.0f);
//下面的以后要封装
//
// 设置纹理过滤器:放大缩小过滤器,mipmaps过滤器
//
g_device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
g_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
g_device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
//
//设置灯光
//
D3DXVECTOR3 dir(1.0f, -1.0f, 1.0f);
D3DXCOLOR col(1.0f, 1.0f, 1.0f, 1.0f);
D3DLIGHT9 light =d3d::InitDirectionalLight(&dir, &col);
g_device->SetLight(0, &light);
g_device->LightEnable(0, true);
g_device->SetRenderState(D3DRS_NORMALIZENORMALS, true);
g_device->SetRenderState(D3DRS_SPECULARENABLE, true);
//
setViewToCar(car1);
//
//获取投影矩阵,并进行投影变换
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI * 0.3f, // 90 - degree
(float)SCREEN_Width / (float)SCREEN_Height,
1.0f,
1000.0f);
g_device->SetTransform(D3DTS_PROJECTION, &proj);
////用于测试查看mesh数据
//// Dump the Mesh Data to file.
////
//std::ofstream OutFile;
//OutFile.open("../output/Mesh Dump.txt");
//dumpVertices(OutFile, track.Mesh);
//dumpIndices(OutFile, track.Mesh);
//dumpAttributeTable(OutFile, track.Mesh);
//dumpAttributeBuffer(OutFile, track.Mesh);
//dumpAdjacencyBuffer(OutFile, track.Mesh);
//
//OutFile.close();
return true;
}
void Game::GameShutDown(void)
{
track.Clean();
_circler.Clean();
_obstacle.Clean();
car1.Clean();
car2.Clean();
car3.Clean();
car4.Clean();
if( _pFont )
{
_pFont->InvalidateDeviceObjects();
_pFont->DeleteDeviceObjects();
d3d::Delete<CD3DFont*>(_pFont);
}
if( _pFont1 )
{
_pFont1->InvalidateDeviceObjects();
_pFont1->DeleteDeviceObjects();
d3d::Delete<CD3DFont*>(_pFont1);
}
}
//游戏控制
void Game::GameControl(float timeDelta)
{
//
//赛车控制
//
//(赛车相撞)
if( car2._isAlive && car1._isAlive && collisionCheck(car1._bBox, car2._bBox) )
{
car1.Kill();
car2.Kill();
}
if( car3._isAlive && car1._isAlive && collisionCheck(car1._bBox, car3._bBox) )
{
car1.Kill();
car3.Kill();
}
if( car4._isAlive && car1._isAlive && collisionCheck(car1._bBox, car4._bBox) )
{
car1.Kill();
car4.Kill();
}
//不能让他们自相残杀
if( car2._isAlive && car3._isAlive && collisionCheck(car2._bBox, car3._bBox) )
{
car2.SubSpeed(timeDelta);
car3.AddSpeed(timeDelta);
car2.Move(-timeDelta);
car3.Move(-timeDelta);
car2.GoRight(0.6f);
/*car2.LPmove(5.0f);
car3.RPmove(5.0f);*/
}
if( car2._isAlive && car4._isAlive && collisionCheck(car2._bBox, car4._bBox) )
{
car4.SubSpeed(timeDelta);
car2.AddSpeed(timeDelta);
car4.Move(-timeDelta);
car2.Move(-timeDelta);
car4.GoRight(0.6f);
/*car4.LPmove(5.0f);
car2.RPmove(5.0f);*/
}
if( car3._isAlive && car4._isAlive && collisionCheck(car3._bBox, car4._bBox) )
{
car3.SubSpeed(timeDelta);
car4.AddSpeed(timeDelta);
car3.Move(-timeDelta);
car4.Move(-timeDelta);
car3.GoRight(0.6f);
/*car3.LPmove(5.0f);
car4.RPmove(5.0f);*/
}
//(赛车移动)
if(car1._isAlive)
{
if( isCarInTrack(car1)/*&& !collisionCheck(car1._bBox, car2._bBox)*/)
{
if( KEYDOWN(VK_UP))
car1.AddSpeed(4.0f*timeDelta);
if( KEYDOWN(VK_DOWN) )
car1.SubSpeed(4.0f*timeDelta);
if( KEYDOWN(VK_LEFT) )
car1.GoLeft(timeDelta);
if( KEYDOWN(VK_RIGHT) )
car1.GoRight(timeDelta);
car1.Move(timeDelta);
}
else
{ //向后修正位置
car1.Move(-timeDelta);
car1.SubSpeed(5.0f*timeDelta);
}
}
if(car2._isAlive)
car2.AIMove(timeDelta);
if(car3._isAlive)
car3.AIMove(timeDelta);
if(car4._isAlive)
car4.AIMove(timeDelta);
//
//开火(防止AI一开始就被玩家灭了,所以要跑完第一圈才能fire)
//
if( car1._isAlive && KEYDOWN(VK_SPACE) && (car1._circleNum>=1) )
{
car1.Fire();
}
//AI车乱开火,嘿嘿
if(car2._isAlive && (car2._circleNum>=1))
car2.Fire();
if(car3._isAlive && (car3._circleNum>=1))
car3.Fire();
if(car4._isAlive && (car4._circleNum>=1))
car4.Fire();
//
//子弹控制
//
//(与边界的检测)
if(car1._bullet._isAlive )
{
if(isBulletInTrack( car1._bullet) )
car1._bullet.Move(timeDelta);
else
{
if(car1._bullet.Kill())
car1._haveBullet = true;
}
}
if(car2._bullet._isAlive )
{
if(isBulletInTrack( car2._bullet) )
car2._bullet.Move(timeDelta);
else
{
if(car2._bullet.Kill())
car2._haveBullet = true;
}
}
if(car3._bullet._isAlive )
{
if(isBulletInTrack( car3._bullet) )
car3._bullet.Move(timeDelta);
else
{
if(car3._bullet.Kill())
car3._haveBullet = true;
}
}
if(car4._bullet._isAlive )
{
if(isBulletInTrack( car4._bullet) )
car4._bullet.Move(timeDelta);
else
{
if(car4._bullet.Kill())
car4._haveBullet = true;
}
}
//子弹打车
if( car1._bullet._isAlive && car2._isAlive && collisionCheck(car1._bullet._bBox, car2._bBox))
{
car1._bullet.Kill();
car1._haveBullet = true;
car2._lifeNum--;
}
if( car1._bullet._isAlive && car3._isAlive && collisionCheck(car1._bullet._bBox, car3._bBox) )
{
car1._bullet.Kill();
car1._haveBullet = true;
car3._lifeNum--;
}
if( car1._bullet._isAlive && car4._isAlive && collisionCheck(car1._bullet._bBox, car4._bBox) )
{
car1._bullet.Kill();
car1._haveBullet = true;
car4._lifeNum--;
}
if( car2._bullet._isAlive && car1._isAlive && collisionCheck(car2._bullet._bBox, car1._bBox) )
{
car2._bullet.Kill();
car2._haveBullet = true;
car1._lifeNum--;
}
if( car3._bullet._isAlive && car1._isAlive && collisionCheck(car3._bullet._bBox, car1._bBox) )
{
car3._bullet.Kill();
car3._haveBullet = true;
car1._lifeNum--;
}
if( car4._bullet._isAlive && car1._isAlive && collisionCheck(car4._bullet._bBox, car1._bBox) )
{
car4._bullet.Kill();
car4._haveBullet = true;
car1._lifeNum--;
}
//
//障碍物检测
//
checkObstacle(timeDelta);
//
//摄象机控制
//
if(!_freeView )
{
if( _topView )
{
_gameViewType = TOP;
}
else
{
_gameViewType = SLANT;
}
}
switch(_gameViewType)
{
case SLANT:
{
setViewToCar(car1);
}
break;
case TOP:
{
setViewToTop();
}
break;
case FREE:
{
setViewFree(timeDelta);
}
break;
default: ::MessageBox(g_hwnd, TEXT("no GameView to choose"), "camera control", 0);
break;
}
//圈数检测
_circler.CheckCircle(car1, timeDelta);
_circler.CheckCircle(car2, timeDelta);
_circler.CheckCircle(car3, timeDelta);
_circler.CheckCircle(car4, timeDelta);
//游戏结束控制
if( !car1._isAlive ||
(car2._circleNum >= CIRCLE) ||
(car3._circleNum >= CIRCLE) ||
(car4._circleNum >= CIRCLE) )
{
_gameState = GameState_Over;
}
}
bool Game::UpdateWorld(float timeDelta)
{
car1.Update(timeDelta);
car2.Update(timeDelta);
car3.Update(timeDelta);
car4.Update(timeDelta);
_obstacle.SafeUpdate(car1.GetPosition(),timeDelta,120.0f);
d3d::Gtime gtime( _timer.GetLastTime() );
sprintf_s(_timeString, "TIME: %d:%d",gtime._minute,gtime._second);
_timeString[SIZE-1] = '\0';
return true;
}
bool Game::RenderWorld()
{
//这里绘制场景
g_device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(79.0f,129.0f,188.0f,1.0f)/*0xffffffff*/, 1.0f, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -