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

📄 ghostthread.cpp

📁 泡泡堂单机版
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			m_x=0;	
			return TRUE;
		}
		break;
	case 2:
		if(m_y + m_fSpeed >m_iHeight-GLB::iBlockHeight)
		{
			m_y=m_iHeight-GLB::iBlockHeight;
			return TRUE;
		}
		break;
	case 3:
		if(m_x + m_fSpeed >m_iWidth-GLB::iBlockWidth)
		{
			m_x=m_iWidth-GLB::iBlockWidth;
			return TRUE;
		}
		break;
	default:
		break;
	}
	return FALSE;
}

BOOL CGhostThread::WillGoIntoObstacle(int *direct)
{
	int xindex[2]={0,0},yindex[2]={0,0},nextx=0,nexty=0;
	switch(*direct)
	{
	case 0:
		nextx=(int)m_x+5;
		nexty=(int)(m_y-m_fSpeed);
		xindex[0]=nextx/GLB::iBlockWidth;
		yindex[0]=nexty/GLB::iBlockHeight;
		xindex[1]=(nextx+GLB::iBlockWidth-10)/GLB::iBlockWidth;
		yindex[1]=nexty/GLB::iBlockHeight;
		break;

	case 1:
		nextx=(int)(m_x-m_fSpeed);
		nexty=(int)m_y+5;
		xindex[0]=nextx/GLB::iBlockWidth;
		yindex[0]=nexty/GLB::iBlockHeight;
		xindex[1]=nextx/GLB::iBlockWidth;
		yindex[1]=(nexty+GLB::iBlockHeight-10)/GLB::iBlockHeight;
		break;

	case 2:
		nextx=(int)m_x+5;
		nexty=(int)(m_y+m_fSpeed);
		xindex[0]=nextx/GLB::iBlockWidth;
		yindex[0]=nexty/GLB::iBlockHeight+1;
		xindex[1]=(nextx+GLB::iBlockWidth-10)/GLB::iBlockWidth;
		yindex[1]=nexty/GLB::iBlockHeight+1;
		break;

	case 3:
		nextx=(int)(m_x+m_fSpeed);
		nexty=(int)m_y+5;
		xindex[0]=nextx/GLB::iBlockWidth+1;
		yindex[0]=nexty/GLB::iBlockHeight;
		xindex[1]=nextx/GLB::iBlockWidth+1;
		yindex[1]=(nexty+GLB::iBlockHeight-10)/GLB::iBlockHeight;
		break;
	default:
		break;
	}

	for(int i=0; i<=1; i++)
	{
		if(yindex[i]<0||xindex[i]<0)
			continue;
		int *piTag=GLB::pIBackMatrix+yindex[i]*GLB::iXBlocks+xindex[i];
		char *pcTag=(char *)piTag;

		//如果是奖励
		if(m_bHumanCtrl && (*pcTag)==90)
		{
			*pcTag=0;
			m_iBubbleNum++;
			if(m_iBubbleNum>10)
				m_iBubbleNum=10;
			m_iBubbleRadius++;
			if(m_iBubbleRadius>10)
				m_iBubbleRadius=10;
			m_lScore+=200;
			m_fSpeed+=0.1;
			::PlaySound("SOUND\\GETBOUND.WAV",NULL,SND_NODEFAULT|SND_ASYNC);
		}

		//   	  砖块			篱笆		  池塘			 山		
		if(*pcTag==20 || *pcTag==30 || *pcTag==40 || *pcTag==60)
		{
			return TRUE;
		}
		//					背景上加了Bubble
		if(((*piTag)&0x8000)==0x8000 && !m_bHumanCtrl)
		{
			return TRUE;
		}
	}
	return FALSE;
}

BOOL CGhostThread::WillGoIntoGhost(int *direct)
{
	double iTheCenterX=m_x+GLB::iBlockWidth/2;
	double iTheCenterY=m_y+GLB::iBlockHeight/2;
	double iTempCenterX=0,iTempCenterY=0;

	for(int i=0; i<30; i++)
	{
		if(!GLB::bGhostsAlive[i])
			continue;
		if(i==m_iIndex)
			continue;
		iTempCenterX=GLB::pGhostThread[i]->m_x+GLB::iBlockWidth/2;
		iTempCenterY=GLB::pGhostThread[i]->m_y+GLB::iBlockHeight/2;

		//如果与一个Ghost相遇了,则
		if(	abs((int)(iTheCenterX-iTempCenterX))<=(GLB::iBlockWidth+m_fSpeed)
			&&	abs((int)(iTheCenterY-iTempCenterY))<=(GLB::iBlockHeight+m_fSpeed))
		{
			//如果继续走一步不能走出重叠,则掉头,否则不改变方向继续走一步
			iTheCenterX+=(*direct-2)%2*m_fSpeed;
			iTheCenterY+=(*direct-1)%2*m_fSpeed;
			if(	abs((int)(iTheCenterX-iTempCenterX))<=GLB::iBlockWidth
				&&	abs((int)(iTheCenterY-iTempCenterY))<=GLB::iBlockHeight)
				if(m_bHumanCtrl)
				{
					//二人游戏下,如果对方被锁定(28、29),则看游戏模式,
					//如果是对抗模式,则消灭对手,并且加分,加奖励
					//如果是合作模式则解救对手,加分。
					//
					//如果锁定的是电脑,则消灭电脑,加分加奖励。
					//
					if(GLB::pGhostThread[i]->m_eState==LOCKED)
					{
						if(i==28||i==29)
						{
							if(GLB::eGameType==MULTIPLAYERFIGHT)
							{
								m_lScore+=500;
								GLB::pGhostThread[i]->m_eState=GHOSTDEAD;
							}
							else
							{
								m_lScore+=100;
								GLB::pGhostThread[i]->m_eState=ALIVE;
							}
						}
						else
						{
							m_lScore+=300;
							GLB::pGhostThread[i]->m_eState=GHOSTDEAD;
						}
					}
					return TRUE;
				}
				else
				{
					//二人游戏下,如果人被锁定(28、29),
					//则人被消灭
					//
					//如果锁定的是电脑,则解救电脑
					//
					if(GLB::pGhostThread[i]->m_eState==LOCKED)
					{
						if(i==28||i==29)
						{
							GLB::pGhostThread[i]->m_eState=GHOSTDEAD;
						}
						else
						{
							GLB::pGhostThread[i]->m_eState=ALIVE;
						}
					}
					*direct=(*direct+2)%4;
					return TRUE;
				}
		}
	}
	return FALSE;
}

BOOL CGhostThread::WillGoIntoBubble(int *direct)
{
	double iTheCenterX=m_x+GLB::iBlockWidth/2;
	double iTheCenterY=m_y+GLB::iBlockHeight/2;
	double iTempCenterX=0,iTempCenterY=0;

	if(GLB::pBubbleThread[m_iLastBubbleIndex]->m_state==DEAD)
		m_bSetBubbleNotLeave=FALSE;

	for(int i=0; i<30; i++)
	{
		if(GLB::pBubbleThread[i]->m_state==DEAD)
			continue;
		iTempCenterX=GLB::pBubbleThread[i]->m_fX+GLB::iBlockWidth/2;
		iTempCenterY=GLB::pBubbleThread[i]->m_fY+GLB::iBlockHeight/2;

		//如果与一个Bubble相遇了,则
		if(abs((int)(iTheCenterX-iTempCenterX))<=(GLB::iBlockWidth+m_fSpeed)
			&&	abs((int)(iTheCenterY-iTempCenterY))<=(GLB::iBlockHeight+m_fSpeed))
		{
		//如果刚埋好Bubble,则不应该阻挡 (根据刚埋Bubble标记)
			if(i!=m_iLastBubbleIndex || !m_bSetBubbleNotLeave)
			{
				//如果继续走一步不能走出重叠,则掉头,否则不改变方向继续走一步
				iTheCenterX+=(*direct-2)%2*m_fSpeed;
				iTheCenterY+=(*direct-1)%2*m_fSpeed;
				if(	abs((int)(iTheCenterX-iTempCenterX))<=GLB::iBlockWidth
					&&	abs((int)(iTheCenterY-iTempCenterY))<=GLB::iBlockHeight)
					if(m_bHumanCtrl)
						return TRUE;
					else
					{
						*direct=(*direct+2)%4;
						return TRUE;
					}
			}
		}
		else
		{
		//一旦离开了刚刚埋好的Bubble,则刚埋Bubble的标记取消
			if(i==m_iLastBubbleIndex)
				m_bSetBubbleNotLeave=FALSE;
		}
	}
	return FALSE;
}

void CGhostThread::MakeDirect(double iX, double iY, double r)
{
	int i=	(iX-m_x>=GLB::iBlockWidth)			*0xf0000000
			+(m_x-iX>=GLB::iBlockWidth)			*0x0f000000
	+(abs((int)(m_x-iX))<GLB::iBlockWidth)		*0xff000000
		+(iY-m_y>=GLB::iBlockHeight)			*0x00f00000
		+(m_y-iY>=GLB::iBlockHeight)			*0x000f0000
	+(abs((int)(m_y-iY))<GLB::iBlockHeight)		*0x00ff0000
	+(abs((int)(iX-m_x))>=abs((int)(iY-m_y)))	*0x0000f000
	+(abs((int)(iX-m_x))<abs((int)(iY-m_y)))	*0x00000f00;
	BOOL PFIRST=(r<=2),
		 PSECOND=((2<r) && (r<=3)),
		 PTHIRD=((3<r)&&(r<=3.5)),
		 PFOURTH=((3.5<r)&&(r<=4));

	BOOL P2FIRST=(r<2.8),
		 P2SECOND=((2.8<=r)&&(r<=3.2)),
		 P2THIRD=((3.2<=r)&&(r<=3.6)),
		 P2FOURTH=((3.6<=r)&&(r<=4));



	switch(i)
	{
	//1/12点方向,概率:向上(0)走4,右(3)走2,左(1)走1,下(2)走1
	case 0xf00f0f00:
		m_iDirect=(PFIRST)*0+(PSECOND)*3+(PTHIRD)*1+(PFOURTH)*2;
		break;
	//2点方向,概率:向右(3)走4,上(0)走2,左(1)走1,下(2)走1
	case 0xf00ff000:
		m_iDirect=(PFIRST)*3+(PSECOND)*0+(PTHIRD)*1+(PFOURTH)*2;
		break;
	//4/3点方向,概率:向右(3)走4,下(2)走2,上(0)走1,左(1)走1
	case 0xf0f0f000:
		m_iDirect=(PFIRST)*3+(PSECOND)*2+(PTHIRD)*0+(PFOURTH)*1;
		break;
	//5/6点方向,概率:向下(2)走4,右(3)走2,上(0)走1,左(1)走1
	case 0xf0f00f00:
		m_iDirect=(PFIRST)*2+(PSECOND)*3+(PTHIRD)*0+(PFOURTH)*1;
		break;
	//7点方向,概率:向下(2)走4,左(1)走2,上(0)走1,右(3)走1
	case 0x0ff00f00:
		m_iDirect=(PFIRST)*2+(PSECOND)*1+(PTHIRD)*3+(PFOURTH)*0;
		break;
	//8/9点f方向,概率:向左(1)走4,下(2)走2,上(0)走1,右(3)走1
	case 0x0ff0f000:
		m_iDirect=(PFIRST)*1+(PSECOND)*2+(PTHIRD)*3+(PFOURTH)*0;
		break;
	//10点方向,概率:向左(1)走4,上(0)走2,下(2)走1,右(3)走1
	case 0x0f0ff000:
		m_iDirect=(PFIRST)*1+(PSECOND)*0+(PTHIRD)*2+(PFOURTH)*3;
		break;
	//11点方向,概率:向上(0)走4,左(1)走2,下(2)走1,右(3)走1
	case 0x0f0f0f00:
		m_iDirect=(PFIRST)*0+(PSECOND)*1+(PTHIRD)*2+(PFOURTH)*3;
		break;
	//x几乎相等,目标y小,向上
	case 0xff0f0f00:
		m_iDirect=(P2FIRST)*0+(P2SECOND)*1+(P2THIRD)*2+(P2FOURTH)*3;
		break;
	//x几乎相等,目标y大,向下
	case 0xfff00f00:
		m_iDirect=(P2FIRST)*2+(P2SECOND)*0+(P2THIRD)*1+(P2FOURTH)*3;
		break;
	//y几乎相等,目标x小,向左
	case 0x0ffff000:
		m_iDirect=(P2FIRST)*1+(P2SECOND)*0+(P2THIRD)*2+(P2FOURTH)*3;
		break;
	//y几乎相等,目标x大,向右
	case 0xf0fff000:
		m_iDirect=(P2FIRST)*3+(P2SECOND)*0+(P2THIRD)*1+(P2FOURTH)*2;
		break;
	default:
//		AfxMessageBox("Error occured when making direction.");
		break;
	}
}

void CGhostThread::InitiateDCs(BOOL bHumanCtrl, int iIndex, CDC* pDC)
{
	m_pDC=pDC;
	m_bHumanCtrl=bHumanCtrl;
	m_iIndex=iIndex;

	for(int i=0; i<12; i++)
	{
		m_pPartMemBMP[i]=new CBitmap;
		if(!bHumanCtrl)
			m_pPartMemBMP[i]->LoadBitmap(200+(i/3)*10+(i%3));
		else
			if(m_iIndex==28)
				m_pPartMemBMP[i]->LoadBitmap(100+(i/3)*10+(i%3));
			else
				m_pPartMemBMP[i]->LoadBitmap(170+i);
	}
	for(i=0; i<16; i++)
	{
		m_pDeadMemBMP[i]=new CBitmap;
		m_pDeadMemBMP[i]->LoadBitmap(371+i);
	}

	for(i=0; i<4; i++)
	{
		m_pLockedMemBMP[i]=new CBitmap;
		m_pLockedMemBMP[i]->LoadBitmap(340+i);
	}

	m_pPartImageMemDC=new CDC;
	m_pPartImageMemDC->CreateCompatibleDC(pDC);
	m_pPartImageMemDC->SelectObject(m_pPartMemBMP[m_iFrameCount]);
}

⌨️ 快捷键说明

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