📄 ghostthread.cpp
字号:
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 + -