?? fight.cpp
字號:
#ifdef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include<windows.h>
#include<windowsx.h>
#include<ddraw.h>
#include<stdio.h>
#include<stdlib.h>
#include<mmsystem.h>
#include<math.h>
#include<direct.h>
#include<wingdi.h>
#include<dsound.h>
#include<winbase.h>
#include<dinput.h>
#include"resource.h"
#include"ddutil.h"
#include"dsutil.h"
#define GameLogo 1//進(jìn)入游戲
#define GameInit 2//
#define GameReady 3
#define GameStart 4//游戲開始
#define GamePass 5//游戲過關(guān)
#define GameWin 6//游戲勝利
#define GameOver 7//游戲結(jié)束
#define GameSpeed 1//游戲速度
#define DINPUT_BUFFERSIZE 16
#define Aup 0
#define Aright 1
#define Adown 2
#define Aleft 3
#define cenemy 10//敵機(jī)數(shù)量
#define ctree 40//樹的數(shù)量
#define cmap 10//游戲地圖數(shù)
#define leftblank 100//地圖離左邊的象素距離
#define super 0//
#define control 1//用于無敵時的情況
#define Fplane 0//飛機(jī)發(fā)射的子彈
#define Fenemy 1//地極發(fā)射的子彈
#define TimeValue 20
#define name "fight"
#define title "fight"
class PLANE
{
public:
int planestatus;//飛機(jī)狀態(tài)
int lifenum;//飛機(jī)的生命數(shù)
int x,y;//飛機(jī)坐標(biāo)
int height,width;//飛機(jī)頁面的尺寸
int speed;//飛機(jī)速度
int direct;//飛機(jī)方向
bool bfire;//是否可以發(fā)射子彈
bool bdead;//飛機(jī)是否死亡
};
class FIRE
{
public:
int x,y;
int height,width;
int speed;
int direct;
int Efire;
bool bdead;//子彈是否還需要顯示
bool type;//是飛機(jī)發(fā)射的還是敵機(jī)發(fā)射的
};
class ENEMY
{
public:
int x,y;
int height,width;
int speed;
int direct;
bool bfire;
bool bdead;
};
class TREE
{
public:
int x,y;
int height,width;
int type;//是指定樹的種類
};
class FLAME
{
public:
int x,y;
int height,width;
int ftps;//所顯示的是爆炸過程的第ftps屏
bool bdead;
};
class MAP
{
public:
int x,y;
int height,width;
};
LPDIRECTDRAW lpdd=NULL;
LPDIRECTDRAWSURFACE lpddsprimary=NULL;
LPDIRECTDRAWSURFACE lpddsback=NULL;
LPDIRECTDRAWSURFACE lpddsbackground=NULL;
LPDIRECTDRAWSURFACE lpddsmap=NULL;
LPDIRECTDRAWSURFACE lpddsflame=NULL;
LPDIRECTDRAWSURFACE lpddstree[3];
LPDIRECTDRAWSURFACE lpddsplane[4];
LPDIRECTDRAWSURFACE lpddsenemy[4];
LPDIRECTDRAWSURFACE lpddsfire[4];
LPDIRECTSOUND lpds=NULL;
LPDIRECTSOUNDBUFFER lpdsbprimary=NULL;
LPDIRECTSOUNDBUFFER lpdsbshot=NULL;
LPDIRECTINPUT lpdi=NULL;
LPDIRECTINPUTDEVICE lpKeybord=NULL;
unsigned int active;//窗口是否激活
int gamestatus=GameLogo;//游戲的進(jìn)度
int gamerank=0;//游戲等級
int supertime=0;//飛機(jī)無敵的時間數(shù);
HWND hWnd=NULL;
PLANE A11;
ENEMY Aenemy[cenemy];
FLAME Aflame[cenemy];
FIRE Afire[cenemy];
TREE Atree[ctree];
MAP Amap;
DWORD thistickcount;
DWORD lasttickcount;
char apppath[50]; //應(yīng)用程序路徑
char openmidi[50]; //打開midi命令字符串
char closemidi[50]; //關(guān)閉midi命令字符串
char stopmidi[50];
int nsorce;
HRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wParam,
LPARAM lParam);
HWND InitWin(HINSTANCE hInstance,int nCmdShow);
void GetRect(RECT *rect,long x,long y,long height,long width);
void FreeObject(void);
void InitData(void);//初始化數(shù)據(jù)
bool InitDraw(void);//初始化directdraw接口
bool InitSound(void);
bool InitInput(HWND);
HRESULT UpdataInputData(void);
void InitPass(void);//處理過關(guān)后的數(shù)據(jù)變換
bool DrawMap(void);
bool DrawPlane(void);
bool DrawEnemy(void);
bool DrawFire(void);
bool DrawFlame(void);
bool DrawInfoText(void);
void DrawText(void);
void GetInput(void);
void EnemyAI(void);//處理控制敵機(jī)發(fā)彈、飛行、躲避的動作
bool Hit(RECT drect,RECT srect);
void Checkhit(void);
void DataPro(void);//處理飛機(jī)、子彈發(fā)彈、飛行、躲避動作后數(shù)據(jù)處理
void PlaySound(void);
void UpFlame(void);
void Flip(void);
void ClrScr(void);//清屏;
void FreeObject(void)
{
if (lpdi!=NULL)
{
if(lpKeybord)
{
lpKeybord->Unacquire();
lpKeybord->Release();
lpKeybord = NULL;
}
lpdi->Release();
lpdi = NULL;
}
if(lpds!=NULL)
{
if(lpdsbprimary!=NULL)
{
lpdsbprimary->Release();
lpdsbprimary=NULL;
}
if(lpdsbshot!=NULL)
{
lpdsbshot->Release();
lpdsbshot=NULL;
}
}
if(lpdd!=NULL)
{
if(lpddsprimary!=NULL)
{
lpddsprimary->Release();
lpddsprimary=NULL;
}
if(lpddsback!=NULL)
{
lpddsback->Release();
lpddsback=NULL;
}
if(lpddsbackground!=NULL)
{
lpddsbackground->Release();
lpddsbackground=NULL;
}
if(lpddsmap!=NULL)
{
lpddsmap->Release();
lpddsmap=NULL;
}
if(lpddsflame!=NULL)
{
lpddsflame->Release();
lpddsflame=NULL;
}
for(int i=0;i<3;i++)
if(lpddstree[i]!=NULL)
{
lpddstree[i]->Release();
lpddstree[i]=NULL;
}
for( i=0;i<4;i++)
if(lpddsplane[i]!=NULL)
{
lpddsplane[i]->Release();
lpddsplane[i]=NULL;
}
for( i=0;i<4;i++)
if(lpddsenemy[i]!=NULL)
{
lpddsenemy[i]->Release();
lpddsenemy[i]=NULL;
}
for( i=0;i<4;i++)
if(lpddsfire[i]!=NULL)
{
lpddsfire[i]->Release();
lpddsfire[i]=NULL;
}
lpdd->Release();
lpdd=NULL;
}
}
//***********************************************
//初始化窗口類和創(chuàng)建窗口并返回hwnd,付給hWnd全局變量。
//***********************************************
HWND InitWin(HINSTANCE hInstance,int nCmdShow)
{
HWND hwnd;
WNDCLASS wc;
HDC hdc;
wc.style=CS_HREDRAW | CS_VREDRAW ;
wc.lpfnWndProc=WinProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,"icon");
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName=0;
wc.lpszClassName=name;
if(FAILED(RegisterClass(&wc)))
{
MessageBox(NULL,"failed in register",NULL,NULL);
return 0;
}
hwnd=CreateWindow(name,title,WS_OVERLAPPEDWINDOW,0,0,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
if(!hwnd)
{
MessageBox(hwnd,"failed in hwnd","HWND",NULL);
return FALSE;
}
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
SetFocus(hwnd);
hdc=GetDC(hwnd);
SetTextColor(hdc, RGB(250,250,250));
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc,250,200,"Loading...",10);
return hwnd;
}
//------------------------------------------------
//初始化directsound。
//-------------------------------------------------
bool InitSound(void)
{
HRESULT hr;
DSBUFFERDESC dsbdesc;
WAVEFORMATEX wfm;
if(FAILED(DirectSoundCreate(NULL,&lpds,NULL)))
{
OutputDebugString("failed in create directsound");
return FALSE;
}
if(FAILED(lpds->SetCooperativeLevel(hWnd,DSSCL_PRIORITY)))
{
OutputDebugString("failed in setcoolevel");
}
memset(&dsbdesc,0,sizeof(DSBUFFERDESC));
dsbdesc.dwSize=sizeof(DSBUFFERDESC);
dsbdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
dsbdesc.dwBufferBytes=0;
dsbdesc.lpwfxFormat=NULL;
ZeroMemory( &wfm, sizeof(WAVEFORMATEX) );
wfm.wFormatTag = WAVE_FORMAT_PCM;
wfm.nChannels = 2;
wfm.nSamplesPerSec = 22050;
wfm.wBitsPerSample = 16;
wfm.nBlockAlign = wfm.wBitsPerSample / 8 * wfm.nChannels;
wfm.nAvgBytesPerSec = wfm.nSamplesPerSec * wfm.nBlockAlign;
hr=lpds->CreateSoundBuffer(&dsbdesc,&lpdsbprimary,NULL);
if(SUCCEEDED(hr))
{
hr=lpdsbprimary->SetFormat(&wfm);
}
else
{
OutputDebugString("failed in create primary bufefer\n");
}
lpdsbshot=DSLoadSoundBuffer(lpds,"SHOT");
if(lpdsbshot==NULL)
{
OutputDebugString("failed in create shot buffer\n");
return FALSE;
}
return TRUE;
}
//*****************************************************
//播放聲音
//*****************************************************
void PlaySound(void)
{
if(lpdsbshot==NULL)return;
lpdsbshot->SetCurrentPosition(0);
if(FAILED(lpdsbshot->Play(0,0,0)))
{
OutputDebugString("failed in play");
}
return;
}
//*************************************************
//初始化directinput
//*************************************************
bool InitInput(HWND hwnd)
{
HRESULT hr;
hr=DirectInputCreate((HINSTANCE)GetWindowLong( hwnd, GWL_HINSTANCE ),
DIRECTINPUT_VERSION,
&lpdi,NULL);
if(FAILED(hr))
{
OutputDebugString("failed in create dinput");
return false;
}
hr=lpdi->CreateDevice(GUID_SysKeyboard,&lpKeybord,NULL);
if(FAILED(hr))
{
OutputDebugString("failed in create diput device");
return false;
}
hr=lpKeybord->SetDataFormat(&c_dfDIKeyboard);
if(FAILED(hr))
{
OutputDebugString("failed in setformat");
return false;
}
hr=lpKeybord->SetCooperativeLevel(hwnd,DISCL_NONEXCLUSIVE|
DISCL_FOREGROUND);
if(FAILED(hr))
{
OutputDebugString("failed in set co level");
return false;
}
DIPROPDWORD property;
property.diph.dwSize=sizeof(DIPROPDWORD);
property.diph.dwHeaderSize=sizeof(DIPROPHEADER);
property.diph.dwHow=DIPH_DEVICE;
property.diph.dwObj=0;
property.dwData=DINPUT_BUFFERSIZE;
hr=lpKeybord->SetProperty(DIPROP_BUFFERSIZE,&property.diph);
if(FAILED(hr))
{
OutputDebugString("failed in set property ");
return false;
}
hr=lpKeybord->Acquire();
if(FAILED(hr))
{
OutputDebugString("failed acquire the keyborad");
return false;
}
return true;
}
//*************************************************
//緩沖數(shù)據(jù)判斷
//*************************************************
HRESULT UpdataInputData(void)
{
DWORD i;
DIDEVICEOBJECTDATA didod[DINPUT_BUFFERSIZE];
DWORD dwElements;
HRESULT hr;
if(lpKeybord!=NULL)
{
hr=DIERR_INPUTLOST;
while(hr!=DI_OK)
{
dwElements=DINPUT_BUFFERSIZE;
hr=lpKeybord->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),
didod,
&dwElements,
0);
if(hr!=DI_OK)
{
hr=lpKeybord->Acquire();
if(FAILED(hr))
{
OutputDebugString("failed buffer data acquire");
return hr;
}
}
}
if(FAILED(hr))
{
OutputDebugString("failed buffer data acquire again");
return hr;
}
for(i=0; i<dwElements; i++)
{
if((int)didod[i].dwOfs==DIK_UP&&(didod[i].dwData&0x80))
{
A11.direct=Aup;
}
if((int)didod[i].dwOfs==DIK_RIGHT&&(didod[i].dwData&0x80))
{
A11.direct=Aright;
}
if((int)didod[i].dwOfs==DIK_DOWN&&(didod[i].dwData&0x80))
{
A11.direct=Adown;
}
if((int)didod[i].dwOfs==DIK_LEFT&&(didod[i].dwData&0x80))
{
A11.direct=Aleft;
}
if((int)didod[i].dwOfs==DIK_SPACE&&(didod[i].dwData&0x80))
{
if(A11.bfire)return S_OK;
A11.bfire=TRUE;
while(!Afire[i].bdead){i++;}
if(i<cenemy)
{
Afire[i].bdead=FALSE;
Afire[i].direct=A11.direct;
Afire[i].type=Fplane;
Afire[i].x=A11.x+2*A11.width/6;
Afire[i].y=A11.y+2*A11.height/6;
}
}
}
}
return S_OK;
}
//*************************************************
//初始化directx變量。并且傳遞全局變量hWnd給initdraw
//*************************************************
bool InitDraw(void)
{
DDSURFACEDESC ddsd;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -