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

📄 game.cpp

📁 3D赛车游戏源代码-用Visual Studio 2005
💻 CPP
字号:
//-----------------------------------------
// Game.cpp Implementation for class Game
//   Copy Rights Wonderful 2005
//-----------------------------------------

#include "StdAfx.h"
#include "Game.h"
#include "MathUtil.h"
#include "../model/Model.h"
#include "Matrix.h"
#include "SceneManager.h"
#include "../gameplay/StaticActor.h"
#include "../res/ModelLoadManager.h"
#include "../gameplay/Map.h"
#include "../res/Texture.h"
#include "../gameplay/PlayerCar.h"
#include "../gameplay/AiCar.h"
#include "../input/Input.h"
#include "../gameplay/Camera.h"
#include "SkyBox.h"

const int SCREEN_W   = 640;
const int SCREEN_H   = 480;
const int SCREEN_BPP =  16;

CGame *g_pGame;
CMap g_Map;

CGame::CGame(TCHAR *szTitle, TCHAR *szIcon)
{
    m_hInst   = NULL;
    m_hWnd    = NULL;
    m_bActive = FALSE;
    lstrcpy(m_szTitle, szTitle);
    lstrcpy(m_szIcon, szIcon);
    srand(GetTickCount());

    g_pGame   = this;

}

CGame::~CGame()
{

}

int CGame::MessageBox(LPCTSTR szText, LPCTSTR szCaption, UINT uType)
{
    return ::MessageBox(m_hWnd, szText, szCaption, uType);
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    if( g_pGame )
        return g_pGame->MsgProc( hWnd, uMsg, wParam, lParam );

    return DefWindowProc( hWnd, uMsg, wParam, lParam );
}


bool CGame::InitApplication()
{
    TCHAR szClassName[] = TEXT("MYGAME");

    WNDCLASS wc;
    wc.hInstance = m_hInst;
    wc.lpszClassName = szClassName;
    wc.lpfnWndProc = WndProc;
    wc.style = CS_DBLCLKS;
    wc.hIcon = LoadIcon( m_hInst, m_szIcon);
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.lpszMenuName = NULL;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );

    if( !RegisterClass( &wc ) )
    {
        MessageBox(TEXT("Error In RegisterClassEx\n"), TEXT("Tank"));
        return FALSE;
    }

    m_hWnd = CreateWindow( szClassName,
        m_szTitle,
        WS_POPUP,
        100,
        60,
        800, 600,
        NULL,
        NULL,
        m_hInst,
        NULL );
    if( !m_hWnd )
    {
        MessageBox(TEXT("Error In CreateWindow\n"), m_szTitle);
        return FALSE;
    }

    UpdateWindow( m_hWnd );
    ShowWindow( m_hWnd, SW_NORMAL );

    return true;
}




bool CGame::Initialize(HINSTANCE hInst)
{
    m_hInst = hInst;

	if (!InitApplication())
    {
        MessageBox(TEXT("初始化程序失败!"));

        return false;
    }

	if (!m_display.CreateWindowedDisplay(m_hWnd, 800, 600))
	{
		MessageBox(TEXT("初始化显示模式失败!"));
	}

    GameInit();  

    return true;
}

int CGame::Run()
{
    MSG	msg;

    while(true)
    {
        if (PeekMessage( &msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
            {	
                break;
            }

            TranslateMessage(&msg); 
            DispatchMessage(&msg);
        }
        else if( m_bActive )
        {
			if (m_timer.IsPassTime(30))
			{
				GameMain();
				m_timer.ReStart();
			}
			else
			{
				Sleep(1);
			}
        }
        else
        {
            WaitMessage();
        }
    }

    GameShutDown();

    return (int)msg.wParam;
}


LRESULT CGame::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_ACTIVATEAPP:
        m_bActive = (BOOL)wParam;
        
        return 0;

	case WM_SYSCOMMAND:					
	
		switch (wParam)					
		{
			case SC_SCREENSAVE:			
			case SC_MONITORPOWER:		
			return 0;					
		}
			
		break;	
		
	case WM_CLOSE:
		m_display.DestroyObjects();
		break;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_KEYDOWN:
        OnKeyDown((UINT)wParam);
        return 0;

    case WM_LBUTTONDOWN:
        OnLButtonDown(LOWORD(lParam), HIWORD(lParam));
        return 0;

	case WM_SIZE:		
		m_display.ResizeScene(LOWORD(lParam),HIWORD(lParam));
		return 0;				
    }

    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

void CGame::OnKeyDown(UINT nChar)
{
    switch (nChar)
    {
    case VK_ESCAPE:
        PostMessage(m_hWnd, WM_CLOSE, 0, 0);
        break;
    }
}

void CGame::OnLButtonDown(int x, int y)
{
	/*char buf[64];
	int iX = x - 400;
	int iY = 600 - y;
	iY -= 300;
	float fX = iX * 2.f / 3.f;
	float fY = iY * 2.f / 3.f;
	sprintf(buf, "%.2f, %.2f", fX, fY);
	::MessageBox(m_hWnd, buf, "hehe", MB_OK);*/
}

CPlayerCar car1;
CAiCar car2;
CAiCar car3;

CCarObject * cars[3] = { &car1, &car2, &car3 };

CMatrix44F mat1;
TextureReference beginPic[3];
TextureReference endPic;
CInput input;
CCamera camera;
AABB3 boxCheck;
AABB3 boxFinsh;

//float y01 = -60.0f;

float g_x = 0.f;
float g_y = 0.f;

bool CGame::UpdateWorld()
{
	//y01 += 0.1f;
	//wheelRot -= 0.1f;

	//if (y01 > 80.0f)
	//{
	//	y01 = -60.0f;
	//}

	//mat1.SetupTranslation(Vector3(0.0f, y01+10.0f, 1.0f));
	//car1.SetTransform(mat1);

	if (m_eGameState == EGameState_Begin)
	{
		if (m_GameStateTimer.IsPassTime(3000))
		{
			m_eGameState = EGameState_Run;
		}
	}
	else if (m_eGameState != EGameState_Finish)
	{
		car1.Update();
		car2.Update();
		car3.Update();

		WORD wInput;
		input.GetKey(wInput);
		car1.ProcessInput(wInput);

		if (CollisionCheck(car1, car2))
		{
			OnCollision(car1, car2);
		}

		if (CollisionCheck(car1, car3))
		{
			OnCollision(car1, car3);
		}

		if (CollisionCheck(car2, car3))
		{
			OnCollision(car2, car3);
		}

		for (int i=0; i<3; ++i)
		{
			CCarObject &oCurCar = *cars[i];

			switch (oCurCar.GetCarState())
			{
			case ECarState_Begin:
				{
					if (IntersectAABBs(boxCheck, oCurCar.GetWorldBox()))
					{
						oCurCar.SetCarState(ECarState_Check);
					}
				}
				break;

			case ECarState_Check:
				{
					if (IntersectAABBs(boxFinsh, oCurCar.GetWorldBox()))
					{
						oCurCar.SetCarState(ECarState_Finish);
					}
				}
				break;

			case ECarState_Finish:
				{
					oCurCar.SetMoveSpeed(0.f);
				}
				break;
			}
		}

		if (car1.GetCarState() == ECarState_Finish)
		{
			int iFinishCount = 1;

			if (car2.GetCarState() == ECarState_Finish)
			{
				++iFinishCount;
			}

			if (car3.GetCarState() == ECarState_Finish)
			{
				++iFinishCount;
			}

			m_eGameState = EGameState_Finish;
			char buf[64];
			sprintf(buf, "你得了第%d名,恭喜你!", iFinishCount);
			::MessageBox(m_hWnd, buf, "呵呵", MB_OK);
		}
	}
	
	
	return true;
}




bool CGame::RenderWorld()
{
	m_display.BeginDraw();

	if (m_eGameState == EGameState_Begin || m_eGameState == EGameState_Finish)
	{
		glEnable(GL_TEXTURE_2D);

		// 显示结束图片
		if (m_eGameState == EGameState_Finish)
		{
			glBindTexture(GL_TEXTURE_2D, endPic.handle);
		}
		// 否则依次显示数字3、2、1
		else 
		{
			if (m_GameStateTimer.IsPassTime(2002))
			{
				glBindTexture(GL_TEXTURE_2D, beginPic[0].handle);
			}
			else if (m_GameStateTimer.IsPassTime(1002))
			{
				glBindTexture(GL_TEXTURE_2D, beginPic[1].handle);
			}
			else
			{
				glBindTexture(GL_TEXTURE_2D, beginPic[2].handle);
			}

		}
				
		glBegin(GL_QUADS);
		glTexCoord2f(1.f, 0.f);
		glVertex3f(2.f, 0.8f, -6.f);
		glTexCoord2f(1.f, 1.f);
		glVertex3f(2.f, 2.8f, -6.f);
		glTexCoord2f(0.f, 1.f);
		glVertex3f(0.f, 2.8f, -6.f);
		glTexCoord2f(0.f, 0.f);
		glVertex3f(0.f, 0.8f, -6.f);
		glEnd();
	}
	//gluLookAt(g_x, g_y-57.f, 100.f, g_x, g_y-41.f, 32.f, 0.f, 1.f, 0.f);
	
	/*Vector3 position = car1.GetPosition();
	float x01 = position.x;
	float y01 = position.y - 10.0f;
	glTranslatef(0.0f, 0.0f, -28.0f);
	gluLookAt(x01, y01, 4.0f, x01, y01+16.0f, 0.0f, 0, 1, 0);*/
	
	camera.FollowLookCar(car1);
	//gluLookAt(0.f, 0.f, 200.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f);
	//glRotatef(30, 0, 0, 1);

	//g_Renderer.SelectTexture(road);
	//glBegin(GL_QUADS);
	//glTexCoord2f(0, 0);
	//glVertex3f(-60.0f, -80.0f, 0.0f);
	//glTexCoord2f(1, 0);
	//glVertex3f(80.0f, -80.0f, 0.0f);
	//glTexCoord2f(1, 1);
	//glVertex3f(80.0f, 100.0f, 0.0f);
	//glTexCoord2f(0, 1);
	//glVertex3f(-60.0f, 100.0f, 0.0f);
	//glEnd();

	g_SkyBox.Render();
	g_SceneManager.RenderScene();

	m_display.EndDraw();

	m_display.Present();
	return true;
}


