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

📄 mapinfo.cpp

📁 VC游戏编程基础
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	return intersect;
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void CMapInfo::ColRToMobile( RECT &rt, POINT step, CMobileObject **ppmos,
							 int num, int except, UINT team, bool checkteam,
							 int &hit )
{
	hit = -1;

	for ( int i=0; i<num; i++ ) {
		if ( i == except || !ppmos[i] || 
			( ppmos[i]->GetStat() & OBJSTAT_CADAVER ) )
			continue;
		if ( checkteam && team == ppmos[i]->m_uiTeamType ) 
			continue;
		if ( ColR2R( rt, ppmos[i]->GetRect(), step ) )
			hit = i;
	}
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void CMapInfo::ColRToB( POINT &lt, WidthType wt, POINT step, DWORD block_land, 
						  DWORD &over_land, DWORD remove_land, POINT *ptChanged,
						  int &changed )
{
	BLOCK			*pblks[4];
	POINT			index[4];
	int				mask[4];
	DWORD			over_ret, land;
	bool			bBlocked; 
	int				total = 0;
	int				bound;

	// Boundary test
	if ( wt == WIDTH_32 )
		bound = g_FrameWidth-32;
	else
		bound = g_FrameWidth-16;
	if ( lt.x < 0 )
		lt.x = 0;
	else if ( lt.x > bound )
		lt.x = bound;
	if ( lt.y < 0 )
		lt.y = 0;
	else if ( lt.y > bound )
		lt.y = bound;

	// Block Test
	do {
		// 4 block indices
		index[0].x = lt.x / g_FrameSmall;
		index[0].y = lt.y / g_FrameSmall;
		index[2].x = index[0].x;
		index[1].x = index[0].x + 1;
		index[3].x = index[1].x;
		index[1].y = index[0].y;
		index[2].y = index[0].y + 1;
		index[3].y = index[2].y;
	
		// 4 masks
		if ( wt == WIDTH_32 )
			Get4Mask( lt.x, lt.y, mask );
		else
			Get4Mask16( lt.x, lt.y, mask );

		// Test with these 4 blocks
		bBlocked = false;
		over_ret = 0;

		for ( int i=0; i<4; i++ )
		{
			pblks[i] = m_pBlocks +  index[i].y * m_cxBlocks + index[i].x;
			if ( mask[i] & pblks[i]->byObstacle )	// overlap
			{
				land = 1 << pblks[i]->byClass;
				if ( land & remove_land ) {			// remove
					if ( total < changed ) {
						pblks[i]->byObstacle &= ~mask[i];
						ptChanged[total] = index[i];
					}
					total++;
				}	
				if ( land & block_land ) {			// block
					bBlocked = true;
				}
				if ( land & over_land )				// over, set the bit
					over_ret |= land;
			}
		}
		
		// Block or not
		if ( bBlocked ) {
			if ( step.x != 0 ) {
				while ( lt.x % 16 != 0 )
					lt.x -= step.x;
			}
			else if ( step.y != 0 ) {
				while ( lt.y % 16 != 0 )
					lt.y -= step.y;
			}
		} else
			break;
	} while (true);
	
	// Set return values
	changed = total;
	over_land = over_ret;
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void CMapInfo::Get4Mask( int left, int top, int *mask) {
	int		iver = top % g_FrameSmall,
			ihor = left % g_FrameSmall;

	// Assign mask array, LT-RT-LB-RB
	// All case here.
	if ( iver > g_FrameBasis) {
		if ( ihor > g_FrameBasis ) {			// 1:2:2:4
			mask[0] = 2;
			mask[1] = 6;
			mask[2] = 3;
			mask[3] = 15;
		} else if ( ihor == g_FrameBasis ) {	// 1:1:2:2
			mask[0] = 2;
			mask[1] = 4;
			mask[2] = 3;
			mask[3] = 12;
		} else if ( ihor > 0 ) {				// 2:1:4:2
			mask[0] = 6;
			mask[1] = 4;
			mask[2] = 15;
			mask[3] = 12;
		} else {								// 2:0:4:0
			mask[0] = 6;
			mask[1] = 0;
			mask[2] = 15;
			mask[3] = 0;
		}
	} else if ( iver == g_FrameBasis ) {
		if ( ihor > g_FrameBasis ) {			// 1:2:1:2
			mask[0] = 2;
			mask[1] = 6;
			mask[2] = 1;
			mask[3] = 9;
		} else if ( ihor == g_FrameBasis ) {	// 1:1:1:1
			mask[0] = 2;
			mask[1] = 4;
			mask[2] = 1;
			mask[3] = 8;
		} else if ( ihor > 0 ) {				// 2:1:2:1
			mask[0] = 6;
			mask[1] = 4;
			mask[2] = 9;
			mask[3] = 8;
		} else {								// 2:0:2:0
			mask[0] = 6;
			mask[1] = 0;
			mask[2] = 9;
			mask[3] = 0;
		}
	} else if ( iver > 0 ) {			
		if ( ihor > g_FrameBasis ) {			// 2:4:1:2
			mask[0] = 3;
			mask[1] = 15;
			mask[2] = 1;
			mask[3] = 9;
		} else if ( ihor == g_FrameBasis ) {	// 2:2:1:1
			mask[0] = 3;
			mask[1] = 12;
			mask[2] = 1;
			mask[3] = 8;
		} else if ( ihor > 0 ) {				// 4:2:2:1
			mask[0] = 15;
			mask[1] = 12;
			mask[2] = 9;
			mask[3] = 8;
		} else {								// 4:0:2:0
			mask[0] = 15;
			mask[1] = 0;
			mask[2] = 9;
			mask[3] = 0;
		}
	} else {
		if ( ihor > g_FrameBasis ) {			// 2:4:0:0
			mask[0] = 3;
			mask[1] = 15;
			mask[2] = 0;
			mask[3] = 0;
		} else if ( ihor == g_FrameBasis ) {	// 2:2:0:0
			mask[0] = 3;
			mask[1] = 12;
			mask[2] = 0;
			mask[3] = 0;
		} else if ( ihor > 0 ) {				// 4:2:0:0
			mask[0] = 15;
			mask[1] = 12;
			mask[2] = 0;
			mask[3] = 0;
		} else {								// 4:0:0:0
			mask[0] = 15;
			mask[1] = 0;
			mask[2] = 0;
			mask[3] = 0;
		}
	}		
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void CMapInfo::Get4Mask16( int left, int top, int *mask) {
	int		iver = top % g_FrameSmall,
			ihor = left % g_FrameSmall;

	// Assign mask array, LT-RT-LB-RB
	// All case here.
	if ( iver > g_FrameBasis) {
		if ( ihor > g_FrameBasis ) {			// 1:2:2:4
			mask[0] = 2;
			mask[1] = 4;
			mask[2] = 1;
			mask[3] = 8;
		} else if ( ihor == g_FrameBasis ) {	// 1:1:2:2
			mask[0] = 2;
			mask[1] = 0;
			mask[2] = 1;
			mask[3] = 0;
		} else if ( ihor > 0 ) {				// 2:1:4:2
			mask[0] = 6;
			mask[1] = 0;
			mask[2] = 9;
			mask[3] = 0;
		} else {								// 2:0:4:0
			mask[0] = 4;
			mask[1] = 0;
			mask[2] = 8;
			mask[3] = 0;
		}
	} else if ( iver == g_FrameBasis ) {
		if ( ihor > g_FrameBasis ) {			// 1:2:1:2
			mask[0] = 2;
			mask[1] = 4;
			mask[2] = 0;
			mask[3] = 0;
		} else if ( ihor == g_FrameBasis ) {	// 1:1:1:1
			mask[0] = 2;
			mask[1] = 0;
			mask[2] = 0;
			mask[3] = 0;
		} else if ( ihor > 0 ) {				// 2:1:2:1
			mask[0] = 6;
			mask[1] = 0;
			mask[2] = 0;
			mask[3] = 0;
		} else {								// 2:0:2:0
			mask[0] = 4;
			mask[1] = 0;
			mask[2] = 0;
			mask[3] = 0;
		}
	} else if ( iver > 0 ) {			
		if ( ihor > g_FrameBasis ) {			// 2:4:1:2
			mask[0] = 3;
			mask[1] = 12;
			mask[2] = 0;
			mask[3] = 0;
		} else if ( ihor == g_FrameBasis ) {	// 2:2:1:1
			mask[0] = 3;
			mask[1] = 0;
			mask[2] = 0;
			mask[3] = 0;
		} else if ( ihor > 0 ) {				// 4:2:2:1
			mask[0] = 15;
			mask[1] = 0;
			mask[2] = 0;
			mask[3] = 0;
		} else {								// 4:0:2:0
			mask[0] = 12;
			mask[1] = 0;
			mask[2] = 0;
			mask[3] = 0;
		}
	} else {
		if ( ihor > g_FrameBasis ) {			// 2:4:0:0
			mask[0] = 1;
			mask[1] = 8;
			mask[2] = 0;
			mask[3] = 0;
		} else if ( ihor == g_FrameBasis ) {	// 2:2:0:0
			mask[0] = 1;
			mask[1] = 0;
			mask[2] = 0;
			mask[3] = 0;
		} else if ( ihor > 0 ) {				// 4:2:0:0
			mask[0] = 9;
			mask[1] = 0;
			mask[2] = 0;
			mask[3] = 0;
		} else {								// 4:0:0:0
			mask[0] = 8;
			mask[1] = 0;
			mask[2] = 0;
			mask[3] = 0;
		}
	}		
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------


/*
All case here.


if ( iver > g_FrameBasis) {
		if ( ihor > g_FrameBasis ) {			// 1:2:2:4
			mask[0] = 3;
			mask[1] = 15;
			mask[2] = 1;
			mask[3] = 8;
		} else if ( ihor == g_FrameBasis ) {	// 1:1:2:2
			mask[0] = 15;
			mask[1] = 12;
			mask[2] = 9;
			mask[3] = 8;
		} else if ( ihor > 0 ) {				// 2:1:4:2
			mask[0] = 15;
			mask[1] = 12;
			mask[2] = 9;
			mask[3] = 8;
		} else {								// 2:0:4:0
			mask[0] = 15;
			mask[1] = 0;
			mask[2] = 9;
			mask[3] = 0;
		}
	} else if ( iver == g_FrameBasis ) {
		if ( ihor > g_FrameBasis ) {			// 1:2:1:2
			mask[0] = 3;
			mask[1] = 15;
			mask[2] = 1;
			mask[3] = 8;
		} else if ( ihor == g_FrameBasis ) {	// 1:1:1:1
			mask[0] = 15;
			mask[1] = 12;
			mask[2] = 9;
			mask[3] = 8;
		} else if ( ihor > 0 ) {				// 2:1:2:1
			mask[0] = 15;
			mask[1] = 12;
			mask[2] = 9;
			mask[3] = 8;
		} else {								// 2:0:2:0
			mask[0] = 15;
			mask[1] = 0;
			mask[2] = 9;
			mask[3] = 0;
		}
	} else if ( iver > 0 ) {			
		if ( ihor > g_FrameBasis ) {			// 2:4:1:2
			mask[0] = 3;
			mask[1] = 15;
			mask[2] = 1;
			mask[3] = 8;
		} else if ( ihor == g_FrameBasis ) {	// 2:2:1:1
			mask[0] = 15;
			mask[1] = 12;
			mask[2] = 9;
			mask[3] = 8;
		} else if ( ihor > 0 ) {				// 4:2:2:1
			mask[0] = 15;
			mask[1] = 12;
			mask[2] = 9;
			mask[3] = 8;
		} else {								// 4:0:2:0
			mask[0] = 15;
			mask[1] = 0;
			mask[2] = 9;
			mask[3] = 0;
		}
	} else {
		if ( ihor > g_FrameBasis ) {			// 2:4:0:0
			mask[0] = 3;
			mask[1] = 15;
			mask[2] = 1;
			mask[3] = 8;
		} else if ( ihor == g_FrameBasis ) {	// 2:2:0:0
			mask[0] = 15;
			mask[1] = 12;
			mask[2] = 9;
			mask[3] = 8;
		} else if ( ihor > 0 ) {				// 4:2:0:0
			mask[0] = 15;
			mask[1] = 12;
			mask[2] = 9;
			mask[3] = 8;
		} else {								// 4:0:0:0
			mask[0] = 15;
			mask[1] = 0;
			mask[2] = 9;
			mask[3] = 0;
		}
	}

  */

⌨️ 快捷键说明

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