?? main.cpp
字號:
//main.cpp
#include<windows.h>
#include<ddraw.h>
#pragma comment(lib,"ddraw")
#pragma comment(lib,"winmm")
#include "Gamelib/DDUTIL.h"
#include "Gamelib/commontool.h"
#include "Gamelib/wave.h"
#include "arrow.h"
#include "arrow1.h"
#include "stage.h"
#include "resource.h"
#include "score.h"
#include "dance.h"
#include "alpha.h"
LPDIRECTDRAW lpDD=NULL;
LPDIRECTDRAWSURFACE lpDDSPrimary=NULL;
LPDIRECTDRAWSURFACE lpDDSBack=NULL;
LPDIRECTDRAWSURFACE lpDDBasic=NULL;
LPDIRECTDRAWSURFACE lpDDBasicgreen=NULL;
LPDIRECTDRAWSURFACE lpDDBasicyellow=NULL;
LPDIRECTDRAWSURFACE lpDDArrow1=NULL;
LPDIRECTDRAWSURFACE lpDDArrow2=NULL;
LPDIRECTDRAWSURFACE lpDDArrow3=NULL;
LPDIRECTDRAWSURFACE lpDDArrow4=NULL;
LPDIRECTDRAWSURFACE lpDDLogo=NULL;
LPDIRECTDRAWSURFACE lpDDBgm1=NULL;
LPDIRECTDRAWSURFACE lpDDBgm2=NULL;
LPDIRECTDRAWSURFACE lpDDBgm3=NULL;
LPDIRECTDRAWSURFACE lpDDHelp=NULL;
LPDIRECTDRAWSURFACE lpDDMum=NULL;
LPDIRECTDRAWSURFACE lpDDHit=NULL;
LPDIRECTDRAWSURFACE lpDDStart=NULL;
LPDIRECTDRAWSURFACE lpDDSelect=NULL;
LPDIRECTDRAWSURFACE lpDDMan=NULL;
LPDIRECTDRAWSURFACE lpDDSPic3=NULL;
LPDIRECTSOUNDBUFFER pSBuf[4];
BOOL bActive=false;
#define SAFE_FREE(x) {if((x)){(x)->Release();(x)=NULL;}}
int posx=0,posy=0;
HWND hWnd;
WPARAM wParam;
ARROW arrow[1000];
static quantity=0;//數量
extern int hhytop,hhyleft,hhyright,hhybottom;
int score=0;
extern bool en1,en2,en3,en4;
int first=0,Fang=4;
int SPEED=15;
int STATE=0;//游戲狀態標志
int STAGE=1;//游戲當前的關數
bool help=false,wudi=false,info=false;//是否開啟幫助
int hit=0;//連續擊中箭頭數
DWORD DELAY=600;
extern DWORD delay;
int frameselect=1,SELECT=0,min=0;
int SP=0,SP1=0;//是否可以升級速度,為1時可以,其他情況都不可以
void FreeAll()
{
SAFE_FREE(lpDDSBack);
SAFE_FREE(lpDDSPrimary);
SAFE_FREE(lpDDBasic);
SAFE_FREE(lpDDBasicgreen);
SAFE_FREE(lpDDBasicyellow);
SAFE_FREE(lpDDArrow1);
SAFE_FREE(lpDDArrow2);
SAFE_FREE(lpDDArrow3);
SAFE_FREE(lpDDArrow4);
SAFE_FREE(lpDDLogo);
SAFE_FREE(lpDDBgm1);
SAFE_FREE(lpDDBgm2);
SAFE_FREE(lpDDBgm3);
SAFE_FREE(lpDDHelp);
SAFE_FREE(lpDDMum);
SAFE_FREE(lpDDHit);
SAFE_FREE(lpDDStart);
SAFE_FREE(lpDDSelect);
SAFE_FREE(lpDDMan);
SAFE_FREE(lpDD);
}
HRESULT RestoreAll()
{
HRESULT ddrval;
ddrval=lpDDSPrimary->Restore();
ddrval=lpDDSBack->Restore();
ddrval=lpDDBasic->Restore();
ddrval=lpDDBasicgreen->Restore();
ddrval=lpDDBasicyellow->Restore();
ddrval=lpDDArrow1->Restore();
ddrval=lpDDArrow2->Restore();
ddrval=lpDDArrow3->Restore();
ddrval=lpDDArrow4->Restore();
ddrval=lpDDLogo->Restore();
ddrval=lpDDBgm1->Restore();
ddrval=lpDDBgm2->Restore();
ddrval=lpDDBgm3->Restore();
ddrval=lpDDHelp->Restore();
ddrval=lpDDMum->Restore();
ddrval=lpDDHit->Restore();
ddrval=lpDDStart->Restore();
ddrval=lpDDSelect->Restore();
ddrval=lpDDMan->Restore();
ddrval=::DDReLoadBitmap(lpDDBasic,"pic/basic.bmp");
ddrval=::DDReLoadBitmap(lpDDBasicgreen,"pic/basicgreen.bmp");
ddrval=::DDReLoadBitmap(lpDDBasicyellow,"pic/basicyellow.bmp");
ddrval=::DDReLoadBitmap(lpDDArrow1,"pic/top.bmp");
ddrval=::DDReLoadBitmap(lpDDArrow2,"pic/left.bmp");
ddrval=::DDReLoadBitmap(lpDDArrow3,"pic/bottom.bmp");
ddrval=::DDReLoadBitmap(lpDDArrow4,"pic/right.bmp");
ddrval=::DDReLoadBitmap(lpDDLogo,"pic/logo.bmp");
ddrval=::DDReLoadBitmap(lpDDBgm1,"pic/GUN-01.bmp");
ddrval=::DDReLoadBitmap(lpDDBgm2,"pic/GUN-02.bmp");
ddrval=::DDReLoadBitmap(lpDDBgm3,"pic/GUN-03.bmp");
ddrval=::DDReLoadBitmap(lpDDHelp,"pic/help.bmp");
ddrval=::DDReLoadBitmap(lpDDMum,"pic/mumber.bmp");
ddrval=::DDReLoadBitmap(lpDDHit,"pic/hit.bmp");
ddrval=::DDReLoadBitmap(lpDDStart,"pic/start.bmp");
ddrval=::DDReLoadBitmap(lpDDSelect,"pic/select.bmp");
ddrval=::DDReLoadBitmap(lpDDMan,"pic/man.bmp");
return ddrval;
}
void INITARROW()//重新初始化箭頭
{
for(int i=0;i<=999;i++)
{
arrow[i].SetMove(false);
arrow[i].SetEnable(true);
arrow[i].flag=4;
arrow[i].SetDirection(rand()%4);
arrow[i].TIME();
switch(arrow[i].GetDirection())
{
case 0:
{
arrow[i].SetPosx(70);
arrow[i].SetPosy(768);
}
break;
case 1:
{
arrow[i].SetPosx(170);
arrow[i].SetPosy(768);
}
break;
case 2:
{
arrow[i].SetPosx(290);
arrow[i].SetPosy(768);
}
break;
case 3:
{
arrow[i].SetPosx(390);
arrow[i].SetPosy(768);
}
break;
}//end of switch
}//end of for
}
//*
void AM()//每DELAY毫秒激活一個箭頭
{
static DWORD oldTime=timeGetTime();
if(timeGetTime()-oldTime>DELAY)
{
arrow[quantity].SetMove(true);
quantity++;
if(quantity==999)
{
INITARROW();
quantity=0;
STATE=0;
SP=0;SP1=0;
hit=0;
score=0;
}//end of if
oldTime=timeGetTime();
}
else
{
quantity=quantity;
arrow[quantity].SetMove(true);
}
}
//*/
void EvMove()//讓所有的箭頭自動移動
{
for(int i=0;i<=999;i++)
{
arrow[i].ArrowMove();
}
}
int Adjust()//判斷按下的是什么方向
{
if(en1||en2||en3||en4)
return Fang;
else
return (Fang=4);
}
void First()//判斷最上面的箭頭的形狀
{
static DWORD oldTime=timeGetTime();
if(timeGetTime()-oldTime>100)
{
arrow[first].flag=4;
oldTime=timeGetTime();
}
else
{
arrow[first].flag=Adjust();
}
}
void WUDI()//作弊
{
if(arrow[first].GetPosy()>25&&arrow[first].GetPosy()<55&&wudi==true)
{
arrow[first].flag=arrow[first].GetDirection();
}
}
void Disappear()//判斷該箭頭是否應該消失
{
//for(int i=0;i<=29;i++)
//{
if(arrow[first].GetMove())
{
if(arrow[first].GetPosy()<0)
{
if(arrow[first].GetMove()==true)
score-=4;
if(score<0)score=0;
arrow[first].SetMove(false);
hit=0;
arrow[first].SetPosy(768);
first++;
}
/*switch(arrow[i].GetDirection())
{
case 0:
arrow[i].flag=hhytop;
break;
case 1:
arrow[i].flag=hhyleft;
break;
case 2:
arrow[i].flag=hhybottom;
break;
case 3:
arrow[i].flag=hhyright;
break;
}*/
First();WUDI();
if(arrow[first].GetPosy()>25&&arrow[first].GetPosy()<55&&arrow[first].flag==arrow[first].GetDirection())
{
//Basicright(Adjust());
arrow[first].SetMove(false);
score+=10;
arrow[first].SetPosy(768);
first++;
hit++;
}
/*if(arrow[first].GetPosy()<25&&arrow[first].GetPosy()>0&&arrow[first].flag!=arrow[first].GetDirection())
{
Basicwrong(Adjust());
score-=8;
}*/
}//if
//}//for
}
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam )
{
switch(message)
{
case WM_ACTIVATEAPP:
bActive=wParam;
break;
case WM_SETCURSOR:
SetCursor(NULL);
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
case VK_LEFT:
if(SELECT==1)frameselect--;
if(frameselect<0)frameselect=2;
en2=true;
Fang=1;
//Left();
break;
case VK_RIGHT:
if(SELECT==1)frameselect++;
if(frameselect>2)frameselect=0;
en4=true;
Fang=3;
//Right();
break;
case VK_UP:
en1=true;
Fang=0;
//Top();
break;
case VK_DOWN:
en3=true;
Fang=2;
//Bottom();
break;
case VK_CONTROL:
hhytop=4;
break;
case VK_SHIFT:
break;
case VK_F1:
if(help)
{
help=false;break;
}
if(!help)
{
help=true;break;
}
break;
case VK_F2:
if(wudi)
{
wudi=false;break;
}
if(!wudi)
{
wudi=true;break;
}
break;
case VK_F3:
if(info)
{
info=false;break;
}
if(!info)
{
info=true;break;
}
break;
case VK_F4://開啟畫中畫
min++;
if(min>1)
min=0;
break;
break;
case VK_F5://開啟文檔
ShellExecute(hWnd, "open", "MusicShow.htm", NULL, NULL,SW_MAXIMIZE);
break;
case VK_RETURN:
if(STATE==0)
{
STATE=1;SELECT=1;pSBuf[3]->Stop();break;
}
if(STATE==1)
{
STATE=0;pSBuf[0]->Stop();pSBuf[1]->Stop();pSBuf[2]->Stop();pSBuf[3]->Play(0,0,1);break;
}
break;
case VK_SPACE:
if(SELECT==0)
{
SELECT=1;
break;
}
if(SELECT==1)
{
STATE=1;
break;
}
break;
}
break;
case WM_DESTROY:
FreeAll();
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 1;
}
bool InitWindow(HINSTANCE hInstance,int nCmdShow )
{
WNDCLASS wc;
wc.style=0;
wc.lpfnWndProc=WinProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=NULL;
wc.hCursor=NULL;
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName="Arrow";
RegisterClass(&wc);
hWnd=CreateWindow("Arrow","Arrow",WS_POPUP,0,0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
NULL,
NULL,
hInstance,
NULL);
if(!hWnd )
return false;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd );
return true;
}
#define D_ASSERT(x) {if((x)!=DD_OK)return false;}
BOOL InitDDraw(void)
{
DDSURFACEDESC ddsd;
D_ASSERT(DirectDrawCreate(NULL,&lpDD,NULL));
D_ASSERT(lpDD->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN));
D_ASSERT(lpDD->SetDisplayMode(1024,768,16));
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
ddsd.dwBackBufferCount=1;
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_COMPLEX|DDSCAPS_FLIP;
D_ASSERT(lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL));
ddsd.ddsCaps.dwCaps=DDSCAPS_BACKBUFFER;
D_ASSERT(lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDSBack));
if(!(lpDDBasic=::DDLoadBitmap(lpDD,"pic/basic.bmp",282,81)))
return false;
if(!(lpDDBasicgreen=::DDLoadBitmap(lpDD,"pic/basicgreen.bmp",282,81)))
return false;
if(!(lpDDBasicyellow=::DDLoadBitmap(lpDD,"pic/basicyellow.bmp",282,81)))
return false;
if(!(lpDDArrow1=::DDLoadBitmap(lpDD,"pic/top.bmp",305,81)))
return false;
if(!(lpDDArrow2=::DDLoadBitmap(lpDD,"pic/left.bmp",405,61)))
return false;
if(!(lpDDArrow3=::DDLoadBitmap(lpDD,"pic/bottom.bmp",305,81)))
return false;
if(!(lpDDArrow4=::DDLoadBitmap(lpDD,"pic/right.bmp",405,61)))
return false;
if(!(lpDDLogo=::DDLoadBitmap(lpDD,"pic/logo.bmp",359,220)))
return false;
if(!(lpDDBgm1=::DDLoadBitmap(lpDD,"pic/GUN-01.bmp",800,600)))
return false;
if(!(lpDDBgm2=::DDLoadBitmap(lpDD,"pic/GUN-02.bmp",800,600)))
return false;
if(!(lpDDBgm3=::DDLoadBitmap(lpDD,"pic/GUN-03.bmp",800,600)))
return false;
if(!(lpDDHelp=::DDLoadBitmap(lpDD,"pic/help.bmp",324,240)))
return false;
if(!(lpDDMum=::DDLoadBitmap(lpDD,"pic/mumber.bmp",200,500)))
return false;
if(!(lpDDHit=::DDLoadBitmap(lpDD,"pic/hit.bmp",254,115)))
return false;
if(!(lpDDSelect=::DDLoadBitmap(lpDD,"pic/select.bmp",194,300)))
return false;
if(!(lpDDStart=::DDLoadBitmap(lpDD,"pic/start.bmp",340,31)))
return false;
if(!(lpDDMan=::DDLoadBitmap(lpDD,"pic/man.bmp",3575,52)))
return false;
lpDDSPic3=::DDLoadBitmap(lpDD,"pic/help.bmp",324,240);
::DDSetColorKey(lpDDBasic,RGB(255,255,255));
::DDSetColorKey(lpDDArrow1,RGB(255,255,255));
::DDSetColorKey(lpDDArrow2,RGB(255,255,255));
::DDSetColorKey(lpDDArrow3,RGB(255,255,255));
::DDSetColorKey(lpDDArrow4,RGB(255,255,255));
::DDSetColorKey(lpDDMum,RGB(255,255,255));
::DDSetColorKey(lpDDHit,RGB(255,255,255));
::DDSetColorKey(lpDDStart,RGB(255,255,255));
::DDSetColorKey(lpDDSelect,RGB(255,255,255));
::DDSetColorKey(lpDDMan,RGB(255,255,255));
InitSound();
pSBuf[0] = createbuffer("wav/男人的錯.wav");
pSBuf[1] = createbuffer("wav/la la la lovesong.wav");
pSBuf[2] = createbuffer("wav/圣斗士-地球儀.wav");
pSBuf[3] = createbuffer("wav/main_bgm.wav");
pSBuf[3]->Play(0,0,1);
return true;
}
void FPS1()//TEST
{
HDC hdc;
char buf[32];
memset(buf,0,32);
lpDDSBack->GetDC(&hdc);
::SetBkMode(hdc,TRANSPARENT);
::SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,610,10,buf,wsprintf(buf,"hhytop:%d",hhytop));
TextOut(hdc,610,30,buf,wsprintf(buf,"hhyledt:%d",hhyleft));
TextOut(hdc,610,50,buf,wsprintf(buf,"hhyright:%d",hhyright));
TextOut(hdc,610,70,buf,wsprintf(buf,"hhybottom:%d",hhybottom));
TextOut(hdc,610,90,buf,wsprintf(buf,"hit:%d",hit));
TextOut(hdc,610,110,buf,wsprintf(buf,"score:%d",score));
TextOut(hdc,610,130,buf,wsprintf(buf,"quantity:%d",quantity));
TextOut(hdc,610,150,buf,wsprintf(buf,"SPEED:%d",SPEED));
lpDDSBack->ReleaseDC(hdc);
}
void GRADE()//升級
{
if(score>=1000&&score<3000)SP++;
if(SP==1){STAGE=2;SPEED+=5;}
if(score>3000&&score<6000)SP1++;
if(SP1==1){STAGE=3;SPEED+=10;}
}
void UpdateScreen()
{
HRESULT ddrval;
if(STATE==0&&SELECT==0)//開始畫面
{
LOGO();Start();
pSBuf[2]->Stop();pSBuf[3]->Play(0,0,1);
}
if(STATE==0&&SELECT==1)
{
LOGO();Select(frameselect);STAGE=1;score=0;
if(frameselect==0){SPEED=15;DELAY=600;}
if(frameselect==1){SPEED=20;DELAY=400;}
if(frameselect==2){SPEED=25;DELAY=200;}
}
if(STATE==1&&SELECT==1)//正式開始游戲
{
pSBuf[3]->Stop();
GRADE();
if(STAGE==1)
{
StageShow(lpDDBgm1);
pSBuf[1]->Stop();
pSBuf[2]->Stop();
pSBuf[0]->Play(0,0,1);
}
if(STAGE==2)
{
StageShow(lpDDBgm2);
pSBuf[0]->Stop();
pSBuf[2]->Stop();
pSBuf[1]->Play(0,0,1);
}
if(STAGE==3)
{
StageShow(lpDDBgm3);
pSBuf[0]->Stop();
pSBuf[1]->Stop();
pSBuf[2]->Play(0,0,1);
}
ShowHit();ShowScore();
Basic();
AM();
Disappear();
EvMove();
Top();Left();Right();Bottom();
Mandance();
HELP();
//ALPHA(0.6);
}
if(info){FPS1();FPS();}//顯示游戲變量
if(min==1)MINCREEN();
while(1)
{
ddrval=lpDDSPrimary->Flip(0,0);
if(ddrval==DD_OK)
break;
if(ddrval==DDERR_SURFACELOST)
RestoreAll();
else
break;
}
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
if(!InitWindow(hInstance,nCmdShow))
return false;
if(!InitDDraw())
{
MessageBox(hWnd,"初始化DirectDraw過程中出錯!", "",MB_OK);
FreeAll();
DestroyWindow(hWnd);
return false;
}
while(1)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(bActive)
{
UpdateScreen();
}
else
WaitMessage();
}
return true;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -