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

📄 canvasframe.cpp

📁 用C++实现的名为下楼小游戏
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	CreateDDPla(95,15,"s_4_1.bmp",13);
	CreateDDPla(95,15,"s_4_2.bmp",14);
	CreateDDPla(95,30,"s_6.bmp",15);
	CreateDDPla(95,30,"s_5.bmp",16);
	CreateDDPla(96,34,"life_0.bmp",17);
	CreateDDPla(8,16,"life_element.bmp",18);
    CreateDDPla(195,55,"OPTION.bmp",19);
	CreateDDPla(125,55,"FAST.bmp",20);
	CreateDDPla(147,55,"SLOW.bmp",21);
	CreateDDPla(268,55,"QUIT.bmp",22);
	CreateDDPla(211,55,"TRUE.bmp",23);
    CreateDDPla(144,55,"BACK.bmp",24);
    CreateDDPla(375,15,"dingban.bmp",25);
	CreateDDPla(31,62,"p2_j.bmp",26);
	CreateDDPla(124,31,"p2_r_r.bmp",27);
	CreateDDPla(124,31,"p2_r_l.bmp",28);
	CreateDDPla(31,62,"b_p_j.bmp",29);
	CreateDDPla(124,31,"b_p_r_r.bmp",30);
	CreateDDPla(124,31,"b_p_r_l.bmp",31);
	CreateDDPla(31,31,"b_p_z.bmp",32);
    CreateDDPla(31,31,"p2_z.bmp",33);
	CreateDDPla(31,31,"p2_z.bmp",34);
    CreateDDPla(466,240,"titu.bmp",35);
	CreateDDPla(466,240,"stairs.bmp",36);
	CreateDDPla(30,440,"score.bmp",37);
	CreateDDPla(640,480,"sunset.bmp",38);
	CreateDDPla(240,480,"wallpaper.bmp",39);
	for(int i=1;i<=39;i++)//设定颜色键
		ColorKey(i);
	person1.set();
	person2.set();
}

canvasFrame::~canvasFrame()
{	
	delete bitmap;
	delete hdc;
	delete dhdc;
	DD->Release();
	DDSur->Release();
	for(int i=0;i<=39;i++)
		DDPla[i]->Release();
	pDI->Release();
	pDKB->Release();
	DI->Release();
	DIms->Release();
}
	

BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
	//{{AFX_MSG_MAP(canvasFrame)
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_WM_KEYDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// canvasFrame message handlers

int canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	InitDD();
	InitDI();
	SetTimer(1,50,NULL);//主计时器
	SetTimer(2,600,NULL);//生成石头的计时器
	SetTimer(3,900,NULL);
	SetTimer(4,0,NULL);
	SetTimer(5,300,NULL);
	SetTimer(6,0,NULL);
	SetTimer(7,350,NULL);
	// TODO: Add your specialized creation code here
	
	return 0;
}





void canvasFrame::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
    if(over)//游戏没开始
	{
		ge=0;
		reset_sto();
		S1[0].exist=true;
		S1[0].x=156;
		S1[0].y=480-15;
		person1.set();
		person2.set();
		if(nIDEvent==1)
		{
		if(p_what==1)//贴选择单打或双打的屏幕
		{
		DDBuf->BltFast( 0 , 0 , DDPla[0], CRect(0,0,640,480) , DDBLTFAST_WAIT);
		DDBuf->BltFast( 87, 0 , DDPla[35], CRect(0,0,466,240) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
        DDBuf->BltFast( 87, 0 , DDPla[36], CRect(0,0,466,240) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
		DDBuf->BltFast( 0, 0 , DDPla[38], CRect(0,0,640,480) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
        DDBuf->BltFast( 320-124 , 240 , DDPla[6], CRect(0,0,247,55) , 
			DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖1-PLAYER
		DDBuf->BltFast( 320-124 , 240+55 , DDPla[7], 
			CRect(0,0,248,55) , 
			DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖2-PLAYER
	    DDBuf->BltFast( 320-124 , 240+55+55 , DDPla[19], 
			CRect(0,0,195,55) , DDBLTFAST_WAIT|
			DDBLTFAST_SRCCOLORKEY);//帖OPTION
		DDBuf->BltFast( 320-124 , 240+55+55+55 , 
			DDPla[22], CRect(0,0,268,55) , 
			DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖QUIT
		DDBuf->BltFast(320-124-5-31-10 , y ,DDPla[2], CRect(0,0,31,31),
			DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖人
		}
		if(p_what==2)//按下OPTION后贴选择速度和石头的屏幕
		{
			DDBuf->BltFast( 0 , 0 , DDPla[0], CRect(0,0,640,480) , DDBLTFAST_WAIT);//帖背景
			DDBuf->BltFast( 320-80 , 100 , DDPla[20], CRect(0,0,125,55) , 
				DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖FAST
			if(fast==true)
				DDBuf->BltFast( 320-80+147+20 , 100 , 
				DDPla[23], CRect(0,0,211,55) , 
				DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//在FAST后帖钩
			else
		        DDBuf->BltFast( 320-80+147+20 , 100 , DDPla[34], 
				CRect(0,0,211,55) , 
				DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
		    DDBuf->BltFast( 320-80 , 100+55 , DDPla[21], 
				CRect(0,0,147,55) ,
				DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖SLOW
			if(slow==true)
				DDBuf->BltFast( 320-80+147+20 , 100+55 ,
				DDPla[23], CRect(0,0,211,55) , 
				DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖SLOW后帖钩
	        else
		        DDBuf->BltFast( 320-80+147+20 , 100+55 ,
				DDPla[34], CRect(0,0,211,55) ,
				DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
			DDBuf->BltFast( 320-80 , 100+55+55+20 , 
				DDPla[9], CRect(0,0,95,15) , 
				DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖翻滚石
			if(sto2==true)
				DDBuf->BltFast( 320-80+147+20 , 
				100+55+55 , DDPla[23], CRect(0,0,211,55) ,
				DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖翻滚石后钩
		    else
		        DDBuf->BltFast( 320-80+147+20 , 100+55+55 , DDPla[34], CRect(0,0,211,55) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
			DDBuf->BltFast( 320-80 , 100+55+55+55+20 , 
				DDPla[11], CRect(0,0,95,15) ,
				DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖弹簧
			if(sto3==true)
				DDBuf->BltFast( 320-80+147+20 , 100+55+55+55 , 
				DDPla[23], CRect(0,0,211,55) ,
				DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖弹簧后钩
		    else
		        DDBuf->BltFast( 320-80+147+20 , 100+55+55+55 , DDPla[34], CRect(0,0,211,55) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);		    
			DDBuf->BltFast( 320-80 , 100+55+55+55+55+20 , DDPla[16], CRect(0,0,95,15) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖履带
			if(sto5==true)
				DDBuf->BltFast( 320-80+147+20 , 
				100+55+55+55+55 , DDPla[23], CRect(0,0,211,55) ,
				DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖履带后钩
			else
		        DDBuf->BltFast( 320-80+147+20 , 100+55+55+55+55 , DDPla[34], CRect(0,0,211,55) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
			
		    DDBuf->BltFast(320-80-5-31-10 , y1 ,DDPla[2], CRect(0,0,31,31),DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖人
		}
		DDSur->Flip( NULL , DDFLIP_WAIT );
		}
	}


	if(!over)//游戏开始
	{
		if(nIDEvent==1)//帖背景
		{
		result=pDKB->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
		if(result!=DI_OK)
			MessageBox("取得键盘状态失败!");
		DDBuf->BltFast( 0 , 0 , DDPla[0],CRect(0,0,640,480) , DDBLTFAST_WAIT);//大背景为黑色
		DDBuf->BltFast( 0 , 80 , DDPla[1], CRect(0,bgx,407,400) , DDBLTFAST_WAIT);//小背景卷动的
		DDBuf->BltFast( 0 , 480-bgx , DDPla[1], CRect(0,0,407,bgx) , DDBLTFAST_WAIT);
		DDBuf->BltFast( 400,0, DDPla[39], CRect(0,0,240,480) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
		DDBuf->BltFast( 16 , 80 , DDPla[25],CRect(0,0,375,15) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
		if(player==1)//单打时的帖图
		{
		if(buffer[DIK_RIGHT]&0x80)
		    person1.zhuangtai1+=9;
		if(buffer[DIK_LEFT]&0x80)
	     	person1.zhuangtai2+=9;
		if(buffer[DIK_UP]&0x80)
			person1.zhuangtai3+=9;
		person1.so1=person1.should_onstone();
		person1.judge_onstone();
		pastesto();
		if(person1.exist)
		{
		person1.paste();
		person1.life.paste();
		}
		person1.zhuangtai1=person1.zhuangtai2=person1.zhuangtai3=0;
		
		}
		if(player==2)//双打时的帖图
		{
			if(buffer[DIK_RIGHT]&0x80)
		       person1.zhuangtai1+=9;
		    if(buffer[DIK_LEFT]&0x80)
	     	   person1.zhuangtai2+=9;
		    if(buffer[DIK_UP]&0x80)
			   person1.zhuangtai3+=9;
			if(buffer[DIK_X]&0x80)
		       person2.zhuangtai1+=9;
		    if(buffer[DIK_Z]&0x80)
	     	   person2.zhuangtai2+=9;
		    if(buffer[DIK_A]&0x80)
			   person2.zhuangtai3+=9;
			person1.so2=person1.should_onperson();
			person1.so1=person1.should_onstone();
			person1.so3=person1.should_onright();
			person1.so4=person1.should_onleft();
			person2.so2=person2.should_onperson();
		    person2.so1=person2.should_onstone();
            person2.so3=person2.should_onright();
			person2.so4=person2.should_onleft();
		    person1.judge_onperson();
			person1.judge_onstone();
			person1.judge_onright();
			person1.judge_onleft();
			person2.judge_onperson();				
			person2.judge_onstone();
			person2.judge_onright();
			person2.judge_onleft();
	      	pastesto();
			if(person1.exist)
			{
		    person1.paste();
		    person1.life.paste();
			}
			if(person2.exist)
			{
			person2.paste();
			person2.life.paste();
			}
			person1.set_zhuangtai();
			person2.set_zhuangtai();
		}
		bgx+=canshu;//背景卷动
		if(bgx>=400)
		bgx=0;
		score.sumup();
		DDSur->Flip( NULL , DDFLIP_WAIT );
		}
		if(nIDEvent==2&&slow)
		{
			if(!over)
			{
			if(sto2==true&&sto3==true&&sto5==true)//什么石头都有
			    generate_1();
			if(sto2==false&&sto3==true&&sto5==true)//没有翻滚石
				generate_2();
			if(sto2==true&&sto3==false&&sto5==true)//没有弹簧
				generate_3();
			if(sto2==true&&sto3==true&&sto5==false)//没有履带
				generate_4();
			if(sto2==false&&sto3==false&&sto5==true)//没有翻滚石弹簧
				generate_5();
			if(sto2==false&&sto3==true&&sto5==false)//没有翻滚石履带
				generate_6();
			if(sto2==true&&sto3==false&&sto5==false)//没有弹簧履带
				generate_7();
			if(sto2==false&&sto3==false&&sto5==false)//只有钉板不动石
				generate_8();
			}
		}
		if(nIDEvent==7&&fast)
		{
			if(!over)
			{
			if(sto2==true&&sto3==true&&sto5==true)//什么石头都有
			    generate_1();
			if(sto2==false&&sto3==true&&sto5==true)//没有翻滚石
				generate_2();
			if(sto2==true&&sto3==false&&sto5==true)//没有弹簧
				generate_3();
			if(sto2==true&&sto3==true&&sto5==false)//没有履带
				generate_4();
			if(sto2==false&&sto3==false&&sto5==true)//没有翻滚石弹簧
				generate_5();
			if(sto2==false&&sto3==true&&sto5==false)//没有翻滚石履带
				generate_6();
			if(sto2==true&&sto3==false&&sto5==false)//没有弹簧履带
				generate_7();
			if(sto2==false&&sto3==false&&sto5==false)//只有钉板不动石
				generate_8();
			}
		}
		if(nIDEvent==3)
		{
			if(player==1)//单打时的情况
				if(person1.life.i<12)
					person1.life.i++;//改生命值
				if(player==2)//双打时的情况
				{
					if(person1.life.i<12)
						person1.life.i++;
					if(person2.life.i<12)
						person2.life.i++;
				}
		}
		if(nIDEvent==4)
		{
			if(player==1)
				if(person1.exist==false)
					over=true;
				if(player==2)
					if(person1.exist==false&&person2.exist==false)
						over=true;
		}

	}
	
	CFrameWnd::OnTimer(nIDEvent);
	
}

void canvasFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	if(nChar==VK_ESCAPE)
	{//PostMessage(WM_CLOSE);
		if(p_what==2)
			p_what=1;
		else
		over=true;
	}
	if(over)
	{
		if(nChar==VK_RETURN)
		{
			if(p_what==1)
			{
				if(y<240+55)//如果按1—PLAYER
				{
					over=false;
					player=1;
				}
			    if(y>240+55&&y<240+110)//按2—PLAYER
				{
					over=false;
				    player=2;
				}
				if(y>240+110&&y<240+110+55)//按OPTION
				{
				    p_what=2;
				}
			    if(y>240+110+55)//按QUIT
                	PostMessage(WM_CLOSE);
			}
			if(p_what==2)
			{
				if(y1>100&&y1<100+55)//按下FAST
				{
					if(fast==true)
					{
						fast=false;
						slow=true;
						canshu=4;
					}
					else 
					{
						fast=true;
						slow=false;
						canshu=7;
					}
				}
				if(y1>100+55&&y1<100+110)//按下SLOW
				{
					if(slow==true)
					{
						slow=false;
						fast=true;
						canshu=7;
					}
					else 
					{
						slow=true;
						fast=false;
						canshu=4;
					}
				}
				if(y1>100+110&&y1<100+55+55+55)//是否取消翻滚石
				{
					if(sto2==true)
						sto2=false;
					else sto2=true;
				}
				if(y1>100+55+55+55&&y1<100+55+55+55+55)//是否取消弹簧
				{
					if(sto3==true)
						sto3=false;
					else sto3=true;
				}
				if(y1>100+55+55+55+55&&y1<100+55+55+55+55+55)//是否取消履带
				{
					if(sto5==true)
						sto5=false;
					else sto5=true;
				}
				if(y1>100+55+55+55+55+55)
					p_what=1;
			}
		}
		if(nChar==VK_UP)
		{
			if(p_what==1)
				y-=55;
			if(y<250)
				y=250;
			if(p_what==2)
				y1-=55;
			if(y1<110)
				y1=110;
		}
		if(nChar==VK_DOWN)
		{
			if(p_what==1)
				y+=55;
			if(y>250+55+55+55)
				y=250+55+55+55;
			if(p_what==2)
				y1+=55;
		    if(y1>110+55+55+55+55)
				y1=110+55+55+55+55;
		}
	}
	CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}


void canvasFrame::InitDD()
{
//建立 DirectDraw(对象
	result = DirectDrawCreateEx(NULL, (VOID**)&DD, IID_IDirectDraw7, NULL);
    if (result != DD_OK)
	{
		MessageBox("建立DirectDraw对象失败!");
		return;
	}
//设定协调层级
	result = DD->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );
	if(result !=DD_OK)
	{
		MessageBox("设定程序协调层级失败!");
		return;
	}
//设定显示模式
	result = DD->SetDisplayMode(640,480,16,0,DDSDM_STANDARDVGAMODE); 
	if(result !=DD_OK)
	{
		MessageBox("设定屏幕显示模式失败!");
		return;
	}
//建立主绘图页
	memset(&DDde,0,sizeof(DDde));       
	DDde.dwSize = sizeof(DDde);           
	DDde.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
	DDde.dwBackBufferCount = 1;        
	DDde.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
	result = DD->CreateSurface(&DDde,&DDSur,NULL);
	if(result !=DD_OK)
	{
	 	MessageBox("建立主绘图页失败!");
		return;
	}
//连结后缓冲区
	DDcaps.dwCaps = DDSCAPS_BACKBUFFER;  
	result = DDSur->GetAttachedSurface(&DDcaps,&DDBuf); 
	if(result !=DD_OK)
	{
		MessageBox("连接后缓冲区失败!");
		return;
	}
//声明幕后幕存区的共同特性
	memset(&DDde,0,sizeof(DDde));        
	DDde.dwSize = sizeof(DDde);
	DDde.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; 
	DDde.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
}



void canvasFrame::CreateDDPla(int width,int height,char* filename,int num)
{
	DDde.dwWidth = width; 
	DDde.dwHeight = height; 
	result = DD->CreateSurface(&DDde, &DDPla[num], NULL); 
	if(result !=DD_OK)
	{
  		MessageBox("建立幕后内存区失败!");
		return;
	}
	bitmap = (HBITMAP)::LoadImage(NULL,filename,IMAGE_BITMAP,width,height,LR_LOADFROMFILE); 
	if(bitmap==NULL)
	{
		MessageBox("无法加载位图!");
		return;
	}
	::SelectObject(hdc,bitmap);
	DDPla[num]->GetDC( &dhdc );
	::BitBlt( dhdc , 0 , 0 ,width,height, hdc , 0 , 0 , SRCCOPY );
	DDPla[num]->ReleaseDC(dhdc);
}

void canvasFrame::ColorKey(int num)
{
	key.dwColorSpaceHighValue = 0;
	key.dwColorSpaceLowValue = 0;
	DDPla[num]->SetColorKey(DDCKEY_SRCBLT,&key);
}	



void canvasFrame::InitDI()
{
//建立 DirectInput 对象
	HINSTANCE hinst = AfxGetInstanceHandle(); 
	result = DirectInputCreateEx(hinst, DIRECTINPUT_VERSION,IID_IDirectInput7, (void**)&pDI, NULL); 
	if(result != DI_OK)
	{
		MessageBox("建立 DirectInput 对象失败!");
		return;
	}
//建立输入装置对象
	result = pDI->CreateDeviceEx(GUID_SysKeyboard, IID_IDirectInputDevice7,(void**)&pDKB, NULL); 
	if(result != DI_OK)
	{
		MessageBox("建立键盘输入装置失败!");
		return;
	}
//设定数据格式
	result =pDKB->SetDataFormat(&c_dfDIKeyboard);
	if(result != DI_OK)
	{
		MessageBox("设定数据格式失败!");
		return;
	}
//设定协调层级
	result = pDKB->SetCooperativeLevel(m_hWnd,DISCL_BACKGROUND | DISCL_NONEXCLUSIVE); 
	if(result != DI_OK)
	{
		MessageBox("设定程序协调层级失败!");
		return;
	}
//取用输入装置
	result = pDKB->Acquire();
	if(result != DI_OK)
	{
		MessageBox("取用输入装置失败!");
		return;
	}
	//HINSTANCE hinst = AfxGetInstanceHandle(); 
	result = DirectInputCreateEx(hinst, DIRECTINPUT_VERSION,IID_IDirectInput7, (void**)&DI, NULL); 
	if(result != DI_OK)
	{
		MessageBox("建立 DirectInput 对象失败!");
		return;
	}
//建立输入装置对象
	result = DI->CreateDeviceEx(GUID_SysMouse, IID_IDirectInputDevice7,(void**)&DIms, NULL); 
	if(result != DI_OK)
	{
		MessageBox("建立鼠标输入装置失败!");
		return;
	}
//设定数据格式
	result = DIms->SetDataFormat(&c_dfDIMouse2);
	if(result != DI_OK)
	{
		MessageBox("设定数据格式失败!");
		return;
	}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -