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

📄 winmain.cpp

📁 入侵者游戏 编译环境VC 开发库DIRECTX8.1以上 2D游戏
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			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 + -