bool CGame::GameInit()
{
	strcpy(beginPic[0].name, "Data/textures/1.BMP");
	g_TextureManager.LoadTexture(&beginPic[0]);
	strcpy(beginPic[1].name, "Data/textures/2.BMP");
	g_TextureManager.LoadTexture(&beginPic[1]);
	strcpy(beginPic[2].name, "Data/textures/3.BMP");
	g_TextureManager.LoadTexture(&beginPic[2]);
	strcpy(endPic.name, "Data/textures/end.BMP");
	g_TextureManager.LoadTexture(&endPic);

	g_Map.LoadFromFile("Maps/Level1.map");
	g_AiRoadManager.LoadAiRoad("Data/AI/Ai.txt");
	car1.LoadModels("Data/Cars/Supra01/Supra_01.3ds");
	mat1.SetupTranslation(Vector3(80.0f, 40.0f, 1.6f));
	//mat1.Rotate(3, kPi);
	car1.SetTransform(mat1);
	car1.AddToScene();
	car1.SetMoveSpeed(0.1f);
	car1.SetMaxMoveSpeed(0.82f);
	car1.SetTurnSpeed(0.06f);
	car1.SetCarState(ECarState_Begin);
		
	car2.LoadModels("Data/Cars/MM001/MM_001_v_0_10.3ds");
	mat1.SetTranslation(Vector3(80.f, 50.f, 1.8f));
	car2.SetTransform(mat1);
	car2.AddToScene();
	car2.SetAiRoad(0);
	car2.SetMoveSpeed(0.1f);
	car2.SetMaxMoveSpeed(0.8f);
	car2.SetTurnSpeed(0.06f);
	car2.SetCarState(ECarState_Begin);

	car3.LoadModels("Data/Cars/GolfGTI/Golf_1_GTI.3ds");
	mat1.SetTranslation(Vector3(72.67f, 48.f, 1.8f));
	car3.SetTransform(mat1);
	car3.AddToScene();
	car3.SetAiRoad(1);
	car3.SetMoveSpeed(0.1f);
	car3.SetMaxMoveSpeed(0.8f);
	car3.SetTurnSpeed(0.06f);
	car3.SetCarState(ECarState_Begin);

	g_SkyBox.SetPosAndSize(Vector3(0.f, 0.f, 400.f), Vector3(2000.f, 1680.f, 800.f));
	g_SkyBox.LoadTexture(ESIDE_TOP,		"Data/textures/top.bmp");
	g_SkyBox.LoadTexture(ESIDE_BOTTOM,	"Data/textures/bottom.bmp");
	g_SkyBox.LoadTexture(ESIDE_LEFT,	"Data/textures/left.bmp");
	g_SkyBox.LoadTexture(ESIDE_RIGHT,	"Data/textures/right.bmp");
	g_SkyBox.LoadTexture(ESIDE_FRONT,	"Data/textures/front.bmp");
	g_SkyBox.LoadTexture(ESIDE_BACK,	"Data/textures/back.bmp");

	boxCheck.min = Vector3(-214.f, -69.f, -2.f);
	boxCheck.max = Vector3(-120.f, -38.f, 2.f);
	boxFinsh.min = Vector3(21.f, 34.f, -2.f);
	boxFinsh.max = Vector3(121.f, 44.f, 2.f);

	m_eGameState = EGameState_Begin;
	m_GameStateTimer.ReStart();
    return true;
}

bool CGame::GameShutDown()
{   
    return true;
}
 

bool CGame::GameMain()
{
	UpdateWorld();
	RenderWorld();
    return true;
}

CGame game(TEXT("TANK"), NULL);


//main函数在这里
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
{
//int main()
//{
//	HINSTANCE hInstance = GetModuleHandle(0);

    if (!g_pGame->Initialize(hInstance))
	{
		return -1;
	}

    return g_pGame->Run();
}

⌨️ 快捷键说明

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