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

📄 main.cpp

📁  ?跳舞机的源代码 自己修改一下 编译没有问题
💻 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 + -