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

📄 game.cpp

📁 泡泡堂单机版,可能被转载够很多次,不过这个是比较完整的,一个很好的学习材料.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					}
				}
			}
		}
		test = done;

		if (done == CAN_MOVE)
		{
			m_Player[0].status = STATUS_MOVE;						//	设置移动标志
			m_Player[0].counter = m_Player[0].step / m_Player[0].speed;	//	counter此处表示需要多少桢
			if (m_Player[0].step % m_Player[0].speed != 0)
			{
				m_Player[0].counter++;
			}
		}
		else	if (done == CAN_PUSH)
		{
			m_Player[0].presswaykey++;
			if (m_Player[0].presswaykey>40)
			{
				//	设置推箱子标志
				if (m_Player[0].y %40 < 10)
				{
					if (((m_Player[0].x-40)/40 != 0) && ((m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-2].type == 0) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-2].type == 8) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-2].type == 9)))
					{
						m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-1].counter = 40;
						m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-1].way = m_Player[0].way;
					}
				}
				else
				{
					if (((m_Player[0].x-40)/40 != 0) && ((m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40-2].type == 0) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40-2].type == 8) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40-2].type == 9)))
					{
						m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40].counter = 40;
						m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40].way = m_Player[0].way;
					}
				}
				m_Player[0].presswaykey = 0;
			}
		}
		else	if (done == CAN_KICK && m_Player[0].kick)
		{
			m_Player[0].presswaykey++;
			if (m_Player[0].presswaykey>20)
			{
				//	设置推箱子标志
				if (m_Player[0].y %40 < 10)
				{
					if (((m_Player[0].x-40)/40 != 0) && ((m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-2].type == 0) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-2].type == 8) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-2].type == 9)))
					{
						m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-1].type = 0;
						MOVEBOMB	move;
						move.mode = 0;
						move.way = m_Player[0].way;
						move.x = (m_Player[0].x/40-1)*40;
						move.y = (m_Player[0].y)/40*40;
						move.counter = m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-1].counter;
						move.power = m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-1].status;
						move.who = m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40-1].who;
						m_bombKick.push_back(move);

					}
				}
				else
				{
					if (((m_Player[0].x-40)/40 != 0) && ((m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40-2].type == 0) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40-2].type == 8) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40-2].type == 9)))
					{
						m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40].type = 0;
						MOVEBOMB	move;
						move.mode = 0;
						move.way = m_Player[0].way;
						move.x = (m_Player[0].x/40)*40;
						move.y = (m_Player[0].y+40)/40*40;
						move.counter = m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40].counter;
						move.power = m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40].status;
						move.who = m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40].who;
						m_bombKick.push_back(move);

					}
				}
				m_Player[0].presswaykey = 0;
			}
		}

		return;
	}
	if (m_pInput->IsKeyDown(DIK_RIGHT) && (m_Player[0].status == STATUS_FREE) && (m_Player[0].x != 14*40))
	{
		done = CAN_MOVE;
		m_Player[0].way = WAY_RIGHT;
		if (m_Player[0].x % 40 == 0)	//	判断阻挡
		{
			done = CAN_BLOCK;
			//	正前方为空
			if ((m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==0 ) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==8 ) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==9 ))
			{
				//	右上方为空	...OK!
				if ((m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==0 ) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==8 ) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==9 ))
				{

					done = CAN_MOVE;			//	直接往前走
				}
				else	//	右上方有东西
				{
					if (m_Player[0].y%40 == 0)
					{
						done = CAN_MOVE;		//	直接往前走
					}
					else if (m_Player[0].y%40 <= 30)
					{
						m_Player[0].way = WAY_UP;
						done = CAN_MOVE;		//	向左边偏移
					}
					else if (m_Player[0].y%40 > 30)
					{
						if (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==2 )
						{
							//	右上方是箱子,推
							done = CAN_PUSH;
						}
						else	if (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==7 )
						{
							//	右上方是泡泡,踢
							done = CAN_KICK;
						}
					}
				}
			}
			else		//	正前方有东西
			{
				//	右上方为空	...OK!
				if ((m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==0 ) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==8 ) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==9 ))
				{

					if (m_Player[0].y%40 == 0)
					{
						if (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==2 )
						{
							//	右上方是箱子,推
							done = CAN_PUSH;
						}
						else	if (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==7 )
						{
							//	右上方是泡泡,踢
							done = CAN_KICK;
						}
					}
					else if (m_Player[0].y%40 >= 10)
					{
						m_Player[0].way = WAY_DOWN;
						done = CAN_MOVE;		//	向右边偏移
					}
					else if (m_Player[0].y%40 < 10)
					{
						if (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==2 )
						{
							//	右上方是箱子,推
							done = CAN_PUSH;
						}
						else	if (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==7 )
						{
							//	右上方是泡泡,踢
							done = CAN_KICK;
						}
					}
				}
				else	//	右上方有东西
				{
					//	此处较麻烦分4种情况:	1.左边可以移动,右边可以移动	如果x%40<20则左移,否则右移
					//							2.左边可以移动,右边不可移动	如果x%40<=30则左移
					//							3.左边不可移动,右边可以移动	如果x%40>=10则右移
					//							4.左边不可移动,右边不可移动	不能移动
					if (((m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==2 ) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==7 ))
						&& ((m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==2 ) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==7 )))
					{
						if (m_Player[0].y%40 == 0)
						{
						if (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==2 )
						{
							//	右上方是箱子,推
							done = CAN_PUSH;
						}
						else	if (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==7 )
						{
							//	右上方是泡泡,踢
							done = CAN_KICK;
						}
						}
						else	if (m_Player[0].y%40 < 20)
						{
							m_Player[0].way = WAY_UP;
							done = CAN_MOVE;		//	向左边偏移
						}
						else
						{
							m_Player[0].way = WAY_DOWN;
							done = CAN_MOVE;		//	向右边偏移
						}
					}

					if (((m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==2 ) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==7 ))
						&& !((m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==2 ) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==7 )))
					{
						if (m_Player[0].y%40 == 0)
						{
							if (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==2 )
							{
								//	右上方是箱子,推
								done = CAN_PUSH;
							}
							else	if (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==7 )
							{
								//	右上方是泡泡,踢
								done = CAN_KICK;
							}
						}
						else	if (m_Player[0].y%40 <= 30)
						{
							m_Player[0].way = WAY_UP;
							done = CAN_MOVE;		//	向左边偏移
						}
					}

					if ( !((m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==2 ) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type ==7 ))
						&& ((m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==2 ) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type ==7 )))
					{
						if (m_Player[0].y%40 >= 10)
						{
							m_Player[0].way = WAY_DOWN;
							done = CAN_MOVE;		//	向右边偏移
						}
					}
				}
			}
		}
		test = done;

		if (done == CAN_MOVE)
		{
			m_Player[0].status = STATUS_MOVE;						//	设置移动标志
			m_Player[0].counter = m_Player[0].step / m_Player[0].speed;	//	counter此处表示需要多少桢
			if (m_Player[0].step % m_Player[0].speed != 0)
			{
				m_Player[0].counter++;
			}
		}
		else	if (done == CAN_PUSH)
		{
			m_Player[0].presswaykey++;
			if (m_Player[0].presswaykey>40)
			{
				//	设置推箱子标志
				if (m_Player[0].y %40 < 10)
				{
					if (((m_Player[0].x-40)/40 != 13*40) && ((m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+2].type == 0) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+2].type == 8) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+2].type == 9)))
					{
						m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].counter = 40;
						m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].way = m_Player[0].way;
					}
				}
				else
				{
					if (((m_Player[0].x-40)/40 != 13*40) && ((m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+2].type == 0) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+2].type == 8) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+2].type == 9)))
					{
						m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].counter = 40;
						m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].way = m_Player[0].way;
					}
				}
				m_Player[0].presswaykey = 0;
			}
		}
		else	if (done == CAN_KICK && m_Player[0].kick)
		{
			m_Player[0].presswaykey++;
			if (m_Player[0].presswaykey>20)
			{
				//	设置推箱子标志
				if (m_Player[0].y %40 < 10)
				{
					if (((m_Player[0].x-40)/40 != 13*40) && ((m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+2].type == 0) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+2].type == 8) || (m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+2].type == 9)))
					{
						m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].type = 0;
						MOVEBOMB	move;
						move.mode = 0;
						move.way = m_Player[0].way;
						move.x = (m_Player[0].x/40+1)*40;
						move.y = (m_Player[0].y)/40*40;
						move.counter = m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].counter;
						move.power = m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].status;
						move.who = m_ScreenItem[m_Player[0].y/40][m_Player[0].x/40+1].who;
						m_bombKick.push_back(move);
					}
				}
				else
				{
					if (((m_Player[0].x-40)/40 != 13*40) && ((m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+2].type == 0) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+2].type == 8) || (m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+2].type == 9)))
					{
						m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].type = 0;
						MOVEBOMB	move;
						move.mode = 0;
						move.way = m_Player[0].way;
						move.x = (m_Player[0].x/40+1)*40;
						move.y = (m_Player[0].y+40)/40*40;
						move.counter = m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].counter;
						move.power = m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].status;
						move.who = m_ScreenItem[m_Player[0].y/40+1][m_Player[0].x/40+1].who;
						m_bombKick.push_back(move);
					}
				}
				m_Player[0].presswaykey = 0;
			}
		}
		return;
	}

/*
	if (m_pInput->IsKeyDownToggle(DIK_Z))		//	踢泡泡,测试用
	{
		MOVEBOMB	move;
		move.mode = 0;
		move.way = m_Player[0].way;
		move.x = (m_Player[0].x+20)/40*40;
		move.y = (m_Player[0].y+20)/40*40;
		m_bombKick.push_back(move);
		return;
	}
*/
	
/*
	if (m_pInput->IsKeyDownToggle(DIK_X))		//	扔泡泡,测试用
	{
		MOVEBOMB	move;
		move.mode = 1;
		move.way = m_Player[0].way;
		move.x = (m_Player[0].x+20)/40*40;
		move.y = (m_Player[0].y+20)/40*40;
		move.offset = 0;
		move.addorsub = true;
		m_bombCast.push_back(move);
		return;
	}
*/
	if (m_pInput->IsKeyDownToggle(DIK_F1))
	{
		m_bHelp = !m_bHelp;
	}

	if (m_pInput->IsKeyDownToggle(DIK_F2))
	{
		ResetMapInfor();
		return;
	}

	if (m_pInput->IsKeyDownToggle(DIK_F3))
	{
		m_bWindowed = !m_bWindowed;
		ChangeDisplayMode( m_bWindowed );
		return;
	}

	//	鼠标处理

	POINT	point;
	RECT	rect,rect1;
	GetCursorPos(&point);
	ScreenToClient(m_hWnd,&point);
	GetClientRect(m_hWnd,&rect);
	m_CursorPos.x = 800*point.x/(rect.right-rect.left);
	m_CursorPos.y = 600*point.y/(rect.bottom-rect.top);

	m_pInput->GetMouseState();
	if (m_pInput->IsMouseDown(0))			//	左键按下
	{
		rect1.left = 649;
		rect1.top = 555;
		rect1.right = 782;
		rect1.bottom = 590;

		if (PtInRect(&rect1,m_CursorPos))
		{
			PostQuitMessage(0);
		}
	}

	//	连选方向键时不会执行该语句
	m_Player[0].presswaykey = 0;
}

HRESULT CGame::ChangeDisplayMode( BOOL bWindowed )
{
	HRESULT	hr;
    // Release all existing surfaces
	delete	m_pDraw;
	delete	m_pSurface;
	delete	m_pSurfacePlayer;
	delete	m_pSurfaceWord;

    // The back buffer and primary surfaces need to be created differently 
    // depending on if we are in full-screen or windowed mode
	m_pDraw = new CDraw;

    if( bWindowed )
    {
		if ( FAILED( hr = m_pDraw->CreateWindowedDisplay(m_hWnd,800,600 ) ) )
			return hr;
    }
    else
    {
		if( FAILED( hr = m_pDraw->CreateFullScreenDisplay(m_hWnd,800,600,32) ) )
		{
            MessageBox( m_hWnd, TEXT("This display card does not support 800x600x32. "),
                        TEXT("泡泡堂"), MB_ICONERROR | MB_OK );
            return hr;
        }

    }

    // Create a surface, and draw a bitmap resource on it.  The surface must 
    // be newly created every time the screen mode is switched since it 
    // uses the pixel format of the primary surface
	if	( FAILED( hr = m_pDraw->CreateSurface(&m_pSurface,800,600) ) )
		return hr;
	if( FAILED( hr = m_pSurface->DrawBitmap(".\\picture\\pic.bmp",800,600) ) )

⌨️ 快捷键说明

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