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

📄 xinvader.h

📁 我用MDEngine写的游戏
💻 H
字号:

#define MAX_BULLET	40
#define	MAX_UFO		24
#define	MAX_EXTRA	10


#define _UFO_			1	// _UFO_ = _UFO_X_ >> 2
#define _UFO_1_			4
#define _UFO_2_			5
#define _UFO_3_			6

#define _UFO_DIED_		0
#define _UFO_EXPLODE_	8

#define _SHIP_			9
#define	_SHIP_S1_		9
#define _SHIP_S2_		10

#define WP_LASER_1		0
#define WP_LASER_2		1
#define WP_LASER_3		2
#define WP_PHOTON_1		3
#define WP_PHOTON_2		4
#define WP_PHOTON_3		5

#define	EX_PHOTONAMMO	11
#define	EX_POWER		12
#define	EX_SCORE		13
#define	EX_LASERAMMO	14
#define	EX_SHIELD		15

struct Alpha
{
	unsigned int start;
	unsigned int end;
};

const Alpha	AS[40] = 
{
	{0,14},{19,27},{31,46},{47,61},{65,78},{80,94},
	{96,110},{114,125},{128,143},{145,159},{160,175},
	{176,191},{193,206},{207,222},{224,237},{238,252},{253,267},
	{269,284},{285,291},{292,307},{308,323},{324,338},{340,364},
	{365,380},{382,397},{398,413},{414,429},{430,444},{447,460},
	{464,475},{477,492},{494,508},{509,533},{533,548},{550,564},
	{564,579},{579,599},{600,610},{611,615},{617,620}
};

struct UFO
{
	int		x,y;
	int		shield;
	BYTE	type,frame;
	BYTE	move,qdown;
	int		inc;
};
struct Bullet
{
	int		x,y;
	BYTE	type,frame;
};
struct Extra
{
	int		x,y;
	BYTE	type,frame;
	int		inc;
};

extern CMD_Surface	sur_Alphabet;
extern CMD_Sound	snd_extra;
extern CMD_Sound	snd_explode;
extern Bullet		m_Bullet[MAX_BULLET];
extern UFO			m_UFO[MAX_UFO];
extern Extra		m_Extra[MAX_EXTRA];

extern unsigned int iScore;
extern int iShield;
extern int iShipPos;
extern int iShipMov;
extern int iWeapon;
extern int iMaxWeapon;
extern int iLaserAmmo;
extern int iPhotonAmmo;
extern int iLevel;
extern int iShipframe;
extern int iAttack;

void DrawText(char *text,int x,int y)
{
	int len=lstrlen(text);
	int nextx=x;
	int pos=0;
	for(int i=0;i<len;i++)
	{
		if(text[i]>='0' && text[i]<='9')
			pos=text[i]-'0';
		else if(text[i]>='A' && text[i]<='Z')
			pos=text[i]-'A'+10;
		else if(text[i]>='a' && text[i]<='z')
			pos=text[i]-'a'+10;
		else if(text[i]=='@')
			pos=36;
		else if(text[i]=='-')
			pos=37;
		else if(text[i]==',')
			pos=38;
		else if(text[i]=='.')
			pos=39;
		else
		{
			nextx+=15;
			continue;
		}
		sur_Alphabet.SetBltRect(AS[pos].start,0,AS[pos].end,15);
		sur_Alphabet.DrawFast(NULL,SUR_BACK,nextx,y,true);
		nextx+=AS[pos].end-AS[pos].start;
	}
}

void UFOShoot(int x,int y)
{
	for(int i=3;i<MAX_BULLET;i++)
	{
		if(m_Bullet[i].type==0)
		{
			m_Bullet[i].type=_UFO_;
//			m_Bullet[i].frame=0;
			m_Bullet[i].x=x+24;
			m_Bullet[i].y=y+50;
			break;
		}
	}
}

void ResetGame()
{
	iShield		= 100;
	iShipPos	= 285;
	iShipMov	= 0;
	iWeapon		= 0;
	iMaxWeapon	= 0;
	iLaserAmmo	= 100;
	iPhotonAmmo	= 0;
	iScore		= 0;
	iAttack		= 0;

	iLevel		= 0;
}

void DropExtra(int k)
{
	for(int i=0;i<MAX_EXTRA;i++)
	{
		if(m_Extra[i].type==0)
		{
			BYTE type;
			int cn=rand()%100;
			if(cn>95)
				type=EX_POWER;
			else if(cn>87)
				type=EX_SHIELD;
			else if(cn>77)
				type=EX_LASERAMMO;
			else if(cn>67)
				type=EX_PHOTONAMMO;
			else if(cn<50)
				type=EX_SCORE;
			else
				break;

			m_Extra[i].type=type;
			m_Extra[i].x=m_UFO[k].x+25;
			m_Extra[i].y=m_UFO[k].y+50;
			m_Extra[i].inc=3+rand()%3;
			break;
		}
	}
}

void TestShipExplode()
{
	if(iShield<=0)
	{
		iShield=0;
		iShipframe=0;
		snd_explode.Play();
	}
}
void TestUFOExplode(int i)
{
	if(m_UFO[i].shield<=0)
	{
		m_UFO[i].shield=0;
		m_UFO[i].type=_UFO_EXPLODE_;
		snd_explode.Play();
		m_UFO[i].frame=0;
		DropExtra(i);
		iScore+=100;
	}
}

