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

📄 test.cpp

📁 这是我用hoho5.2.0.6引擎写的坦克游戏,采用c语言,写了个矩形碰撞函数可以方便游戏里处理碰撞事件.游戏写的很简单.对想熟悉hoho引擎或游戏编程的人有很大的帮助
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	
    g_pFont = msCreateFont("123.dat");//加载hoho字体库

	//g_pEggBitmap = GetGraphics()->CreateBitmapFromBMP("1.bmp");
/////////加载本人坦克//////////////////////////////////////////////
	pic_tank_up= GetGraphics()->CreateBitmapFromBMP("src//tank.bmp");
   	pic_tank_down= GetGraphics()->CreateBitmapFromBMP("src//tank2.bmp");
    pic_tank_left= GetGraphics()->CreateBitmapFromBMP("src//tank3.bmp");
	pic_tank_right= GetGraphics()->CreateBitmapFromBMP("src//tank4.bmp");
	pic_tank_bullet= GetGraphics()->CreateBitmapFromBMP("src//b.bmp");
	pic_tank_up->SetColorKey(RGB2Hi(255,255,255));//设置要设为透明的色
	pic_tank_down->SetColorKey(RGB2Hi(255,255,255));//设置要设为透明的色
	pic_tank_left->SetColorKey(RGB2Hi(255,255,255));//设置要设为透明的色
	pic_tank_right->SetColorKey(RGB2Hi(255,255,255));//设置要设为透明的色
	pic_tank_bullet->SetColorKey(RGB2Hi(255,255,255));//设置要设为透明的色
/////////加载机器人坦克//////////////////////////////////////////////
	pic_bot_tank_up= GetGraphics()->CreateBitmapFromBMP("src//bot_up.bmp");
	pic_bot_tank_down= GetGraphics()->CreateBitmapFromBMP("src//bot_down.bmp");
	pic_bot_tank_left= GetGraphics()->CreateBitmapFromBMP("src//bot_left.bmp");
	pic_bot_tank_right= GetGraphics()->CreateBitmapFromBMP("src//bot_right.bmp");
	pic_bot_tank_up->SetColorKey(RGB2Hi(0,0,0));//设置要设为透明的色
	pic_bot_tank_down->SetColorKey(RGB2Hi(0,0,0));//设置要设为透明的色
	pic_bot_tank_left->SetColorKey(RGB2Hi(0,0,0));//设置要设为透明的色
	pic_bot_tank_right->SetColorKey(RGB2Hi(0,0,0));//设置要设为透明的色
/////////////////////////////////////////////////////////////////////////////////////

	Bot.bot_way=3;  //设定初始方向
	Bot.inway_x=200;//设定初始点x
	Bot.inway_y=200;
	Bot.bot_way=1;

	
	Bot2.bot_way=3;  //设定初始方向
	Bot2.inway_x=0;  //设定初始点x
	Bot2.inway_y=0;
	Bot2.bot_way=1;

  SetTimer(hWnd,TIMER2,100,0);//开启一个机器人
  SetTimer(hWnd,TIMER3,10,0);//移动bot
   GetGraphics()->DrawFont(SCREENBUFFER,30,60,g_pFont,RGB2Hi(255,255,255),"测试");
   return TRUE;
}

