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

📄 game.cpp

📁 泡泡堂单机版,可能被转载够很多次,不过这个是比较完整的,一个很好的学习材料.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				}
				m_pDraw->Blt(j*40+19+10,i*40+40+20,m_pSurface,&rect);
				//	tag表示道具的种类
				rect.left = 480 + m_ScreenItem[i][j].counter/10%3*44;
				rect.top = 40+m_ScreenItem[i][j].tag*44;
				rect.right = 480 + 44 + m_ScreenItem[i][j].counter/10%3*44;
				rect.bottom = 40+44+m_ScreenItem[i][j].tag*44;
				m_pDraw->Blt(j*40+19-2,i*40+40-24+m_ScreenItem[i][j].yoffset,m_pSurface,&rect);
				m_ScreenItem[i][j].counter++;
				if (m_ScreenItem[i][j].counter == 1000)
				{
					m_ScreenItem[i][j].counter = 0;
				}
				break;
			case 9:											//	爆炸效果
				{
				//	status在此处表示爆炸效果的编号
				/*
					           2
					           1
							  ...
					           1
					 6 5 ... 5 0 7 ... 7 8
					           3
					          ...
							   3
							   4
					 
					 
				*/
					m_ScreenItem[i][j].counter--;
					if (m_ScreenItem[i][j].counter == 0)		//	爆炸结束
					{
						if (m_ScreenItem[i][j].tag != -1)
						{
							m_ScreenItem[i][j].type = 8;		//	炸出来的道具
							m_pSoundEffect[APPEAR]->Play();		//	播放道具出现音效
						}
						else
						{
							m_ScreenItem[i][j].type = 0;
						}
					}

					int temp = m_ScreenItem[i][j].counter/6;
					if (temp>4)	temp=4;

					rect.left = 40+(4-temp)*40;
					rect.top = 200+m_ScreenItem[i][j].status*40;
					rect.right = 40+40+(4-temp)*40;
					rect.bottom = 200+40+m_ScreenItem[i][j].status*40;
					m_pDraw->Blt(j*40+19,i*40+40,m_pSurface,&rect);
				}
				break;
			default:
				break;
			}
		}

		//	显示玩家	DrawPlayer
		for (int PlayerIndex=0;PlayerIndex<PLAYER_NUM;PlayerIndex++)
		{
			if ((m_Player[PlayerIndex].y+20)/40 == i && m_Player[PlayerIndex].type != TYPE_NULL)
			{
				if (m_Player[PlayerIndex].status == STATUS_DIED)				//	被炸?
				{
					rect.left = 280;
					rect.top = 280;
					rect.right = 280+60;
					rect.bottom = 280+60;
					if (m_Player[PlayerIndex].counter == 60)
					{
						m_pSoundEffect[DIE]->Play();
					}
					if (m_Player[PlayerIndex].counter < 60)
					{
						rect.top += 60;
						rect.bottom += 60;
					}
					if (m_Player[PlayerIndex].counter != 0)
					{
						m_Player[PlayerIndex].counter--;
						m_pDraw->Blt(m_Player[PlayerIndex].x+19-10,m_Player[PlayerIndex].y+40-20,m_pSurface,&rect);
					}
				}
				else
				{
					rect.left = m_Player[PlayerIndex].way*52*5+m_Player[PlayerIndex].frame*52;
					rect.top = m_Player[PlayerIndex].image*62;
					rect.right = m_Player[PlayerIndex].way*52*5+52+m_Player[PlayerIndex].frame*52;
					rect.bottom = m_Player[PlayerIndex].image*62+62;
					m_pDraw->Blt(m_Player[PlayerIndex].x+19-6,m_Player[PlayerIndex].y+40-20,m_pSurfacePlayer,&rect);
				}
			}
		}
	}

	//	处理踢出来的泡泡
	DoKick();

	//	处理扔出来的泡泡
	DoCast();

	m_timeNew = timeGetTime();
	if (m_timeNew >= m_timeOld + 500)
	{												//每半秒就更新一下fps
		m_fps = (float) m_counter * 1000.0f / (m_timeNew - m_timeOld);	//计算fps,fps_count是刷新次数统计
		m_counter = 0;								//清空刷新次数
		m_timeOld = m_timeNew;						//使过去的时间等于当前的时间
	}
	m_counter++;

	char	str[256];
	if (m_bHelp)
	{
		sprintf(str,"FPS: %f 主角信息 x: %d y: %d way: %d speed: %d",m_fps,m_Player[0].x,m_Player[0].y,m_Player[0].way,m_Player[0].speed);
		m_pDraw->DrawText(NULL,str,19,40);
		sprintf(str,"F1 for help show/hide");
		m_pDraw->DrawText(NULL,str,19,60);
		sprintf(str,"F2 for reset");
		m_pDraw->DrawText(NULL,str,19,80);
		sprintf(str,"F3 for window/fullscreen");
		m_pDraw->DrawText(NULL,str,19,100);
	}

/*
	sprintf(str,"        电脑信息 lay: %d",m_PlayerLay[1]);
	m_pDraw->DrawText(NULL,str,19,60);
*/

	//	显示小图标
	for (i=0;i<PLAYER_NUM;i++)
	{
		if (m_Player[i].type != TYPE_NULL)
		{
			rect.left = 4*52;
			rect.top = m_Player[i].image*62;
			rect.right = 4*52+52;
			rect.bottom = m_Player[i].image*62+38;
			m_pDraw->Blt(655,60+i*44,m_pSurfacePlayer,&rect);

			if (m_Player[i].type == TYPE_USER)
			{
				DWORD	length = sizeof(str);
				GetComputerName(str,&length);
				m_pDraw->DrawText(NULL,str,705,87+i*44);
			}
			else
			{
				sprintf(str,"电脑玩家 %d",i);
				m_pDraw->DrawText(NULL,str,705,87+i*44);
			}
		}
	}

	//	显示身上的特殊道具
	if (m_Player[0].pin)
	{
		rect.left = 480;
		rect.top = 260;
		rect.right = 480+44;
		rect.bottom = 260+44;
		m_pDraw->Blt(665,464,m_pSurface,&rect);
	}

	if (m_GameCounter == DISPLAYCOUNTER)
	{
		m_pSoundEffect[START+m_GameState-1]->Play();
	}
	if (m_GameCounter>0)
	{
		rect.left = 0;
		rect.top = (m_GameState-1)*80;
		rect.right = 240;
		rect.bottom = 80+(m_GameState-1)*80;
		m_pDraw->Blt(200,100,m_pSurfaceWord,&rect);
		m_GameCounter--;
		if (m_GameCounter == 0 && m_GameState == GAME_START)
		{
			m_GameState = GAME_FREE;
		}
	}

	//	鼠标
	rect.left = 160;
	rect.top = 40;
	rect.right = 160+32;
	rect.bottom = 40+32;
	m_pDraw->Blt(m_CursorPos.x,m_CursorPos.y,m_pSurface,&rect);


	HRESULT hr;
	if (FAILED(hr = m_pDraw->Present()))
	{
		if( hr == DDERR_SURFACELOST )
		{
			RestoreSurfaces();
		}
	}

	return S_OK;
}

void	CGame::DoInput()
{
	m_pInput->GetKeyboardState();
	if (m_pInput->IsKeyDownToggle(DIK_SPACE))
	{
		if (m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].type!=7)
		{
			if (m_Player[0].bomb != 0)
			{
				m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].type = 7;
				m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].counter = 300;
				m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].status = m_Player[0].power;
				m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].who = 0;
				m_Player[0].bomb--;
				m_pSoundEffect[LAY]->Play();
			}
		}
		else
		{
			if (m_Player[0].cast && m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].counter<240)
			{
				m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].type = 0;
				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.power = m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].status;
				move.counter = m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].counter;
				move.offset = 0;
				move.addorsub = true;
				move.who = m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].who;
				m_bombCast.push_back(move);
			}
		}
	}

	if ((m_pInput->IsKeyDownToggle(DIK_LCONTROL) || m_pInput->IsKeyDownToggle(DIK_RCONTROL))  && m_Player[0].pin == true && m_Player[0].status == STATUS_DIED && m_Player[0].counter > 60)
	{
		m_Player[0].pin = false;
		m_Player[0].status = STATUS_FREE;
	}

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

					if (m_Player[0].x%40 == 0)
					{
						if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==2 )
						{
							//	正上方是箱子,推
							done = CAN_PUSH;
						}
						else	if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==7 )
						{
							//	正上方是泡泡,踢
							done = CAN_KICK;
						}
					}
					else if (m_Player[0].x%40 >= 10)
					{
						m_Player[0].way = WAY_RIGHT;
						done = CAN_MOVE;		//	向右边偏移
					}
					else if (m_Player[0].x%40 < 10)
					{
						if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==2 )
						{
							//	正上方是箱子,推
							done = CAN_PUSH;
						}
						else	if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].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)/40][m_Player[0].x/40].type ==2 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==7 ))
						&& ((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==2 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==7 )))
					{
						if (m_Player[0].x%40 == 0)
						{
							if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==2 )
							{
								//	正上方是箱子,推
								done = CAN_PUSH;
							}
							else	if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==7 )
							{
								//	正上方是泡泡,踢
								done = CAN_KICK;
							}
						}
						else	if (m_Player[0].x%40 < 20)
						{
							m_Player[0].way = WAY_LEFT;
							done = CAN_MOVE;		//	向左边偏移
						}
						else
						{
							m_Player[0].way = WAY_RIGHT;
							done = CAN_MOVE;		//	向右边偏移
						}
					}

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

					if ( !((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==2 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==7 ))
						&& ((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==2 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==7 )))
					{
						if (m_Player[0].x%40 >= 10)
						{
							m_Player[0].way = WAY_RIGHT;
							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].x %40 < 10)
				{
					if (((m_Player[0].y-40)/40 != 0) && ((m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40].type == 0) || (m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40].type == 8) || (m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40].type == 9)))
					{
						m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].counter = 40;
						m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].way = m_Player[0].way;
					}
				}
				else
				{
					if (((m_Player[0].y-40)/40 != 0) && ((m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40+1].type == 0) || (m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40+1].type == 8) || (m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40+1].type == 9)))

⌨️ 快捷键说明

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