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

📄 main.cpp

📁 Battle Balls v1.0 nice
💻 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 + -