//
//  函数: WndProc(HWND, unsigned, WORD, LONG)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND	- 处理应用程序菜单
//  WM_PAINT	- 绘制主窗口
//  WM_DESTROY	- 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message) 
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam); 
		wmEvent = HIWORD(wParam); 
		// 分析菜单选择:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_TIMER:
		if(wParam==TIMER1)//管理子弹发射过程
		{
			   MYRECT botrect,bulletrect,botrect2; //第一个是Bot的rect,中间的是子弹的rect,第三个是Bot2的rect
		 botrect.x=Bot.inway_x;
		 botrect.y=Bot.inway_y;
		 botrect.height=28;
		 botrect.width=28;

		 botrect2.x=Bot2.inway_x;
		 botrect2.y=Bot2.inway_y;
		 botrect2.height=28;
		 botrect2.width=28;

		 bulletrect.x=Bullet.inway_x;
		 bulletrect.y=Bullet.inway_y;
		 bulletrect.width=5;
		 bulletrect.height=5;
			
		if(IsInArea(botrect,bulletrect)) //判断Bot和子弹是否碰撞
		{
			Bullet.inway_x=-20; //子弹移出屏幕
			Bullet.inway_y=-20; //子弹移出屏幕
			isBulletshot=false; 
				//SetWindowText(hWnd,"打中Bot1!");
			 //  MessageBox(NULL,"中!","中!",0);
				Bot.inway_x=200;
				Bot.inway_y=200;
				Bot.bot_way=1;
		}
		if(IsInArea(botrect2,bulletrect))//判断Bot2和子弹是否碰撞
		{
		    Bullet.inway_x=-20;//子弹移出屏幕
	     	Bullet.inway_y=-20;//子弹移出屏幕
			isBulletshot=false;
				SetWindowText(hWnd,"打中Bot2!");
				Bot2.inway_x=100;
				Bot2.inway_y=100;
				Bot2.bot_way=1;
		}

		   return bulletrun();
		}
		else if(wParam==TIMER2)//管理bot方向
		{
			//取随机方向
			srand((unsigned)time(NULL));
			int a=rand()%10;

			if(a<=1)
			{
				Bot2.bot_way=1;
				Bot.bot_way=0;
			}else if(a>=2&&a<=4)
			{
				Bot2.bot_way=0;
				Bot.bot_way=1;
			}else if(a>=5&&a<=6)
			{
				Bot2.bot_way=2;
				Bot.bot_way=2;
			}else if(a>7)
			{  
				Bot2.bot_way=3;
				Bot.bot_way=3;	
			}
      
		}else//管理bot移动
		{
			    if(Bot.bot_way==0)		//如果向上
				{
					if(Bot.inway_y<=0)//边界检查
					{
						Bot.inway_y=0;
					}
					else 
					{
						Bot.inway_y-=tank_speed;
					}
				}else if(Bot.bot_way==1)	//如果向下
				{
					if(Bot.inway_y>=572)//边界检查
					{
						Bot.inway_y=571;
					}
					else 
					{
						Bot.inway_y+=tank_speed;
					}
				}else if(Bot.bot_way==2)	//如果向左
				{
					if(Bot.inway_x<=0)//边界检查
					{
						Bot.inway_x=0;
					}
					else 
					{
						Bot.inway_x-=tank_speed;
					}
				}else if(Bot.bot_way==3)						//向右
				{ 
					
					if(Bot.inway_x>=770)//边界检查
					{
						Bot.inway_x=769;
					}
					else 
					{
						Bot.inway_x+=tank_speed;
					}
				}
				if(Bot2.bot_way==0)		//如果向上
				{
					if(Bot2.inway_y<=0)//边界检查
					{
						Bot2.inway_y=0;
					}
					else 
					{
						Bot2.inway_y-=tank_speed;
					}
				}else if(Bot2.bot_way==1)	//如果向下
				{
					if(Bot2.inway_y>=572)//边界检查
					{
						Bot2.inway_y=571;
					}
					else 
					{
						Bot2.inway_y+=tank_speed;
					}
				}else if(Bot2.bot_way==2)	//如果向左
				{
					if(Bot2.inway_x<=0)//边界检查
					{
						Bot2.inway_x=0;
					}
					else 
					{
						Bot2.inway_x-=tank_speed;
					}
				}else if(Bot.bot_way==3)						//向右
				{ 
					
					if(Bot2.inway_x>=770)//边界检查
					{
						Bot2.inway_x=769;
					}
					else 
					{
						Bot2.inway_x+=tank_speed;
					}
				}
		}
		
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: 在此添加任意绘图代码...
		EndPaint(hWnd, &ps);
		break;
	case WM_MOVE://如果窗体移动则
		if( GetGraphics() != NULL)
                 GetGraphics()->UpdateBounds();
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_ACTIVATE: // 窗口的活動狀態
	{
		switch((LOWORD(wParam)))
		{
			case WA_ACTIVE:
			case WA_CLICKACTIVE:
			g_bActive = true;
			break;
			case WA_INACTIVE:
			g_bActive = false;
			break;
			default:
			break;
		}
		if( GetGraphics() != NULL )
		GetGraphics()->Restore();
	}
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// “关于”框的消息处理程序。
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_INITDIALOG:
		return TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
		{
			EndDialog(hDlg, LOWORD(wParam));
			return TRUE;
		}
		break;
	}
	return FALSE;
}
bool    IsInArea(MYRECT rect1,MYRECT rect2)//判断是否相交
{
	if(fabs((rect1.x +rect1.width / 2)-(rect2.x + rect2.width/2))<fabs(rect1.width + rect2.width) / 2)
	{
		if(fabs( (rect1.y + rect1.height / 2)-(rect2.y +rect2.height/2)) < fabs((rect1.height+ rect2.height) / 2))
		{//MessageBox(NULL,"在区域!","",0);
			return true;
		}
	}
  return false;
}
int bulletrun()
{
	if(isBulletshot)
		{
			switch(Bullet.buletway)
			{
			  case 0://上
				  if( Bullet.inway_y<=0)
				  {
					  isBulletshot=false;
					  return 0;
				  }
				  Bullet.inway_y-=15;
				  break;
			  case 1://下
				  if( Bullet.inway_y>=572)
				  {
					  isBulletshot=false;
					  return 0;
				  }
					Bullet.inway_y+=15;
				  break;
			  case 2://左
				  if( Bullet.inway_x<=0)
				  {
					  isBulletshot=false;
					  return 0;
				  }
                    Bullet.inway_x-=15;
				  break;
			  case 3:
				   if( Bullet.inway_x>=770)
				  {
					  isBulletshot=false;
					  return 0;
				  }
				    Bullet.inway_x+=15;
				  break;
			}
		}
}

⌨️ 快捷键说明

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