📄 main.cpp
字号:
#include "main.h"
bool MenuSetup()
{
//setup cursor
engine.Device->CreateVertexBuffer(
6 * sizeof(Vertex),
D3DUSAGE_WRITEONLY,
Vertex::FVF,
D3DPOOL_MANAGED,
&BG,
0);
Vertex* v;
BG->Lock(0, 0, (void**)&v, 0);
// quad built from two triangles, note texture coordinates:
v[0] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
v[1] = Vertex(-1.0f, 1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
v[2] = Vertex( 1.0f, 1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
v[3] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
v[4] = Vertex( 1.0f, 1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
v[5] = Vertex( 1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);
BG->Unlock();
D3DXCreateTextureFromFile(
engine.Device,
"bg.png",
&Tex);
engine.Device->SetTexture(0, Tex);
curTriangle=new CModel("curTriangle.x",engine.Device,false);
curTriangle->vecScale=D3DXVECTOR3(3,3,3);
curTriangle->vecPos=D3DXVECTOR3(-1,-1,0);
engine.Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
engine.Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
engine.Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
// Set view matrix.
D3DXVECTOR3 pos(0.0f, 5.0f, -11.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &pos, &target, &up);
engine.Device->SetTransform(D3DTS_VIEW, &V);
// Set projection matrix.
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI * 0.25f, // 45 - degree
(float)engine.Width / (float)engine.Height,
1.0f,
1000.0f);
engine.Device->SetTransform(D3DTS_PROJECTION, &proj);
engine.Device->SetRenderState(D3DRS_NORMALIZENORMALS, true);
engine.Device->SetRenderState(D3DRS_SPECULARENABLE, true);
engine.Device->SetRenderState(D3DRS_LIGHTING,false);
return true;
}
bool GameSetup()
{
//init models
arena=new CModel("arena.x",engine.Device,false);
arena->vecScale=D3DXVECTOR3(3,3,3);
//int players
switch(p[0].character)
{
case JIN:
p[0].ball=new CModel("Jin.x",engine.Device,false);
break;
case BOBI:
p[0].ball=new CModel("Bobi.x",engine.Device,false);
break;
}
p[0].ball->vecPos=D3DXVECTOR3(-1.0f,1.2f,0.0f); //init the position
p[0].ball->vecRot=D3DXVECTOR3(0,D3DX_PI/2,0);
p[0].ball->look = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
switch(p[1].character)
{
case JIN:
p[1].ball=new CModel("Jin.x",engine.Device,false);
break;
case BOBI:
p[1].ball=new CModel("Bobi.x",engine.Device,false);
break;
}
p[1].ball->vecPos=D3DXVECTOR3(1.0f,1.2f,0.2f); //init the position
p[1].ball->vecRot=D3DXVECTOR3(0,-D3DX_PI/2,0);
p[1].ball->look = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
p[0].acc=0;
p[1].acc=0;
p[0].Score=0;
p[1].Score=0;
strcpy(p[0].Name,"Jin");
strcpy(p[1].Name,"Bobi");
// Set view matrix.
D3DXVECTOR3 pos(0.0f, 5.0f, -11.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &pos, &target, &up);
engine.Device->SetTransform(D3DTS_VIEW, &V);
// Set projection matrix.
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI * 0.25f, // 45 - degree
(float)engine.Width / (float)engine.Height,
1.0f,
1000.0f);
engine.Device->SetTransform(D3DTS_PROJECTION, &proj);
engine.Device->SetRenderState(D3DRS_NORMALIZENORMALS, true);
engine.Device->SetRenderState(D3DRS_SPECULARENABLE, true);
engine.Device->SetRenderState(D3DRS_LIGHTING,false);
//setup font
D3DXFONT_DESC fd;
fd.CharSet=DEFAULT_CHARSET;
strcpy(fd.FaceName,"Comic Sans MS");
fd.Height=50;
fd.Italic=true;
fd.MipLevels=0;
fd.OutputPrecision=OUT_DEFAULT_PRECIS;
fd.PitchAndFamily=DEFAULT_PITCH|FF_DONTCARE;
fd.Quality=ANTIALIASED_QUALITY;
fd.Weight=FW_BOLD;
fd.Width=0;
if(FAILED(D3DXCreateFontIndirect(engine.Device, &fd, &Font)))
{
MessageBox(0, "D3DXCreateFontIndirect() - FAILED", 0, 0);
PostQuitMessage(0);
}
return true;
}
bool GameDisplay(float timeDelta)
{
int i=0;
float accDif; //difference of the accelerator
if( engine.Device )
{
engine.Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DXCOLOR(0,0,0,1), 1.0f, 0);
engine.Device->BeginScene();
ShowStats();
GetGamePlayKey(timeDelta);
for(i=0;i<2;i++)
{
if(!IsInArena(i))
{
p[i].ball->vecPos.y-=10*timeDelta;
if(p[i].ball->vecPos.y<-10)
{
if(i==0)
p[1].Score+=1;
else
p[0].Score+=1;
Reset();
}
}
p[i].ball->walk(timeDelta*p[i].acc);
p[i].ball->Draw();
//auto stop
if(p[i].acc>0.0f)
p[i].acc-=0.5f*timeDelta;
if(p[i].acc<0.0f)
p[i].acc+=0.5f*timeDelta;
}
if(IsPlayerCollide())
{
D3DXVECTOR3 N;
N=p[1].ball->vecPos-p[0].ball->vecPos;
D3DXVec3Normalize(&N,&N);
if(fabs(p[0].acc)>fabs(p[1].acc)) //player 1's acceleration is higher
{
accDif=fabs(p[0].acc)-fabs(p[1].acc);
p[0].acc-=accDif;
p[1].acc+=accDif;
}
else
{
accDif=fabs(p[1].acc)-fabs(p[0].acc);
p[0].acc+=accDif;
p[1].acc-=accDif;
}
p[0].ball->vecPos-=N*p[0].acc*timeDelta;
p[1].ball->vecPos+=N*p[1].acc*timeDelta;
}
arena->Draw();
CheckWin();
engine.Device->EndScene();
engine.Device->Present(0,0,0,0);
}
return true;
}
bool MenuDisplay(float timeDelta)
{
curTriangle->vecRot.x+=2*timeDelta;
if(curTriangle->vecRot.x>D3DX_PI*2)
curTriangle->vecRot.x=0;
if( engine.Device )
{
engine.Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DXCOLOR(0,0,0,1), 1.0f, 0);
engine.Device->BeginScene();
curTriangle->Draw();
D3DXMATRIX s,r,w,p;
D3DXMatrixScaling(&s,4,6.8,0);
D3DXMatrixRotationX(&r,0);
D3DXMatrixTranslation(&p,0,-2,2);
w=s*r*p;
engine.Device->SetTransform(D3DTS_WORLD,&w);
engine.Device->SetTexture(0, Tex);
engine.Device->SetStreamSource(0, BG, 0, sizeof(Vertex));
engine.Device->SetFVF(Vertex::FVF);
engine.Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
engine.Device->EndScene();
engine.Device->Present(0,0,0,0);
}
return true;
}
bool IsPlayerCollide()
{
D3DXVECTOR3 v;
v=p[0].ball->vecPos-p[1].ball->vecPos;
float centDist=p[0].ball->BS._radius+p[1].ball->BS._radius;
centDist-=0.6f;
return (D3DXVec3LengthSq(&v)<=centDist*centDist);
}
bool IsInArena(int i)
{
D3DXVECTOR3 v;
v=arena->vecPos-p[i].ball->vecPos;
return (D3DXVec3LengthSq(&v)<
(arena->BS._radius*arena->vecScale.x-0.1)*(arena->BS._radius*arena->vecScale.x-0.1));
}
void GameCleanup()
{
int i=0;
for(i=0;i<2;i++)
{
if(p[i].ball)
p[i].ball=NULL;
}
}
void MenuCleanUp()
{
if(Tex)
Tex->Release();
if(BG)
BG->Release();
}
void GetGamePlayKey(float timeDelta)
{
if(GetAsyncKeyState(VK_UP))
if(p[0].acc<5.2f)
p[0].acc+=1.2*timeDelta;
if(GetAsyncKeyState(VK_DOWN))
if(p[0].acc>-5.2f)
p[0].acc-=1.2*timeDelta;
if(GetAsyncKeyState(VK_LEFT))
{
p[0].ball->yaw(-timeDelta*5);
p[0].ball->vecRot.y-=timeDelta*5;
}
if(GetAsyncKeyState(VK_RIGHT))
{
p[0].ball->yaw(timeDelta*5);
p[0].ball->vecRot.y+=timeDelta*5;
}
if(GetAsyncKeyState('W'))
if(p[1].acc<5.2f)
p[1].acc+=1.2f*timeDelta;
if(GetAsyncKeyState('S'))
if(p[1].acc>-5.2f)
p[1].acc-=1.2f*timeDelta;
if(GetAsyncKeyState('A'))
{
p[1].ball->yaw(-timeDelta*5);
p[1].ball->vecRot.y-=timeDelta*5;
}
if(GetAsyncKeyState('D'))
{
p[1].ball->yaw(timeDelta*5);
p[1].ball->vecRot.y+=timeDelta*5;
}
}
void ReadSettings()
{
char buf[100];
FILE *f;
f=fopen("config.cfg","r+");
fscanf(f,"Resolution: %d x %d x %d",&engine.Width,&engine.Height,&engine.depth);
fscanf(f,"%s %s %s ",buf,buf,buf);
if(!strcmp("false",buf))
engine.windowed=true;
else
engine.windowed=false;
ZeroMemory(buf,sizeof(buf));
fclose(f);
}
void ShowStats()
{
//show player name
char *str=new char[100];
RECT pos;
pos.left=20;
pos.top=10;
Font->DrawText(0,
p[0].Name,
-1,
&pos,
DT_TOP | DT_LEFT,
D3DXCOLOR(1,1,0,1));
pos.left=engine.Width-100;
Font->DrawText(0,
p[1].Name,
-1,
&pos,
DT_TOP,
D3DXCOLOR(1,1,0,1));
//score
pos.left=60;
pos.top=60;
sprintf(str,"%d",p[0].Score);
Font->DrawText(0,
str,
-1,
&pos,
DT_TOP | DT_LEFT,
D3DXCOLOR(1,1,0,1));
pos.left=engine.Width-100;
sprintf(str,"%d",p[1].Score);
Font->DrawText(0,
str,
-1,
&pos,
DT_TOP,
D3DXCOLOR(1,1,0,1));
delete [] str;
}
void Reset()
{
p[0].ball->vecPos=D3DXVECTOR3(-1.0f,1.2f,0.0f); //init the position
p[0].ball->vecRot=D3DXVECTOR3(0,D3DX_PI/2,0);
p[0].ball->look = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
p[1].ball->vecPos=D3DXVECTOR3(1.0f,1.2f,0.2f); //init the position
p[1].ball->vecRot=D3DXVECTOR3(0,-D3DX_PI/2,0);
p[1].ball->look = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
p[0].acc=0;
p[1].acc=0;
}
void CheckWin()
{
char str[100];
for(int i=0;i<2;i++)
{
if(p[i].Score==engine.MaxScore)
{
sprintf(str,"Player %d has won!!",i);
MessageBox(0,str,"Congratualations",MB_ICONINFORMATION|MB_OK);
GameCleanup();
MenuSetup();
engine.Condition=0;
engine.ptr_display=MenuDisplay;
}
}
}
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
ReadSettings();
if(!engine.InitD3D(hInst))
{
MessageBox(0,"InitD3D - FAILED",0,MB_OK);
PostQuitMessage(0);
}
ShowCursor(0);
p[0].character=JIN;
p[1].character=BOBI;
MenuSetup();
engine.ptr_display=MenuDisplay;
engine.GameLoop();
GameCleanup();
return 0;
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_PAINT:
ValidateRect(hwnd,0);
break;
case WM_KEYUP:
if(engine.Condition==0)
{
switch(wParam)
{
case VK_DOWN:
engine.MenuSelect+=1;
curTriangle->vecPos.y=-1.6;
if(engine.MenuSelect>1)
{
engine.MenuSelect=0;
curTriangle->vecPos.y=-1;
}
break;
case VK_UP:
engine.MenuSelect-=1;
curTriangle->vecPos.y=-1;
if(engine.MenuSelect<0)
{
engine.MenuSelect=1;
curTriangle->vecPos.y=-1.6;
}
break;
case VK_RETURN:
if(engine.MenuSelect==0)
{
GameSetup();
engine.ptr_display=GameDisplay;
MenuCleanUp();
engine.Condition=1;
}
else
PostQuitMessage(0);
break;
}
}
if(wParam==VK_ESCAPE)
{
DestroyWindow(hwnd);
return 0;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -