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

📄 collision.txt

📁 Visual C++ 游戏开发与设计实例 源代码(所有)
💻 TXT
字号:

case TANK_DIR_RIGHT:
		dest.x = MIN(start.x + step,G_SCREEN_WIDTH-G_TANK_WIDTH);
		if(dest.x == G_SCREEN_WIDTH-G_TANK_WIDTH)
			goto endTest;
		if((start.x&0x000f)==0 || 
			(((dest.x-1)^start.x)&0x0010) != 0)
		{
			corX = (dest.x+32)>>5;
			corY = start.y>>5;
			block1 = pBlocks[corY][corX];
			corY = MIN(corY+1,19);
			block2 = pBlocks[corY][corX];
			flag = start.y & 0x001f;
			if(dest.x & 0x0010)
				ret = ParseBlock32(&block1,&block2,BLOCK_DIR_RIGHT,
					flag,ptk->dwEquip);
			else
				ret = ParseBlock32(&block1,&block2,BLOCK_DIR_LEFT,
					flag,ptk->dwEquip);
			if(ret & COL_PASS)
			{
				land.x = dest.x;
				TestTankOnIce(ret&COL_ICE,ptk);
			}
			else
				land.x = dest.x & 0xfffffff0;
		}
		else
			land.x = dest.x;
		SetRect(&rect,start.x+G_TANK_WIDTH,start.y,dest.x+G_TANK_WIDTH,
			start.y+G_TANK_HEIGHT);
		objret = GetObjectsInRect(rect,dir,pvoid,G_TANK,0);
		if(objret)
		{
			if(objret == TEST_RET_TANK)
				object.x = ((LPTANKOBJECT)*pvoid)->Left-G_TANK_WIDTH;
			else if(objret == TEST_RET_BASE)
				object.x = posBase[(int)*pvoid].x-G_TANK_WIDTH;
			else
				object.x = ((LPBULLETOBJECT)*pvoid)->Left-G_BULLET_WIDTH;
			dest.x = MIN(land.x,object.x);
		}
		else
			dest.x = land.x;
		break;

	////////////////////////////////////////////////////
	case TANK_DIR_LEFT:
		dest.x = MAX(start.x - step,0);
		if(dest.x == 0)
			goto endTest;
		if((((dest.x-1)^start.x)&0x0010)!=0)
		{
			corX = dest.x>>5;
			corY = start.y>>5;
			block1 = pBlocks[corY][corX];
			corY = MIN(corY+1,19);
			block2 = pBlocks[corY][corX];
			flag = start.y & 0x001f;
			if(dest.x & 0x0010)
				ret = ParseBlock32(&block1,&block2,BLOCK_DIR_RIGHT,
					flag,ptk->dwEquip);
			else
				ret = ParseBlock32(&block1,&block2,BLOCK_DIR_LEFT,
					flag,ptk->dwEquip);
			if(ret & COL_PASS)
			{
				land.x = dest.x;
				TestTankOnIce(ret&COL_ICE,ptk);
			}
			else
				land.x = start.x & 0xfffffff0;
		}
		else
			land.x = dest.x;
		SetRect(&rect,dest.x,start.y,start.x,start.y+G_TANK_HEIGHT);
		objret = GetObjectsInRect(rect,dir,pvoid,G_TANK,0);
		if(objret)
		{
			if(objret == TEST_RET_TANK)
				object.x = ((LPTANKOBJECT)*pvoid)->Left+G_TANK_WIDTH;
			else if(objret == TEST_RET_BASE)
				object.x = posBase[(int)*pvoid].x+G_TANK_WIDTH;
			else
				object.x = ((LPBULLETOBJECT)*pvoid)->Left+G_BULLET_WIDTH;
			dest.x = MAX(land.x,object.x);
		}
		else
			dest.x = land.x;
		break;

	////////////////////////////////////////////////////
	case TANK_DIR_UP:
		dest.y  = MAX(start.y - step,0);
		if(dest.y == 0)
			goto endTest;
		if((((dest.y-1)^start.y)&0x0010) != 0)
		{
			corX = start.x>>5;
			corY = dest.y>>5;
			block1 = pBlocks[corY][corX];
			corX = MIN(corX+1,19);
			block2 = pBlocks[corY][corX];
			flag = start.x & 0x001f;
			if(dest.y&0x0010)
				ret = ParseBlock32(&block1,&block2,BLOCK_DIR_DOWN,
					flag,ptk->dwEquip);
			else
				ret = ParseBlock32(&block1,&block2,BLOCK_DIR_UP,
					flag,ptk->dwEquip);
			if(ret & COL_PASS)
			{
				land.y = dest.y;
				TestTankOnIce(ret&COL_ICE,ptk);
			}
			else
				land.y = start.y & 0xfffffff0;
		}
		else
			land.y = dest.y;
		SetRect(&rect,start.x,dest.y,start.x+G_TANK_WIDTH,start.y);
		objret = GetObjectsInRect(rect,dir,pvoid,G_TANK,0);
		if(objret)
		{
			if(objret == TEST_RET_TANK)
				object.y = ((LPTANKOBJECT)*pvoid)->Top+G_TANK_HEIGHT;
			else if(objret == TEST_RET_BASE)
				object.y = posBase[(int)*pvoid].y+G_TANK_HEIGHT;
			else
				object.y = ((LPBULLETOBJECT)*pvoid)->Top+G_BULLET_HEIGHT;
			dest.y = MAX(land.y,object.y);
		}
		else
			dest.y = land.y;
		break;

⌨️ 快捷键说明

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