main.cpp:
GeSHi (cpp):
// game name: "headshot"
// game project started: 02/13/2008
#include "main.h"
// © 2008 Bram Buurlage
// © 2008 PowerBit Productions
// controls: AWSD move
// Mouse aim
// Left MB shoot
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
HWND hWnd;
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = "WindowClass";
RegisterClassEx(&wc);
hWnd = CreateWindowEx(NULL, "WindowClass", "HeadShot v1.0",WS_EX_TOPMOST | WS_POPUP, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
initD3D(hWnd,hInstance);
MSG msg;
while(TRUE)
{
DWORD starting_point = GetTickCount();
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
render_frame();
if(KEY_DOWN(VK_ESCAPE))
PostMessage(hWnd, WM_DESTROY, 0, 0);
while ((GetTickCount() - starting_point) < (1/60)*1000);
}
cleanD3D();
return msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
}
return DefWindowProc (hWnd, message, wParam, lParam);
}
// and this is where everything finally begins
// phew....
void initD3D(HWND hWnd, HINSTANCE hinst)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = FALSE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth = SCREEN_WIDTH;
d3dpp.BackBufferHeight = SCREEN_HEIGHT;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&d3ddev);
D3DXCreateSprite(d3ddev,&d3dspt);
D3DXCreateFont(d3ddev,12,0,700,1,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,NONANTIALIASED_QUALITY,DEFAULT_PITCH || FF_DONTCARE,"Tahoma",&font);
init_graphics();
init_light();
init_input(hinst,hWnd);
d3ddev->SetRenderState(D3DRS_LIGHTING,TRUE);
d3ddev->SetRenderState(D3DRS_ZENABLE,TRUE);
d3ddev->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);
d3ddev->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_XRGB(128,128,128));
iface.cam_init();
iface.cam_lookat.z=-5.0f;
return;
}
void render_frame(void)
{
detect_mousepos();
detect_keys();
d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->BeginScene();
d3ddev->SetFVF(CUSTOMFVF);
d3ddev->ShowCursor(true);
static RECT textbox;
SetRect(&textbox, 320-32,16,320+32,32);
static char strdraw[10];
_itoa_s(score,strdraw,10);
font->DrawTextA(NULL,(LPCSTR)&strdraw,strlen((LPCSTR) &strdraw),&textbox,DT_RIGHT | DT_VCENTER,D3DCOLOR_ARGB(255, 255, 255, 255));
iface.cam_pos.x=x;
iface.cam_pos.y=y+sin(D3DXToRadian(walked*4))/50;
iface.cam_pos.z=z;
iface.cam_lookat.x=x+ cos(D3DXToRadian(camdir))*cos(D3DXToRadian(camang));
iface.cam_lookat.y=y+ sin(D3DXToRadian(camang));
iface.cam_lookat.z=z- sin(D3DXToRadian(camdir))*cos(D3DXToRadian(camang));
iface.set_view();
for (int i=0; i<5; i++)
{
enemys[i].process(x,z);
}
D3DXMATRIX matmove;
D3DXMATRIX matroty,matrotx;
D3DXMATRIX trans;
static float yrot; yrot=D3DXToRadian(gundir+180);
D3DXMatrixRotationZ(&matrotx,D3DXToRadian(-gunang));
D3DXMatrixRotationY(&matroty,yrot);
D3DXMatrixTranslation(&matmove,x-(cos(yrot)*64-sin(yrot)*32),y-24-sin(D3DXToRadian(gunang)),z+(sin(yrot)*64+cos(yrot)*32));
if (camdir>gundir) gundir+=(camdir-gundir)/8;
if (camdir<gundir) gundir-=(gundir-camdir)/8;
if (camang>gunang) gunang+=(camang-gunang)/8;
if (camang<gunang) gunang-=(gunang-camang)/8;
if (camang>85) camang=85;
if (camang<-85) camang=-85;
D3DXMatrixMultiply(&trans,&matrotx,&matroty);
D3DXMatrixMultiply(&trans,&trans,&matmove);
d3ddev->SetTransform(D3DTS_WORLD, &trans);
d3ddev->SetStreamSource(0,gunshot_buffer,0,sizeof(CUSTOMVERTEX));
time++;
if (time>5) time=0;
if (time==5 && ammo>0)
{
shoot_animation=!shoot_animation;
if (shoot_animation && shooting)
{
ammo--;
if (aim+1) enemys[aim].hp-=50;
}
}
if (shooting && shoot_animation && ammo>0)
{
gun_shot.draw_model();
d3ddev->DrawPrimitive(D3DPT_LINELIST,0,1);
}
else
{
gun.draw_model();
}
D3DXMatrixIdentity(&matrotx);
D3DXMatrixIdentity(&matroty);
D3DXMatrixIdentity(&matmove);
D3DXMatrixMultiply(&trans,&matrotx,&matroty);
D3DXMatrixMultiply(&trans,&trans,&matmove);
d3ddev->SetTransform(D3DTS_WORLD, &trans);
D3DXMatrixScaling(&trans,1,2,1);
d3ddev->SetTransform(D3DTS_WORLD, &trans);
terrain.draw_model();
d3dspt->Begin(D3DXSPRITE_ALPHABLEND);
RECT box,bar;
box.left=0;
box.top=0;
box.right=64;
box.bottom=32;
bar.left=0;
bar.top=32;
bar.right=(LONG) ((64.0f/100.0f)*ammo);
bar.bottom=64;
draw_texture(sprite,&box,16,16,255);
draw_texture(sprite,&bar,16,16,255);
// aim construction
aim=-1;
for (int i=0; i<5; i++)
{
static float newrot=0; newrot=gundir-90;
static float afw; afw=36-point_distance(x,z,enemys[i].x,enemys[i].z)/9;
if (afw<1) afw=1;
while (newrot>360) newrot-=360;
while (newrot<0 ) newrot+=360;
if (round(point_direction(x,z,enemys[i].x,enemys[i].z)/afw)==round(newrot/afw) && !enemys[i].killed) aim=i;
if (point_distance(x,z,enemys[i].x,enemys[i].z)<16 && time>2) hp-=5;
}
if (aim<0) draw_texture(sprite2,NULL,320-64,240-64,128);
else draw_texture(sprite3,NULL,320-64,240-64,128);
// hp construction
box.left=0;
box.top=0;
box.right=128;
box.bottom=16;
bar.left=0;
bar.top=16;
bar.right=(LONG) ((128.0f/100.0f)*hp);
bar.bottom=32;
draw_texture(hpbar,&box,320-64,480-32,128);
draw_texture(hpbar,&bar,320-64,480-32,128);
if (hp<0)
{
draw_texture(gameover,NULL,320-128,240-64,255);
ammo=0;
}
if (shooting && shoot_animation && ammo==0 && hp>0)
{
draw_texture(reload,NULL,320-128,240-64,128);
}
d3dspt->End();
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
return;
}
void cleanD3D(void)
{
d3ddev->Release();
d3d->Release();
gun.Release();
gun_shot.Release();
terrain.Release();
for (int i=0; i<5; i++)
{
enemys[i].Release();
}
gunshot_buffer->Release();
clean_input();
return;
}
void init_graphics(void)
{
srand(GetTickCount());
float step=1,steps=18;
make_texture(&loading,"data/load.bmp");
gun.init_model("data/gun.x"); render_loadscreen(step++,steps);
gun_shot.init_model("data/gun_shot.x"); render_loadscreen(step++,steps);
terrain.init_model("data/terrain_hill.x"); render_loadscreen(step++,steps);
for (int idx=0; idx<5; idx++)
{
enemys[idx].init(-256.0f+random(512),0.0f,-256.0f+random(512));
}
render_loadscreen(step++,steps);
D3DXCreateTextureFromFile(d3ddev,"data/clean.bmp",&clean); render_loadscreen(step++,steps);
make_texture(&sprite ,"data/ui1.bmp"); render_loadscreen(step++,steps);
make_texture(&sprite2 ,"data/ui2.bmp"); render_loadscreen(step++,steps);
make_texture(&sprite3 ,"data/ui3.bmp"); render_loadscreen(step++,steps);
make_texture(&hpbar ,"data/ui4.bmp"); render_loadscreen(step++,steps);
make_texture(&reload ,"data/ui5.bmp"); render_loadscreen(step++,steps);
make_texture(&gameover,"data/ui6.bmp"); render_loadscreen(step++,steps);
guy_stand.init_model("data/guy_stand.x"); render_loadscreen(step++,steps);
guy_dead.init_model("data/guy_dead.x"); render_loadscreen(step++,steps);
guy_wanim1.init_model("data/guy_wanim_1.x"); render_loadscreen(step++,steps);
guy_wanim2.init_model("data/guy_wanim_2.x"); render_loadscreen(step++,steps);
guy_wanim3.init_model("data/guy_wanim_3.x"); render_loadscreen(step++,steps);
D3DVECTOR normal;
normal.x=0;
normal.y=1;
normal.z=0;
CUSTOMVERTEX gunshot[]=
{
{0,0,0,normal,},
{-1024,0,0,normal,},
};
d3ddev->CreateVertexBuffer(2*sizeof(CUSTOMVERTEX),0,CUSTOMFVF,
D3DPOOL_MANAGED,&gunshot_buffer,NULL); render_loadscreen(step++,steps);
VOID* pvoid;
gunshot_buffer->Lock(0,0,(void**)&pvoid,0);
memcpy(pvoid,gunshot,sizeof(gunshot)); render_loadscreen(step++,steps);
gunshot_buffer->Unlock();
loading->Release();
return;
}
void init_light(void)
{
D3DLIGHT9 light;
ZeroMemory(&light, sizeof(light));
light.Type = D3DLIGHT_DIRECTIONAL;
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
light.Diffuse.a = 1.0f;
D3DVECTOR vecDirection = {-0.5f, -0.5f, 0.0f};
light.Direction = vecDirection;
light.Specular.r = 1.0f;
light.Specular.g = 1.0f;
light.Specular.b = 1.0f;
light.Specular.a = 1.0f;
d3ddev->SetLight(0, &light);
d3ddev->LightEnable(0, TRUE);
return;
}
void init_input(HINSTANCE hInstance, HWND hWnd)
{
DirectInput8Create(hInstance,DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&din,NULL);
din->CreateDevice(GUID_SysKeyboard,&dinkeyboard,NULL);
din->CreateDevice(GUID_SysMouse ,&dinmouse ,NULL);
dinkeyboard->SetDataFormat(&c_dfDIKeyboard);
dinmouse-> SetDataFormat(&c_dfDIMouse );
dinkeyboard->SetCooperativeLevel(hWnd,DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);
dinmouse-> SetCooperativeLevel(hWnd,DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);
dinmouse->Acquire();
return;
}
void detect_keys(void)
{
static BYTE keystate[256];
dinkeyboard->Acquire();
dinkeyboard->GetDeviceState(256, (LPVOID)keystate);
if (hp<0) return;
if(keystate[DIK_W] & 0x80)
{
x+= cos(D3DXToRadian((float)camdir))*4;
z-= sin(D3DXToRadian((float)camdir))*4;
walked++;
}
if(keystate[DIK_S] & 0x80)
{
x+= cos(D3DXToRadian((float)camdir+180))*4;
z-= sin(D3DXToRadian((float)camdir+180))*4;
walked++;
}
if(keystate[DIK_A] & 0x80)
{
x+= cos(D3DXToRadian((float)camdir-90))*4;
z-= sin(D3DXToRadian((float)camdir-90))*4;
walked++;
}
if(keystate[DIK_D] & 0x80)
{
x+= cos(D3DXToRadian((float)camdir+90))*4;
z-= sin(D3DXToRadian((float)camdir+90))*4;
walked++;
}
if (x>512) x=512;
if (x<-512) x=-512;
if (z>512) z=512;
if (z<-512) z=-512;
return;
}
void detect_mousepos(void)
{
static DIMOUSESTATE mouse;
dinmouse->Acquire();
dinmouse->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&mouse);
if(mouse.rgbButtons[0] & 0x80)
{
shooting=true;
}
else
{
shooting=false;
}
mouse_x=(float)mouse.lX;
mouse_y=(float)mouse.lY;
camdir+=mouse_x/16;
camang-=mouse_y/16;
return;
}
void clean_input(void)
{
dinkeyboard->Unacquire();
dinmouse ->Unacquire();
din ->Release();
return;
}
void make_texture(LPDIRECT3DTEXTURE9 *pOut,LPCTSTR filename)
{
D3DXCreateTextureFromFileEx(d3ddev,filename,D3DX_DEFAULT,D3DX_DEFAULT,
D3DX_DEFAULT,NULL,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,
D3DX_DEFAULT,D3DX_DEFAULT,D3DCOLOR_XRGB(255, 0, 255),
NULL,NULL,pOut);
return;
}
void draw_texture(LPDIRECT3DTEXTURE9 texture, RECT* texcoords, int x, int y, int alpha)
{
D3DXVECTOR3 center(0.0f, 0.0f, 0.0f), position((float)x,(float)y, 0.0f);
d3dspt->Draw(texture, texcoords, ¢er, &position, D3DCOLOR_ARGB(alpha, 255, 255, 255));
return;
}
void render_loadscreen(float a,float b)
{
d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->BeginScene();
d3dspt->Begin(D3DXSPRITE_ALPHABLEND);
RECT box,bar;
box.left=0;
box.top=0;
box.right=256;
box.bottom=256;
bar.left=256;
bar.top=0;
bar.right=(LONG) ((a/b)*256+256);
bar.bottom=256;
draw_texture(loading,&box,320-128,240-128,255);
draw_texture(loading,&bar,320-128,240-128,255);
d3dspt->End();
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
return;
}
float pos(float neg)
{
if (neg<0) return neg*-1;
else return neg* 1;
}
float point_direction(float x1,float y1,float x2,float y2)
{
return D3DXToDegree(atan2(x2-x1,y2-y1))+180;
}
float point_distance (float x1,float y1,float x2,float y2)
{
return sqrt( (pow(x2-x1,2))+(pow(y2-y1,2)) );
}
float MIN(float a,float b,float c,float d,float e,float f)
{
if (a<=b && a<=c && a<=d && a<=e && a<=f) return a;
if (b<=a && b<=c && b<=d && b<=e && b<=f) return b;
if (c<=a && c<=b && c<=d && c<=e && c<=f) return c;
if (d<=a && d<=c && d<=c && d<=e && d<=f) return d;
if (e<=a && e<=c && e<=d && e<=d && e<=f) return e;
if (f<=a && f<=b && f<=c && f<=d && f<=e) return f;
return 0;
}
float MAX(float a,float b,float c,float d,float e,float f)
{
if (a>=b && a>=c && a>=d && a>=e && a>=f) return a;
if (b>=a && b>=c && b>=d && b>=e && b>=f) return b;
if (c>=a && c>=b && c>=d && c>=e && c>=f) return c;
if (d>=a && d>=c && d>=c && d>=e && d>=f) return d;
if (e>=a && e>=c && e>=d && e>=d && e>=f) return e;
if (f>=a && f>=b && f>=c && f>=d && f>=e) return f;
return 0;
}
float round(float x)
{
int y=(int) x;
int z=(int) x+1;
float d1=pos((float)z-x),d2=pos((float)y-x);
if (d1>d2) return (float)y;
else return (float)z;
}
int random(int max)
{
return rand()%(int)max;
}
Created by GeSHI 1.0.7.18