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

📄 cmap.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	{
		Map_=new C_ScaleBitmap;
		Map_->Setup(5551200,0,MapID);
	}
	Map_->SetImage(MapID);
	maxy=(float)(Map_->GetH())*FEET_PER_PIXEL;
	MinZoomLevel_=Map_->GetW()/_MIN_ZOOM_LEVEL_;
	MaxZoomLevel_=Map_->GetW()/_MAX_ZOOM_LEVEL_;
	ZoomStep_=(MinZoomLevel_ - MaxZoomLevel_) / 64;
	if(Map_ && DrawWindow_)
	{
		DrawRect_=DrawWindow_->ClientArea_[0];
		CalculateDrawingParams();
	}
}

void C_Map::SetWindow(C_Window *win)
{
	if(win)
	{
		if(DrawWindow_)
			RemoveListsFromWindow();

		DrawWindow_=win;

		if (DrawWindow_)
		{
			DrawRect_=DrawWindow_->ClientArea_[0];
			AddListsToWindow();
			CalculateDrawingParams();
		}
	}
}

void C_Map::SetupOverlay()
{
	if(Map_)
		Map_->InitOverlay();
}

void C_Map::SetWPZWindow(C_Window *win)
{
	WPZWindow_=win;
}

void C_Map::SetZoomLevel(short zoom)
{
	if(zoom >= _MIN_ZOOM_LEVEL_ && zoom <= _MAX_ZOOM_LEVEL_ && zoom != ZoomLevel_ && Map_)
	{
		ZoomLevel_=Map_->GetW()/zoom;
		CalculateDrawingParams();
	}
}

void C_Map::ZoomIn()
{
	long tempzoom;

	tempzoom=ZoomLevel_-(ZoomStep_ + (ZoomLevel_>>6));
	if(tempzoom > MinZoomLevel_)
		tempzoom=MinZoomLevel_;
	if(tempzoom < MaxZoomLevel_)
		tempzoom=MaxZoomLevel_;
	if(tempzoom != ZoomLevel_)
	{
		ZoomLevel_=tempzoom;
		CalculateDrawingParams();
	}
}

void C_Map::ZoomOut()
{
	long tempzoom;

	tempzoom=ZoomLevel_+(ZoomStep_ + (ZoomLevel_>>6));
	if(tempzoom > MinZoomLevel_)
		tempzoom=MinZoomLevel_;
	if(tempzoom < MaxZoomLevel_)
		tempzoom=MaxZoomLevel_;
	if(tempzoom != ZoomLevel_)
	{
		ZoomLevel_=tempzoom;
		CalculateDrawingParams();
	}
}

void C_Map::SetMapCenter(long x,long y)
{
	CenterX_=static_cast<float>(x);
	CenterY_=static_cast<float>(y);

	if(CenterX_ < 0) CenterX_=0;
	if(CenterX_ >= 2048) CenterX_=2047;
	if(CenterY_ < 0) CenterY_=0;
	if(CenterY_ >= 2048) CenterY_=2047;
	CalculateDrawingParams();
}

void C_Map::MoveCenter(long x,long y)
{
	float distance;
	if(Map_ == NULL || DrawWindow_ == NULL)
		return;

	if(!x && !y)
		return;

	distance=(float)(MapRect_.right-MapRect_.left)/(DrawWindow_->ClientArea_[0].right-DrawWindow_->ClientArea_[0].left);

	CenterX_+= (float)x*distance;
	CenterY_+= (float)y*distance;

	if(CenterX_ < 0) CenterX_=0;
	if(CenterX_ >= 2048) CenterX_=2047;
	if(CenterY_ < 0) CenterY_=0;
	if(CenterY_ >= 2048) CenterY_=2047;

	CalculateDrawingParams();
}

void C_Map::TurnOnNames()
{
	short i,j,k;

	for(i=0;i<_MAX_TEAMS_;i++)
	{
		for(j=0;j<_MAP_NUM_OBJ_TYPES_;j++)
			Team_[i].Objectives->Type[j]->SetFlagBitOff(C_BIT_NOLABEL);
		for(j=0;j<_MAP_NUM_NAV_TYPES_;j++)
			Team_[i].NavalUnits->Type[j]->SetFlagBitOff(C_BIT_NOLABEL);
		for(j=0;j<_MAP_NUM_GND_TYPES_;j++)
			for(k=0;k<_MAP_NUM_GND_LEVELS_;k++)
				Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOff(C_BIT_NOLABEL);
		for(j=0;j<_MAP_NUM_AIR_TYPES_;j++)
			Team_[i].AirUnits->Type[j]->SetFlagBitOff(C_BIT_NOLABEL);
	}
	flags_ |= I_NEED_TO_DRAW_MAP;
}

void C_Map::TurnOnBoundaries()
{
}

void C_Map::TurnOnArrows()
{
}

void C_Map::TurnOffNames()
{
	short i,j,k;

	for(i=0;i<_MAX_TEAMS_;i++)
	{
		for(j=0;j<_MAP_NUM_OBJ_TYPES_;j++)
			Team_[i].Objectives->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
		for(j=0;j<_MAP_NUM_NAV_TYPES_;j++)
			Team_[i].NavalUnits->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
		for(j=0;j<_MAP_NUM_GND_TYPES_;j++)
			for(k=0;k<_MAP_NUM_GND_LEVELS_;k++)
				Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOn(C_BIT_NOLABEL);
		for(j=0;j<_MAP_NUM_AIR_TYPES_;j++)
			Team_[i].AirUnits->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
	}
	flags_ |= I_NEED_TO_DRAW_MAP;
}

void C_Map::TurnOffBoundaries()
{
}

void C_Map::TurnOffArrows()
{
}

void C_Map::SetObjCallbacks(long type,void (*cb)(long,short,C_Base *))
{
	long i;

	if(type < _MAP_NUM_OBJ_TYPES_)
	{
		for(i=0;i<_MAX_TEAMS_;i++)
			if(Team_[i].Objectives->Type[type])
				Team_[i].Objectives->Type[type]->SetCallback(cb);
	}
}

void C_Map::SetAllObjCallbacks(void (*cb)(long,short,C_Base *))
{
	long i,j;

	for(i=0;i<_MAX_TEAMS_;i++)
		for(j=0;j<_MAP_NUM_OBJ_TYPES_;j++)
			if(Team_[i].Objectives->Type[j])
				Team_[i].Objectives->Type[j]->SetCallback(cb);
}

void C_Map::SetAllAirUnitCallbacks(void (*cb)(long,short,C_Base*))
{
	long i,j;

	for(i=0;i<_MAX_TEAMS_;i++)
		for(j=0;j<_MAP_NUM_AIR_TYPES_;j++)
			if(Team_[i].AirUnits->Type[j])
				Team_[i].AirUnits->Type[j]->SetCallback(cb);
}

void C_Map::SetAllGroundUnitCallbacks(void (*cb)(long,short,C_Base*))
{
	long i,j,k;

	for(i=0;i<_MAX_TEAMS_;i++)
		for(j=0;j<_MAP_NUM_GND_TYPES_;j++)
			for(k=0;k<_MAP_NUM_GND_LEVELS_;k++)
				if(Team_[i].Units->Type[j])
					if(Team_[i].Units->Type[j]->Levels[k])
						Team_[i].Units->Type[j]->Levels[k]->SetCallback(cb);
}

void C_Map::SetAllNavalUnitCallbacks(void (*cb)(long,short,C_Base*))
{
	long i,j;

	for(i=0;i<_MAX_TEAMS_;i++)
		for(j=0;j<_MAP_NUM_NAV_TYPES_;j++)
			if(Team_[i].NavalUnits->Type[j])
				Team_[i].NavalUnits->Type[j]->SetCallback(cb);
}

void C_Map::SetAirUnitCallbacks(long type,void (*cb)(long,short,C_Base*))
{
	long i;

	for(i=0;i<_MAX_TEAMS_;i++)
		if(Team_[i].AirUnits->Type[type])
			Team_[i].AirUnits->Type[type]->SetCallback(cb);
}


void C_Map::SetGroundUnitCallbacks(long level,long type,void (*cb)(long,short,C_Base*))
{
	long i;

	for(i=0;i<_MAX_TEAMS_;i++)
		if(Team_[i].Units->Type[type])
			if(Team_[i].Units->Type[type]->Levels[level])
				Team_[i].Units->Type[type]->Levels[level]->SetCallback(cb);
}

void C_Map::SetNavalUnitCallbacks(long type,void (*cb)(long,short,C_Base*))
{
	long i;

	for(i=0;i<_MAX_TEAMS_;i++)
		if(Team_[i].NavalUnits->Type[type])
			Team_[i].NavalUnits->Type[type]->SetCallback(cb);
}

C_MapIcon *C_Map::GetObjIconList(long team,long type)
{
	return(Team_[team].Objectives->Type[type]);
}

void C_Map::AddListsToWindow()
{
	short i,j,k;
	long Font=6;

	if(Map_ == NULL)
	{
		Map_=new C_ScaleBitmap;
		Map_->Setup(5551000,0,MapID);
	}
	DrawWindow_->AddControl(Map_);

	// Although The Threats are created here... they don't actually get put into a window

	if(!BullsEye_)
	{
		BullsEye_=new C_BullsEye;
		BullsEye_->Setup(5550900,0);
		BullsEye_->SetColor(0x005500);
		BullsEye_->SetFlagBitOn(C_BIT_INVISIBLE);
	}
	DrawWindow_->AddControl(BullsEye_);

	for(i=0;i<_MAX_TEAMS_;i++)
	{
		if(Team_[i].Threats == NULL)
		{
			Team_[i].Threats=new THR_LIST;

			for(j=0;j<_MAP_NUM_THREAT_TYPES_;j++)
			{
				Team_[i].Threats->Type[j]=new C_Threat;
				Team_[i].Threats->Type[j]->Setup(0,0);
				if(ThreatMask_ & (1 << j))
				{
					Team_[i].Threats->Flags[j]=1;
					Team_[i].Threats->Type[j]->SetFlagBitOff(C_BIT_INVISIBLE);
				}
				else
				{
					Team_[i].Threats->Flags[j]=0;
					Team_[i].Threats->Type[j]->SetFlagBitOn(C_BIT_INVISIBLE);
				}
			}
			SetTeamFlags(i,GetTeamFlags(i) | _MAP_THREATS_);
		}
		if(Team_[i].Objectives == NULL)
		{
			Team_[i].Objectives=new OBJ_LIST;

			for(j=0;j<_MAP_NUM_OBJ_TYPES_;j++)
			{
				Team_[i].Objectives->Type[j]=new C_MapIcon;
				Team_[i].Objectives->Type[j]->Setup(5551000+i+j*10,j);
				Team_[i].Objectives->Type[j]->SetFont(Font);
				Team_[i].Objectives->Type[j]->SetTeam(i);
				Team_[i].Objectives->Type[j]->SetMainImage(ObjIconIDs_[i][0],ObjIconIDs_[i][1]);
				if(j == FindTypeIndex(_UNIT_PACKAGE,OBJ_TypeList,_MAP_NUM_OBJ_TYPES_))
					Team_[i].Objectives->Type[j]->SetMenu(PACKAGE_POP);
				else if(j == FindTypeIndex(_UNIT_SQUADRON,OBJ_TypeList,_MAP_NUM_OBJ_TYPES_))
					Team_[i].Objectives->Type[j]->SetMenu(SQUADRON_POP);
				else
					Team_[i].Objectives->Type[j]->SetMenu(OBJECTIVE_POP);

				Team_[i].Objectives->Type[j]->SetCursorID(CRSR_F16_RM);
				Team_[i].Objectives->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
				if(ObjectiveMask_ & (1 << j))
				{
					Team_[i].Objectives->Flags[j]=1;
					Team_[i].Objectives->Type[j]->SetFlagBitOff(C_BIT_INVISIBLE);
				}
				else
				{
					Team_[i].Objectives->Flags[j]=0;
					Team_[i].Objectives->Type[j]->SetFlagBitOn(C_BIT_INVISIBLE);
				}
			}
			SetTeamFlags(i,GetTeamFlags(i) | _MAP_OBJECTIVES_);
		}
		for(j=0;j<_MAP_NUM_OBJ_TYPES_;j++)
			DrawWindow_->AddControl(Team_[i].Objectives->Type[j]);
	}
	for(i=0;i<_MAX_TEAMS_;i++)
	{
		if(Team_[i].NavalUnits == NULL)
		{
			Team_[i].NavalUnits=new NAV_LIST;

			for(j=0;j<_MAP_NUM_NAV_TYPES_;j++)
			{
				Team_[i].NavalUnits->Type[j]=new C_MapIcon;
				Team_[i].NavalUnits->Type[j]->Setup(5551800+i+j*10,j);
				Team_[i].NavalUnits->Type[j]->SetMainImage(NavyIconIDs_[i][0],NavyIconIDs_[i][1]);
				Team_[i].NavalUnits->Type[j]->SetFont(Font);
				Team_[i].NavalUnits->Type[j]->SetTeam(i);
				Team_[i].NavalUnits->Type[j]->SetMenu(NAVAL_POP);
				Team_[i].NavalUnits->Type[j]->SetCallback(UnitCB);
				Team_[i].NavalUnits->Type[j]->SetCursorID(CRSR_F16_RM);
				Team_[i].NavalUnits->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
				if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
					Team_[i].NavalUnits->Type[j]->SetFlagBitOn(C_BIT_DRAGABLE);
				else
					Team_[i].NavalUnits->Type[j]->SetFlagBitOff(C_BIT_DRAGABLE);
				if(NavalUnitMask_ & (1 << j))
				{
					Team_[i].NavalUnits->Flags[j]=1;
					Team_[i].NavalUnits->Type[j]->SetFlagBitOff(C_BIT_INVISIBLE);
				}
				else
				{
					Team_[i].NavalUnits->Flags[j]=0;
					Team_[i].NavalUnits->Type[j]->SetFlagBitOn(C_BIT_INVISIBLE);
				}
			}
			SetTeamFlags(i,GetTeamFlags(i) | _MAP_NAVAL_UNITS_);
		}
		for(j=0;j<_MAP_NUM_NAV_TYPES_;j++)
			DrawWindow_->AddControl(Team_[i].NavalUnits->Type[j]);
	}
	for(i=0;i<_MAX_TEAMS_;i++)
	{
		if(Team_[i].Units == NULL)
		{
			Team_[i].Units=new GND_LIST;

			for(j=0;j<_MAP_NUM_GND_TYPES_;j++)
			{
				Team_[i].Units->Flags[j]=0;
				Team_[i].Units->Type[j]=new GND_SIZE;
				for(k=0;k<_MAP_NUM_GND_LEVELS_;k++)
				{
					Team_[i].Units->Type[j]->Flags[k]=0;
					Team_[i].Units->Type[j]->Levels[k]=new C_MapIcon;
					Team_[i].Units->Type[j]->Levels[k]->Setup(static_cast<short>(5551300+i+j*10+k*100),static_cast<short>(j + (k << 8)));
					Team_[i].Units->Type[j]->Levels[k]->SetMainImage(ArmyIconIDs_[i][0],ArmyIconIDs_[i][1]);
					Team_[i].Units->Type[j]->Levels[k]->SetFont(Font);
					Team_[i].Units->Type[j]->Levels[k]->SetTeam(i);
					Team_[i].Units->Type[j]->Levels[k]->SetMenu(UNIT_POP);
					Team_[i].Units->Type[j]->Levels[k]->SetCursorID(CRSR_F16_RM);
					Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOn(C_BIT_NOLABEL);
					Team_[i].Units->Type[j]->Levels[k]->SetCallback (UnitCB);
					if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
						Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOn(C_BIT_DRAGABLE);
					else
						Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOff(C_BIT_DRAGABLE);
					if(UnitMask_ & (1 << j))
					{
						Team_[i].Units->Type[j]->Flags[k]=1;
						Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOff(C_BIT_INVISIBLE);
					}
					else
					{
						Team_[i].Units->Type[j]->Flags[k]=0;
						Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOn(C_BIT_INVISIBLE);
					}
				}
			}
			SetUnitLevel(0);
			SetTeamFlags(i,GetTeamFlags(i) | _MAP_UNITS_);
		}
		for(j=0;j<_MAP_NUM_GND_TYPES_;j++)
			for(k=0;k<_MAP_NUM_GND_LEVELS_;k++)
				DrawWindow_->AddControl(Team_[i].Units->Type[j]->Levels[k]);
	}
	if(CurIcons_ == NULL)
	{
		CurIcons_=new C_DrawList;
		CurIcons_->Setup(5553000,0);
	}
	DrawWindow_->AddControl(CurIcons_);

	for(i=0;i<_MAX_TEAMS_;i++)
	{
		if(Team_[i].Waypoints == NULL)
		{
			Team_[i].Waypoints=new C_Waypoint;
			Team_[i].Waypoints->Setup(5551272+i,C_TYPE_DRAGXY);
			Team_[i].Waypoints->SetCallback (WaypointCB);
			Team_[i].Waypoints->SetFont(Font);
			Team_[i].Waypoints->SetFlagBitOn(C_BIT_TOP);
			Team_[i].Waypoints->SetCursorID(CRSR_STEERPOINT);
			SetTeamFlags(i,GetTeamFlags(i) | _MAP_WAYPOINTS_);
		}
		DrawWindow_->AddControl(Team_[i].Waypoints);
	}

	// Current Waypoints (After the other waypoints... so they show up infront... (behind the airplanes though))
	if(!CurWP_)
	{
		CurWP_=new C_Waypoint;
		CurWP_->Setup(5555000,C_TYPE_DRAGXY);
		CurWP_->SetFlagBitOn(C_BIT_DRAGABLE);
		CurWP_->SetCallback (WaypointCB);
		CurWP_->SetFont(Font);
		CurWP_->SetFlagBitOn(C_BIT_TOP);
		CurWP_->SetCursorID(CRSR_STEERPOINT);
	}
	DrawWindow_->AddControl(CurWP_);

	for(i=0;i<_MAX_TEAMS_;i++)
	{
		if(Team_[i].AirUnits == NULL)
		{
			Team_[i].AirUnits=new AIR_LIST;
			for(j=0;j<_MAP_NUM_AIR_TYPES_;j++)
			{
				Team_[i].AirUnits->Type[j]=new C_MapIcon;
				Team_[i].AirUnits->Type[j]->Setup(5551200+i+j*10,j);
				Team_[i].AirUnits->Type[j]->SetFont(Font);
				Team_[i].AirUnits->Type[j]->SetTeam(i);

				Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_0,AirIconIDs_[i][0][0],AirIconIDs_[i][0][1]);
				Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_1,AirIconIDs_[i][1][0],AirIconIDs_[i][1][1]);
				Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_2,AirIconIDs_[i][2][0],AirIconIDs_[i][2][1]);
				Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_3,AirIconIDs_[i][3][0],AirIconIDs_[i][3][1]);
				Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_4,AirIconIDs_[i][4][0],AirIconIDs_[i][4][1]);
				Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_5,AirIconIDs_[i][5][0],AirIconIDs_[i][5][1]);
				Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_6,AirIconIDs_[i][6][0],AirIconIDs_[i][6][1]);
				Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_7,AirIconIDs_[i][7][0],AirIconIDs_[i][7][1]);

				Team_[i].AirUnits->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
				if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
					Team_[i].AirUnits->Type[j]->SetFlagBitOn(C_BIT_DRAGABLE);
				else
					Team_[i].AirUnits->Type[j]->SetFlagBitOff(C_BIT_DRAGABLE);
				Team_[i].AirUnits->Type[j]->SetCursorID(CRSR_F16_RM);
		

⌨️ 快捷键说明

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