📄 winmain.cpp
字号:
rcRect.top = pDeadBullet->GetY()-6;
rcRect.right = pDeadBullet->GetX()+20;
rcRect.bottom = pDeadBullet->GetY()+32;
if (rcRect.bottom > 640)
rcRect.bottom = 640;
DrawBackGround(lpBackBuffer, pDeadBullet->GetX(),pDeadBullet->GetY(),pDeadBullet->GetX()+20,pDeadBullet->GetY()+20);
while (1)
{
hRet = lpFrontBuffer->BltFast(pDeadBullet->GetX(), pDeadBullet->GetY()-6, lpBkGround, &rcRect, FALSE);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
}
void DrawInvalidBackGround()
{
// Redraw background
RECT rcRect;
HRESULT hRet;
static y = 0;
const int iFim = 455;
if (lastTickCount = 0)
{
y =0;
}
y += 1;
if (y>iFim)
y = 0;
rcRect.left = 0;
rcRect.top = 0;
rcRect.right = 640;
rcRect.bottom = iFim-y;
while (1)
{
hRet = lpBackBuffer->BltFast(0, y, lpBkGround, &rcRect, DDBLTFAST_NOCOLORKEY);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
rcRect.left = 0;
rcRect.top = iFim-y;
rcRect.right = 640;
rcRect.bottom = iFim;
while (1)
{
hRet = lpBackBuffer->BltFast(0, 0, lpBkGround, &rcRect, DDBLTFAST_NOCOLORKEY);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
//DrawBackGround(lpBackBuffer,0,y,640,460);
/* Bullet* pFirstBullet;
Extra* pFirstExtra;
Ovni* pFirstUFO;
int left;
int right;
if (iRepaint == -1)
{
pFirstExtra = pExtra;
while (pExtra != NULL)
{
pExtra->Repaint(lpBackBuffer,lpBkGround,NULL);
pExtra = pExtra->GetNext();
}
pExtra = pFirstExtra;
pFirstUFO = pUFO;
while (pUFO != NULL)
{
pUFO->Repaint(lpBackBuffer, lpBkGround, NULL);
pUFO = pUFO->GetNext();
}
pUFO = pFirstUFO;
pFirstBullet = pBullet;
while (pBullet != NULL)
{
pBullet->Repaint(lpBackBuffer,lpBkGround,NULL);
//DrawBackGround(iTempX,iTempY-12, iTempX+20, iTempY+34);
pBullet = pBullet->GetNext();
}
pBullet = pFirstBullet;
left = iShipPos-25;
if (left < 0)
left=0;
right = iShipPos+95;
if (right > 640)
right=640;
DrawBackGround(lpBackBuffer,left,380,right,456);
}
else
{
DrawBackGround(lpBackBuffer,0,0,640,480);
iRepaint--;
iLastWeapon = -1;
iLastAmmo = -1;
Lastscore = -1;
iLastShield = -1;
}*/
}
void DrawExtra()
{
// Draw extra objects in the screen (ammo, bonus, etc)
Extra* pFirstExtra;
Extra* pNextExtra = NULL;
Extra* pLastExtra = NULL;
Extra* pPrevExtra = NULL;
pFirstExtra = pExtra;
//因为当前屏幕中可能有多个奖子,所以这里使用while语句就是要将所有的奖子都绘制出来,
//当前屏幕中的奖子都被保存在同一个奖子链表中,所以绘制所有奖子时要求遍历整个奖子队列
while (pExtra != NULL)
{
//传入的是-3,即每次掉落3个象素点
pExtra->Move(-3);
//绘制当前节点奖子
pExtra->Draw(lpBackBuffer,lpExtra);
//如果当前的奖子已经掉落到屏幕以外,则调整奖子列表,删除当前奖子节点
if (pExtra->GetY() > 455)
{
//调整奖子链表节点和相关指针
if (pPrevExtra != NULL)
pPrevExtra->SetNext( pExtra->GetNext() );
pNextExtra = pExtra->GetNext();
if (pNextExtra != NULL)
pNextExtra->SetPrev(pPrevExtra);
//如果当前奖子节点位于链表中的第一位置,则还需要再调整链表
if (pExtra == pFirstExtra)
pFirstExtra=pExtra->GetNext();
//删除当前奖子节点
delete(pExtra);
//重置当前奖子节点
pExtra = pNextExtra;
}
else
{
//遍历奖子链表:当前奖子节点指向链表中下一个节点
pPrevExtra = pExtra;
pExtra = pExtra->GetNext();
}
}
pExtra = pFirstExtra;
}
void DrawBullet()
{
// Draw bullets in the screen
Bullet* pFirstBullet;
Bullet* pNextBullet = NULL;
Bullet* pLastBullet = NULL;
Bullet* pPrevBullet = NULL;
pFirstBullet = pBullet;
while (pBullet != NULL)
{
switch(pBullet->GetType())
{
case 0:
pBullet->Move(6);
pBullet->Draw(lpBackBuffer,lpShoot);
break;
case 1:
pBullet->Move(-6);
pBullet->Draw(lpBackBuffer,lpUfoShoot);
break;
case 2:
pBullet->Move(10);
pBullet->Draw(lpBackBuffer,lpShoot2);
break;
}
if ((pBullet->GetY() <= -26) ||
(pBullet->GetY() > 455))
{
if (pPrevBullet != NULL)
pPrevBullet->SetNext( pBullet->GetNext() );
pNextBullet = pBullet->GetNext();
if (pNextBullet != NULL)
pNextBullet->SetPrev(pPrevBullet);
if (pBullet == pFirstBullet)
pFirstBullet=pBullet->GetNext();
//pBullet->Repaint(lpFrontBuffer,lpBkGround, NULL);
//pBullet->Repaint(lpBackBuffer,lpBkGround, 1);
delete(pBullet);
pBullet = pNextBullet;
}
else
{
pPrevBullet = pBullet;
pBullet = pBullet->GetNext();
}
}
pBullet = pFirstBullet;
}
int CheckHitExtra(void)
{
Extra *pFirstExtra, *pPrevExtra, *pNextExtra;
int iReturn = 0;
// Check if the ship get an extra
pPrevExtra = NULL;
pNextExtra = NULL;
pFirstExtra = pExtra;
while (pExtra != NULL)
{
if ((pExtra->GetX() >= iShipPos &&
pExtra->GetX() < iShipPos+54 &&
pExtra->GetY() > 385 &&
pExtra->GetY() < 425) &&
(pExtra->GetType() != 0))
{
if (pPrevExtra != NULL)
pPrevExtra->SetNext( pExtra->GetNext() );
pNextExtra = pExtra->GetNext();
if (pNextExtra != NULL)
pNextExtra->SetPrev(pPrevExtra);
if (pExtra == pFirstExtra)
pFirstExtra=pExtra->GetNext();
iReturn = pExtra->GetType();
//pExtra->Repaint(lpFrontBuffer,lpBkGround,0);
//pExtra->Repaint(lpBackBuffer,lpBkGround,1);
delete(pExtra);
pExtra = pFirstExtra;
return iReturn;
}
pPrevExtra = pExtra;
pExtra = pExtra->GetNext();
}
pExtra = pFirstExtra;
return iReturn;
}
BOOL CheckHitShip(void)
{
Bullet *pFirstBullet, *pPrevBullet, *pNextBullet;;
// chekc if the ship was hitted
if (iShipState == 1)
return FALSE;
pPrevBullet = NULL;
pNextBullet = NULL;
pFirstBullet = pBullet;
while (pBullet != NULL)
{
if ((pBullet->GetX() >= iShipPos &&
pBullet->GetX() < iShipPos+54 &&
pBullet->GetY() > 385 &&
pBullet->GetY() < 425) &&
(pBullet->GetType() != 0))
{
if (pPrevBullet != NULL)
pPrevBullet->SetNext( pBullet->GetNext() );
pNextBullet = pBullet->GetNext();
if (pNextBullet != NULL)
pNextBullet->SetPrev(pPrevBullet);
if (pBullet == pFirstBullet)
pFirstBullet=pBullet->GetNext();
DestroyBullet(pBullet);
delete(pBullet);
pBullet = pFirstBullet;
return TRUE;
}
pPrevBullet = pBullet;
pBullet = pBullet->GetNext();
}
pBullet = pFirstBullet;
return FALSE;
}
void DrawShip()
{
static int ArgPosY = 0;
static int ArgPosX = 0;
static int inc = 70;
// draw the ship
RECT rcRect;
HRESULT hRet;
// DrawUFO();
rcRect.left = ArgPosX;
rcRect.top = ArgPosY;
rcRect.right = ArgPosX + 70;
rcRect.bottom = ArgPosY + 70;
if (bShipStop)
{
SndObjPlay(hsoStop,0);
bShipStop = FALSE;
}
iShipPos += iShipMov;
if (iShipPos <= 1)
{
iShipMov = 0;
iShipPos = 1;
}
if (iShipPos >= 569)
{
iShipMov = 0;
iShipPos = 569;
}
if (iShipState == 0 && CheckHitShip() == TRUE)
{
iShield = iShield - 20;
}
if (iShield <= 0 && iShipState == 0)
{
iShield = 0;
iShipState = 1;
iShipMov = 0;
ArgPosX = 0;
ArgPosY = 0;
rcRect.left = ArgPosX;
rcRect.top = ArgPosY;
rcRect.right = ArgPosX + 70;
rcRect.bottom = ArgPosY + 70;
inc = 70;
}
if (iShipState == SHIP_OK &&
pExtra != NULL)
{
int iType;
// check if we hit an extra
// if so, select the kinf of extra
iType = CheckHitExtra();
switch (iType)
{
case 1:
iPhotonAmmo += 25;
if (iPhotonAmmo > 999)
iPhotonAmmo = 999;
SndObjStop(hsoGetExtra);
SndObjPlay(hsoGetExtra, NULL);
break;
case 2:
iMaxWeapon++;
if (iMaxWeapon > 5)
iMaxWeapon = 5;
else
iWeapon = iMaxWeapon;
SndObjStop(hsoGetExtra);
SndObjPlay(hsoGetExtra, NULL);
break;
case 3:
score += 100;
SndObjStop(hsoGetExtra);
SndObjPlay(hsoGetExtra, NULL);
break;
case 4:
iLaserAmmo += 40;
if (iLaserAmmo > 999)
iLaserAmmo = 999;
SndObjStop(hsoGetExtra);
SndObjPlay(hsoGetExtra, NULL);
break;
case 5:
iShield += 10;
if (iShield > 50)
iShield = 50;
SndObjStop(hsoGetExtra);
SndObjPlay(hsoGetExtra, NULL);
break;
}
}
// Draw the ship sprite
while (1)
{
if (iShipState == 0)
hRet = lpBackBuffer->BltFast(iShipPos,380, lpShip, &rcRect, TRUE);
else
hRet = lpBackBuffer->BltFast(iShipPos,380, lpShipBoom, &rcRect, TRUE);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
switch (iShipState)
{
case SHIP_OK:
ArgPosX += inc;
if (ArgPosX == 350 && inc > 0)
{
ArgPosX = 0;
ArgPosY += inc;
if (ArgPosY == 350)
{
ArgPosX=280;
ArgPosY=280;
inc = -70;
return;
}
}
if (ArgPosX == -70 && inc < 0)
{
ArgPosX = 280;
ArgPosY += inc;
if (ArgPosY == -70)
{
inc = 70;
ArgPosX = 0;
ArgPosY = 0;
}
}
break;
case SHIP_EXPLODING:
ArgPosX += inc;
if (ArgPosX == 490 && inc > 0)
{
ArgPosX = 0;
ArgPosY += inc;
if (ArgPosY == 210)
{
dwShipExplode = GetTickCount();
iShipState = SHIP_DESTROYED;
return;
}
}
break;
}
}
BOOL CheckHit(Ovni* pCheckUfo)
{
Bullet *pFirstBullet, *pPrevBullet, *pNextBullet;;
// Check if we have hitted and UFO
if (pCheckUfo->isExploding() == TRUE)
return FALSE;
pPrevBullet = NULL;
pNextBullet = NULL;
pFirstBullet = pBullet;
while (pBullet != NULL)
{
if ((pBullet->GetX() > pCheckUfo->GetX() &&
pBullet->GetX() < pCheckUfo->GetX()+64 &&
pBullet->GetY() > pCheckUfo->GetY() &&
pBullet->GetY() < pCheckUfo->GetY()+56) &&
(pBullet->GetType() != 1))
{
pCheckUfo->LowStr(pBullet->GetPower());
if (pPrevBullet != NULL)
pPrevBullet->SetNext( pBullet->GetNext() );
pNextBullet = pBullet->GetNext();
if (pNextBullet != NULL)
pNextBullet->SetPrev(pPrevBullet);
if (pBullet == pFirstBullet)
pFirstBullet=pBullet->GetNext();
DestroyBullet(pBullet);
delete(pBullet);
pBullet = pFirstBullet;
if (pCheckUfo->GetStr() <= 0)
{
return TRUE;
}
else
{
score += 1;
SndObjStop(hsoSelect);
SndObjPlay(hsoSelect,NULL);
return FALSE;
}
}
pPrevBullet = pBullet;
pBullet = pBullet->GetNext();
}
pBullet = pFirstBullet;
return FALSE;
}
BOOL CheckCrash(Ovni* pCheck)
{
// Check if we have creashed in an UFO
Ovni *pFirst;
pFirst = pUFO;
while(pUFO != NULL)
{
if (pUFO->isExploding() == FALSE &&
pUFO->GetY() == pCheck->GetY() &&
pUFO != pCheck)
{
if (pCheck->GetX() < pUFO->GetX())
{
if (pUFO->GetX() - pCheck->GetX() <= 70 &&
(
(pCheck->GetInc() > 0 && pCheck->iType==0) ||
(pCheck->GetMov() == 0 && pCheck->iType==2) )
)
return TRUE;
}
else
{
if (pCheck->GetX() - pUFO->GetX() <= 70 &&
((pCheck->GetInc() < 0 &&
pCheck->iType == 0) ||
(pCheck->GetMov()==1 &&
pCheck->iType==2))
)
return TRUE;
}
}
pUFO = pUFO->GetNext();
}
pUFO = pFirst;
return FALSE;
}
void DrawUfo()
{
static int ArgPosY = 0;
static int ArgPosX = 0;
DWORD delayshoot;
Ovni* pFirst, *pNext, *pPrev, *pAux;
Bullet* pNewBullet, *pFirstBullet;
Extra* pNewExtra, *pFirstExtra;
pFirst = pUFO;
// draw all the ufos
pUFO = pFirst;
pPrev = NULL;
while(pUFO != NULL)
{
switch (pUFO->isExploding() )
{
case FALSE:
switch (pUFO->iType)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -