📄 xinvader.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 + -