void UFO_Hit_UFO(int a,int b)
{
	// UFO1: x=UX+1 lx=68 y=UY+12 ly=48
	// UFO2: x=UX   lx=70 y=UY+16 ly=36
	// UFO3: x=UX+4 lx=50 y=UY+10 ly=44
	const int dis[3]={68,70,50};

	if((m_UFO[a].type>>2)==_UFO_ && (m_UFO[b].type>>2)==_UFO_)
	{
		if(m_UFO[a].y==m_UFO[b].y && abs(m_UFO[a].x-m_UFO[b].x)<dis[m_UFO[a].type-_UFO_1_])
		{
			m_UFO[a].inc=-m_UFO[a].inc;
			m_UFO[b].inc=-m_UFO[b].inc;
		}
	}
}

void UFOS_Hit_Ship()
{
	if(iShield>0)	// Ship: x=iShipPos+7 lx=52 y=410 ly=20
	{				// UFO Bullet: x=UX+4 lx=8 y=UY+2 ly=18
		for(int i=3;i<MAX_BULLET;i++)
		{
			if(m_Bullet[i].type==_UFO_ && abs((m_Bullet[i].x+4+4)-(iShipPos+7+26))<4+26 && abs((m_Bullet[i].y+2+9)-(410+20))<9+10)
			{
				m_Bullet[i].type=0;
				iShield-=(20+iLevel);
				TestShipExplode();
			}
		}
	}
}

void ShipS_Hit_UFO()
{	// Ship Bullet: x=BX+8 lx=3 y=BY ly=19
	// UFO1: x=UX+1 lx=68 y=UY+12 ly=48
	// UFO2: x=UX   lx=70 y=UY+16 ly=36
	// UFO3: x=UX+4 lx=50 y=UY+10 ly=44
	const int ux[3]={1,0,4};
	const int ulx[3]={34,35,25};
	const int uy[3]={12,16,10};
	const int uly[3]={24,18,22};
	for(int i=0;i<3;i++)
	{
		if(m_Bullet[i].type!=0)
		{
			for(int j=0;j<MAX_UFO;j++)
			{
				BYTE tp=m_UFO[j].type-_UFO_1_;
				if((m_UFO[j].type>>2)==_UFO_ && abs((m_Bullet[i].x+8+1)-(m_UFO[j].x+ux[tp]+ulx[tp]))<1+ulx[tp] && abs((m_Bullet[i].y+9)-(m_UFO[j].y+uy[tp]+uly[tp]))<9+uly[tp])
				{
					if(m_Bullet[i].type==_SHIP_S1_)
						m_UFO[j].shield-=(1+iAttack);
					else if(m_Bullet[i].type==_SHIP_S2_)
						m_UFO[j].shield-=3+iAttack;
					m_Bullet[i].type=0;
					TestUFOExplode(j);
				}
			}
		}
	}
}

void Ship_Hit_Extra()
{
	if(iShield>0)
		for(int i=0;i<MAX_EXTRA;i++)	// Extra: x=EX+2 lx=21 y=EY+2 ly=21
		{								// Ship: x=iShipPos+7 lx=52 y=390 ly=20
			if(m_Extra[i].type!=0 && abs((m_Extra[i].x+2+10)-(iShipPos+7+26))<10+26 && abs((m_Extra[i].y+2+10)-(410+10))<10+10)
			{
				switch(m_Extra[i].type)
				{
				case EX_POWER:
					if(++iMaxWeapon>5)
					{
						iMaxWeapon=5;
						iAttack++;
					}
					iWeapon=iMaxWeapon;
					break;
				case EX_SHIELD:
					{
						int sh=20+rand()%10;
						if(iShield>=100)
							iScore+=200;
						else if((iShield+=sh)>100)
							iShield=100;
					}break;
				case EX_LASERAMMO:
					{
						int sh=10+rand()%40;
						iLaserAmmo+=sh;
					}break;
				case EX_PHOTONAMMO:
					{
						int sh=10+rand()%40;
						iPhotonAmmo+=sh;
					}break;
				case EX_SCORE:
					iScore+=50;
					break;
				}
				m_Extra[i].type=0;
				iScore+=50;
				snd_extra.Play();
			}
		}
}
void UFO_Hit_Ship()
{
	// UFO1: x=UX+1 lx=68 y=UY+12 ly=48
	// UFO2: x=UX   lx=70 y=UY+16 ly=36
	const int ux[2]={1,0};
	const int ulx[2]={34,35};
	const int uy[2]={12,16};
	const int uly[2]={24,18};
	if(iShield>0)
		for(int i=0;i<MAX_UFO;i++)
		{
			int tp=m_UFO[i].type-_UFO_1_;
			if(abs((m_UFO[i].x+ux[tp]+ulx[tp])-(iShipPos+7+26))<ulx[tp]+26 && abs((m_UFO[i].y+uy[tp]+uly[tp])-(390+20))<uly[tp]+20)
			{
				iShield=0;
				TestShipExplode();
				m_UFO[i].shield=0;
				TestUFOExplode(i);
			}
		}
}

⌨️ 快捷键说明

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