📄 game.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 + -