📄 winmain.cpp
字号:
DrawScore(510,460);
Lastscore = score;
}
if (iLastWeapon != iWeapon)
{
DrawBackGround(lpBackBuffer, 84,458, 172,477);
DrawBackGround(lpFrontBuffer,84,458, 172,477);
DrawWeapon();
iLastWeapon = iWeapon;
iLastAmmo = -1;
}
if (iWeapon < 3)
iAmmo = iLaserAmmo;
else
iAmmo = iPhotonAmmo;
if (iLastAmmo != iAmmo)
{
DrawBackGround(lpBackBuffer,241,459,300,477);
DrawBackGround(lpFrontBuffer,241,459,300,477);
DrawAmmo();
iLastAmmo = iAmmo;
}
if ((thisTickCount - lastTickCount) <= delay)
return;
if (pUFO == NULL &&
pExtra == NULL)
{
SndObjPlay(hsoEnter, NULL);
InitLevel(TRUE);
DrawBackGround(lpBackBuffer,0,0,640,480);
DrawBackGround(lpFrontBuffer,0,0,640,480);
DrawScore(510,459);
lastTickCount = 0;
return;
}
DrawInvalidBackGround();
DrawExtra();
DrawUfo();
DrawBullet();
DrawShip();
bShoot = FALSE;
while( 1 )
{
ddrval = lpFrontBuffer->Flip(NULL, 0 );
if( ddrval == DD_OK )
{
break;
}
if( ddrval == DDERR_SURFACELOST )
{
if( !RestoreSurfaces() )
{
return;
}
}
if( ddrval != DDERR_WASSTILLDRAWING )
{
break;
}
}
lastTickCount = GetTickCount();
break;
case APP_CREDITS:
ShowCredits();
iAppState = 0;
lastTickCount = 0;
break;
case APP_HELPSCREEN:
static BOOL bBlink;
static DWORD dwTime;
if ((thisTickCount - lastTickCount) <= delay+20)
return;
if (lastTickCount == 0)
{
ddbltfx.dwSize = sizeof( ddbltfx );
ddbltfx.dwFillColor = RGB(0,0,0);
rcRect.left = 0;
rcRect.top = 0;
rcRect.right = 640;
rcRect.bottom = 480;
while (1)
{
hRet = lpFrontBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
while (1)
{
hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
bltText("PHOTON AMMO\0",90,45);
bltText("WEAPON ADVANCE\0",90,95);
bltText("100 POINTS BONUS\0",90,145);
bltText("LASER AMMO\0",90,195);
bltText("SHIELD CHARGE\0",90,245);
bltText("LEFT, RIGHT - MOVE SHIP\0",50,290);
bltText("DOWN OR ENTER - STOP SHIP\0",50,325);
bltText("CTRL - CHANGE WEAPON\0",50,360);
bltText("PRESS ANY KEY TO CONTINUE\0",140,450);
bBlink = FALSE;
dwTime = 0;
}
ddbltfx.dwSize = sizeof( ddbltfx );
ddbltfx.dwFillColor = dwFillColor;
rcRect.left = 50;
rcRect.top = 40;
rcRect.right = 75;
rcRect.bottom = 270;
while (1)
{
hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
if (bBlink == TRUE)
{
ddbltfx.dwSize = sizeof( ddbltfx );
ddbltfx.dwFillColor = dwFillColor;
rcRect.left = 0;
rcRect.top = 450;
rcRect.right = 640;
rcRect.bottom = 475;
while (1)
{
hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
dwTime = dwTime + 1;
if (dwTime == 20)
{
bltText("PRESS ANY KEY TO CONTINUE\0",140,450);
bBlink = FALSE;
dwTime = 0;
}
}
else
{
dwTime = dwTime + 1;
if (dwTime == 20)
{
//bltText("PRESS ANY KEY TO CONTINUE\0",140,450);
bBlink = TRUE;
dwTime = 0;
}
}
rcRect.left = frame * 25;
rcRect.right = (frame * 25) + 25;
rcRect.top = 0;
rcRect.bottom = 25;
while (1)
{
hRet = lpBackBuffer->BltFast(50, 40, lpExtra, &rcRect, TRUE);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
rcRect.top = 25;
rcRect.bottom = 50;
while (1)
{
hRet = lpBackBuffer->BltFast(50, 90, lpExtra, &rcRect, TRUE);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
rcRect.top = 50;
rcRect.bottom = 75;
while (1)
{
hRet = lpBackBuffer->BltFast(50, 140, lpExtra, &rcRect, TRUE);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
rcRect.top = 75;
rcRect.bottom = 100;
while (1)
{
hRet = lpBackBuffer->BltFast(50, 190, lpExtra, &rcRect, TRUE);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
rcRect.top = 100;
rcRect.bottom = 125;
while (1)
{
hRet = lpBackBuffer->BltFast(50, 240, lpExtra, &rcRect, TRUE);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
frame++;
if (frame == 19)
frame = 0;
while( 1 )
{
ddrval = lpFrontBuffer->Flip(NULL, 0 );
if( ddrval == DD_OK )
{
break;
}
if( ddrval == DDERR_SURFACELOST )
{
if( !RestoreSurfaces() )
{
return;
}
}
if( ddrval != DDERR_WASSTILLDRAWING )
{
break;
}
}
lastTickCount = thisTickCount;
return;
}
return;
}
void DestroyGame()
{
// Destroy game objects
Ovni* auxpUFO;
Bullet* auxpBullet;
Extra* pAuxExtra;
while(pExtra !=NULL)
{
pAuxExtra = pExtra->GetNext();
delete(pExtra);
pExtra = pAuxExtra;
}
while(pUFO !=NULL)
{
auxpUFO = pUFO->GetNext();
delete(pUFO);
pUFO = auxpUFO;
}
while(pBullet !=NULL)
{
auxpBullet = pBullet->GetNext();
delete(pBullet);
pBullet = auxpBullet;
}
if( lpBkGround != NULL )
lpBkGround->Release();
if( lpBackBuffer != NULL )
lpBackBuffer->Release();
if( lpFrontBuffer != NULL )
lpFrontBuffer->Release();
if( lpUfo != NULL )
lpUfo->Release();
if( lpShoot != NULL )
lpShoot->Release();
if( lpShoot2 != NULL )
lpShoot2->Release();
if( lpShip != NULL )
lpShip->Release();
if( lpBoom != NULL )
lpBoom->Release();
if( lpUfoShoot != NULL )
lpUfoShoot->Release();
if( lpAlpha != NULL )
lpAlpha->Release();
if( lpShipBoom != NULL )
lpShipBoom->Release();
if( lpArtPalette != NULL )
lpArtPalette->Release();
if( lpDD != NULL )
lpDD->Release();
DestroySound();
return;
}
BOOL CleanupAndExit( char *err)
{
#ifdef DEBUG
wsprintf(DebugBuf, "___CleanupAndExit err = %s\n", err );
OutputDebugString( DebugBuf );
#endif
// make the cursor visible
SetCursor(LoadCursor( NULL, IDC_ARROW ));
DestroyGame();
MessageBox( hWndMain, err, "ERROR", MB_OK );
return FALSE;
}
// Surface loading functions
BOOL LoadUfoSurface(int iFlags)
{
HRESULT ddrval;
HBITMAP hbm;
ddrval = lpUfo->Restore();
if( ddrval != DD_OK )
return FALSE;
ddrval = lpBoom->Restore();
if( ddrval != DD_OK )
return FALSE;
switch(iLevel % 6)
{
case 0:
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO3), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
break;
case 4:
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
break;
case 5:
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
break;
default:
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
break;
};
if( NULL == hbm )
return FALSE;
ddrval = DDCopyBitmap(lpUfo, hbm, 0, 0, 350, 700 );
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
switch(iLevel % 6)
{
case 0:
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM3), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
break;
case 4:
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
break;
case 5:
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
break;
default:
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
break;
};
if( NULL == hbm )
return FALSE;
ddrval = DDCopyBitmap(lpBoom, hbm, 0, 0, 350, 280);
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
return TRUE;
}
BOOL RestoreSurfaces( void )
{
HRESULT ddrval;
HBITMAP hbm;
ddrval = lpShip->Restore();
if( ddrval != DD_OK )
return FALSE;
ddrval = lpShipBoom->Restore();
if( ddrval != DD_OK )
return FALSE;
ddrval = lpShoot->Restore();
if( ddrval != DD_OK )
return FALSE;
ddrval = lpUfoShoot->Restore();
if( ddrval != DD_OK )
return FALSE;
ddrval = lpBackBuffer->Restore();
if( ddrval != DD_OK )
return FALSE;
ddrval = lpBkGround->Restore();
if( ddrval != DD_OK )
return FALSE;
ddrval = lpFrontBuffer->Restore();
if( ddrval != DD_OK )
return FALSE;
// Create and set the palette for the art bitmap
lpArtPalette = DDLoadPalette( lpDD, MAKEINTRESOURCE(IDB_BOOM));
if( NULL == lpArtPalette )
return CleanupAndExit("DDLoadPalette UFO");
// set the palette before loading the art
lpFrontBuffer->SetPalette(lpArtPalette );
if (LoadUfoSurface(iLevel) == FALSE)
return FALSE;
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_FUNDO), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
if( NULL == hbm )
return FALSE;
ddrval = DDCopyBitmap(lpBkGround, hbm, 0, 0, 640, 480 );
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHIP), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
if( NULL == hbm )
return FALSE;
ddrval = DDCopyBitmap(lpShip, hbm, 0, 0, 350, 350 );
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHOOT), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
if( NULL == hbm )
return FALSE;
ddrval = DDCopyBitmap(lpShoot, hbm, 0, 0, 220, 20);
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHOOT2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
if( NULL == hbm )
return FALSE;
ddrval = DDCopyBitmap(lpShoot2, hbm, 0, 0, 20, 20);
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFOSHOOT), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
if( NULL == hbm )
return FALSE;
ddrval = DDCopyBitmap(lpUfoShoot, hbm, 0, 0, 400, 20);
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHIPEXPLODE), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
if( NULL == hbm )
return FALSE;
ddrval = DDCopyBitmap(lpShipBoom, hbm, 0, 0, 490, 210);
if( ddrval != DD_OK )
{
DeleteObject( hbm );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -