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

📄 game.cpp

📁 极限赛车CarGameDemo DirectX9
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -