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

📄 winmain.cpp

📁 入侵者游戏 编译环境VC 开发库DIRECTX8.1以上 2D游戏
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//*******************************************************
//* INVASION - By Maur韈io Teichmann RItter	1998       	*
//* Please, respect the copyright                       *
//*******************************************************

#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <math.h>
#include <ddraw.h>
#include "ddutil.h"
#include "dsutil.hpp"

#include "ufo.hpp"
#include "resource.h"

// Define Weapon kinds
#define	WP_1_LASER      0
#define	WP_2_LASER      1
#define	WP_3_LASER      2
#define	WP_1_PHOTON     3
#define	WP_2_PHOTON     4
#define	WP_3_PHOTON     5

// Define Ship States
#define SHIP_OK         0
#define SHIP_EXPLODING  1
#define SHIP_DESTROYED  3

// Define the application states
#define APP_MAINMENU     0
#define APP_GAMESCREEN   1
#define APP_CREDITS      2
#define APP_HELPSCREEN   3

int						 iAppState = APP_MAINMENU;

LPDIRECTDRAW7            lpDD;
LPDIRECTDRAWSURFACE7     lpFrontBuffer;
LPDIRECTDRAWSURFACE7     lpBackBuffer;
LPDIRECTDRAWSURFACE7     lpUfo;
LPDIRECTDRAWSURFACE7     lpBkGround;
LPDIRECTDRAWSURFACE7     lpShip;
LPDIRECTDRAWSURFACE7     lpShoot;
LPDIRECTDRAWSURFACE7     lpShoot2;
LPDIRECTDRAWSURFACE7     lpUfoShoot;
LPDIRECTDRAWSURFACE7     lpBoom;
LPDIRECTDRAWSURFACE7     lpShipBoom;
LPDIRECTDRAWSURFACE7     lpAlpha;
LPDIRECTDRAWSURFACE7     lpSelect;
LPDIRECTDRAWSURFACE7     lpStatusBar;
LPDIRECTDRAWSURFACE7     lpExtra;
LPDIRECTDRAWPALETTE     lpArtPalette;

//** INITIAL POINTERS
Ovni*					 pUFO    = NULL;
Bullet*					 pBullet = NULL;
Extra*					 pExtra  = NULL;

unsigned int			score;
unsigned int			Lastscore;


DWORD					dwShipExplode;
int						iOption;

LPDIRECTSOUND           lpDS;
HSNDOBJ                 hsoEnter          = NULL;
HSNDOBJ                 hsoShoot          = NULL;
HSNDOBJ                 hsoStop           = NULL;
HSNDOBJ                 hsoBoom           = NULL;
HSNDOBJ                 hsoUfoShoot       = NULL;
HSNDOBJ                 hsoSelect         = NULL;
HSNDOBJ                 hsoGetExtra       = NULL;
HSNDOBJ                 hsoGameOver       = NULL;

BOOL                    bSoundEnabled = FALSE;

BOOL					bShipStop = FALSE;
BOOL					bShootEnable = TRUE;
BOOL					bShoot = FALSE;
BOOL					iRepaint = -1;


HWND                    hWndMain;
HINSTANCE               hInst;
BOOL                    bIsActive;
DWORD                   dwTransType;
DWORD                   lastTickCount = 0;

DWORD                   dwFillColor;

//** SHIP VARIABLES
int						iShipMov;
int						iShipState = 0;
int			      	    iShipPos = 285;
int						iWeapon = 0;
int						iLastWeapon = -1;
int						iPhotonAmmo = 0;
int						iLaserAmmo  = 100;
int						iLastAmmo = -1;
int						iMaxWeapon = 0;
int						iShield = 0;
int						iLastShield = -1;

//** LEVEL VARIABLES
int	  				    iLevel;
int						SHOOTCHANCE  = 1000;

// Defini玢o das fun珲es
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow );
BOOL RestoreSurfaces( void );
void DestroyGame(void);
BOOL RestoreSurfaces( void );
void bltText(char*  buffer, int  x, int y);
void ShowGameOver();
void DrawBackGround(LPDIRECTDRAWSURFACE7 lpDest, int x, int y, int wx, int wy);
BOOL LoadUfoSurface(int iFlags);
BOOL CleanupAndExit( char *err);

void InitLevel(BOOL bStart)
{

	Ovni*	pFirst;
	Bullet* auxpBullet;
	Extra*	pAuxExtra;

	int i = 0;
	int valInc = 1;
	int rem;
	int iLastExtra = 0;
	DWORD		tick;
	HRESULT		hRet;
	DDBLTFX     ddbltfx;
	char		buffer[10];

	while(pExtra !=NULL)
	{
		pAuxExtra = pExtra->GetNext();
		delete(pExtra);
		pExtra = pAuxExtra;
	}

	while(pBullet !=NULL)
	{
		auxpBullet = pBullet->GetNext();
		delete(pBullet);
		pBullet = auxpBullet;
	}

	iLevel++;
	if (LoadUfoSurface(iLevel) != TRUE)
		CleanupAndExit("General Failed loading Ufo... Restart Game !");
	switch(iLevel % 6)
	{
	case 0:
		int		i;
		i = iLevel / 6;

		pUFO    = new Ovni;
		pFirst = pUFO;
		pUFO->SetXY(20,20);
		iLastExtra = pUFO->CreateExtra(0);
		pUFO->SetInc(i);
		pUFO->SetMov(0);
		pUFO->iType = 2;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(110,90);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(i);
		pUFO->SetMov(0);
		pUFO->iType = 2;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(20,160);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(i);
		pUFO->SetMov(0);
		pUFO->iType = 2;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(540,20);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(i);
		pUFO->SetMov(1);
		pUFO->iType = 2;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(470,90);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(i);
		pUFO->SetMov(1);
		pUFO->iType = 2;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(540,160);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(i);
		pUFO->SetMov(1);
		pUFO->iType = 2;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);
		break;
	case 1:
		
		for (i=0; i<3; i++)
		{
		if (i==0)
			{
				pUFO    = new Ovni;
				pFirst = pUFO;
				
			}
		else
			{
				pUFO->SetNext(new Ovni);
				pUFO = pUFO->GetNext();
			}
		
		pUFO->SetXY(15 + (i*30),(i * 65)+10);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(1);
		pUFO->SetMov(0);
		pUFO->SetNext(NULL);
		pUFO->SetQtdeDown(1);
		pUFO->SetStr((int)(iLevel /7)+1);
		}

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(45,195);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(1);
		pUFO->SetMov(0);
		pUFO->SetNext(NULL);
		pUFO->SetQtdeDown(1);
		pUFO->SetStr((int)(iLevel /7)+1);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(15,260);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(1);
		pUFO->SetMov(0);
		pUFO->SetNext(NULL);
		pUFO->SetQtdeDown(1);
		pUFO->SetStr((int)(iLevel /7)+1);

		for (i=0; i<3; i++)
		{
		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();

		pUFO->SetXY(560 - (i*30),(i * 65)+10);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(-1);
		pUFO->SetMov(0);
		pUFO->SetNext(NULL);
		pUFO->SetQtdeDown(1);
		pUFO->SetStr((int)(iLevel /7)+1);
		}

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();

		pUFO->SetXY(530,195);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(-1);
		pUFO->SetMov(0);
		pUFO->SetNext(NULL);
		pUFO->SetQtdeDown(1);
		pUFO->SetStr((int)(iLevel /7)+1);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();

		pUFO->SetXY(560,260);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(-1);
		pUFO->SetMov(0);
		pUFO->SetNext(NULL);
		pUFO->SetQtdeDown(1);
		pUFO->SetStr((int)(iLevel /7)+1);

		break;

	case 2:
		for (i=0; i<5; i++)
		{
		if (i==0)
			{
				pUFO    = new Ovni;
				pFirst = pUFO;
			}
		else
			{
				pUFO->SetNext(new Ovni);
				pUFO = pUFO->GetNext();
			}
		pUFO->SetXY(15 + (i*30),(i * 65)+10);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(1);
		pUFO->SetMov(0);
		pUFO->SetNext(NULL);
		pUFO->SetQtdeDown(1);
		pUFO->SetStr((int)(iLevel /7)+1);
		}

		for (i=0; i<5; i++)
		{
		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();

		pUFO->SetXY(560 - (i*30),(i * 65)+10);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(-1);
		pUFO->SetMov(0);
		pUFO->SetNext(NULL);
		pUFO->SetQtdeDown(1);
		pUFO->SetStr((int)(iLevel /7)+1);
		}
		break;
	case 4:
		pUFO    = new Ovni;
		pFirst = pUFO;
		pUFO->SetXY(20,20);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(2);
		pUFO->SetMov(2);
		pUFO->iType = 1;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(180,180);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(2);
		pUFO->SetMov(2);
		pUFO->iType = 1;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);


		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(530,110);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(2);
		pUFO->SetMov(3);
		pUFO->iType = 1;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(100,100);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(2);
		pUFO->SetMov(1);
		pUFO->iType = 1;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(450,190);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(2);
		pUFO->SetMov(0);
		pUFO->iType = 1;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);
		break;

	case 5:
		pUFO    = new Ovni;
		pFirst = pUFO;
		pUFO->SetXY(20,20);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(3);
		pUFO->SetMov(2);
		pUFO->iType = 1;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);


		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(90,90);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(3);
		pUFO->SetMov(2);
		pUFO->iType = 1;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(20,160);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(3);
		pUFO->SetMov(3);
		pUFO->iType = 1;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(540,20);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(3);
		pUFO->SetMov(3);
		pUFO->iType = 1;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(470,90);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(3);
		pUFO->SetMov(3);
		pUFO->iType = 1;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);

		pUFO->SetNext(new Ovni);
		pUFO = pUFO->GetNext();
		pUFO->SetXY(540,160);
		iLastExtra = pUFO->CreateExtra(iLastExtra);
		pUFO->SetInc(3);
		pUFO->SetMov(2);
		pUFO->iType = 1;
		pUFO->SetStr((int)(iLevel /7)+1);
		pUFO->SetNext(NULL);
		break;

	case 3:
		for (int j=0;j<3;j++)
		{
			for (i=0;i<8;i++)
			{
				if (j==0 && i==0)
				{
					pUFO    = new Ovni;
					pFirst = pUFO;
				}
				else
				{
					pUFO->SetNext(new Ovni);
					pUFO = pUFO->GetNext();
				}
				pUFO->SetXY((i * 77)+15,j*80);
				iLastExtra = pUFO->CreateExtra(iLastExtra);
				pUFO->SetInc(valInc);
				pUFO->SetMov(0);
				pUFO->SetStr((int)(iLevel /7)+1);
				pUFO->SetNext(NULL);
			}
			//pUFO->SetMov(1);
			//pUFO->SetInc (abs(pUFO->GetInc()) * -1);
			valInc = valInc * -1;
		}
		break;
	}
	pUFO = pFirst;


    ddbltfx.dwSize = sizeof( ddbltfx );
    ddbltfx.dwFillColor = dwFillColor;

	while (1)
	{
		hRet = lpFrontBuffer->Blt(NULL, 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;
	}
	strcpy(buffer,"LEVEL");
	buffer[5] = ' ';
    buffer[6] = iLevel/100 + '0';
    rem = iLevel % 100;
    buffer[7] = rem/10 + '0';
    rem = iLevel % 10;
    buffer[8] = rem + '0';
	buffer[9] = '\0';
	bltText(buffer,250,200);

	tick = GetTickCount();
	
	while(GetTickCount() - tick < 3000);


	iShipState = 0;
	iShipMov = 0;
	iShipPos = 285;
	iLastWeapon = -1;
	iLastAmmo = -1;
	iLastShield = -1;
	Lastscore = -1;
	SHOOTCHANCE = 180 - (40 * (int)(iLevel /7));
	if (SHOOTCHANCE < 50)
		SHOOTCHANCE = 50;
}



void ShowGameOver()
{

	DWORD		tick;
	HRESULT		hRet;
	DDBLTFX     ddbltfx;
	char		buffer[10];

    ddbltfx.dwSize = sizeof( ddbltfx );
    ddbltfx.dwFillColor = dwFillColor;

	while (1)
	{
		hRet = lpFrontBuffer->Blt(NULL, 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;
	}
	strcpy(buffer,"GAME OVER");
	buffer[9] = '\0';
	bltText(buffer,250,200);

	tick = GetTickCount();
	SndObjPlay(hsoGameOver, NULL);	
	while(GetTickCount() - tick < 3500);
}

void ShowCredits()
{

	DWORD		tick;
	HRESULT		hRet;
	DDBLTFX     ddbltfx;
	char		buffer[24];

    ddbltfx.dwSize = sizeof( ddbltfx );
    ddbltfx.dwFillColor = dwFillColor;

	while (1)
	{
		hRet = lpFrontBuffer->Blt(NULL, 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;
	}
	strcpy(buffer,"THIS GAME IS FREEWARE\0");
	bltText(buffer,145,60);

	strcpy(buffer,"IF YOU WANT TO MAIL ME\0");
	bltText(buffer,130,130);

	strcpy(buffer,"OR YOU ARE FROM A GAME\0");
	bltText(buffer,120,200);

	strcpy(buffer,"COMPANY AND WANT TO\0");
	bltText(buffer,140,270);

	strcpy(buffer,"HIRE ME, MY MAIL IS\0");

⌨️ 快捷键说明

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