📄 main.c
字号:
// *******************************************************
//
// FILENAME: main.c
// PROJECT: Attack Plane
// DESCRIPTION: 飞机空战游戏
// DATE: 2002-11-23
// BY: bo
//
// *******************************************************
#include <vmgp.h>
#include "res.h"
//--------------------------------------------------------
#define MapSpeed 2 //地图滚动速度
#define LFly 1 //飞行轨迹:直线
#define S1Fly 20 //飞行轨迹:S型,中心轴20像素
#define S2Fly 60 //飞行轨迹:S型,中心轴60像素
#define LSpeed 1 //速度:低速
#define MSpeed 2 //速度:中速
#define HSpeed 3 //速度:高速
#define myID 1 //自己飞机编号。注:敌方飞机为自动编号
#define eID01 2000 //类型一敌方的数量
#define eID02 500 //类型二敌方的数量
#define eID03 500 //类型三敌方的数量
#define DOWN 0 //方向:下
#define UP 1 //方向:上
#define YES 1 //是
#define NO 0 //否
#define GameSpeed 5 //游戏速度:微妙
#define myBulletSize 20 //自己子弹最大量
#define eBulletSize 10 //敌方子弹最大量
#define eSendBullet1 90 //定义敌方发射子弹的点,单位像素
#define eSendBullet2 50 //定义敌方发射子弹的点,单位像素
#define Offset 4 //定义偏移量,单位像素
//--------------------------------------------------------
typedef struct _Plane_
{
int id; // 类型编号
int XPos; // X坐标
int YPos; // Y坐标
int ImgType; // 图片类型
int Flytype; // 飞行轨迹
int HP ; // 生命值
int BulletType; // 子弹类型
int Speed; // 速度
int Direct; // 方向
int ShowBullet; // 是否显示子弹
}
PLANE;
typedef struct _bullettype_
{
int id; //Bullet
int imgtype;//子弹图片
int xpos; //子弹X坐标
int ypos; //子弹Y坐标
int number; //数量
int step; //子弹距离
int time; //发射后的时间
int speed; //子弹速度
int show; //是否显示
}
BULLETTYPE;
typedef struct _bullet_
{
int index;
int x;
int y;
int id;
int time;
}
BULLET;
typedef struct _ebullet_
{
int index;
int x;
int y;
int id;
int time;
int xObject;//目标坐标X
int yObject;//目标坐标Y
}
EBULLET;
int BulletSave[5]={0,0,0,0,0};
int eBulletSave[7]={0,0,0,0,0,0,0};
PLANE myPlane; //自己飞机
PLANE e1Plane[eID01]; //敌方飞机一
PLANE e2Plane[eID02]; //敌方飞机二
PLANE e3Plane[eID03]; //敌方飞机三
BULLETTYPE myBulletType[4]; //定义自己四中子弹类型.
BULLETTYPE eBulletType[3]; //定义敌方三种子弹类型.
BULLET myBullet[myBulletSize]; //自己子弹数组
//EBULLET eBullet[eBulletSize]; //敌方子弹数组
//***************
int eBullet[eBulletSize*7]={0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0
};
//x,y,img,bullet1,bullet2.
int eBoss[5]={1000,50,1,10,10};
//***************
int AllPlane[10]={0,1,2,3,4,5,6,7,8,9}; //所有的飞机图片0:没有
int AllBullet[10]={1,2,2,2,2,2,2,2,2,2};//图片0:没有1:自己弹,2:敌弹
int AllMap[5]={1,2,3,4,5}; //所有地图图片
int Map[1000];
//--------------------------------------------------------
//--------------------------------------------------------
void Sleep(int nTime);
void GameInit();
void PlaneTrace();
int GameEngine(int here);
void ShowMap(int h);
void ShowPlane(int x,int y,int ImgPlane);
int Square(int a,int n);
void ShowBullet(int x,int y,int ImgBullet);
void BulletTrace();
void SendBullet();
void eSendBullet();
void eBulletTrace();
void ShowBoss(int h);
//--------------------------------------------------------
// **************************************************
// Game Init
// 1 初始化我方子弹类型
// 2 初始化敌方子弹类型
// 3 初始化我方子弹数组
// 4 初始化敌方子弹数组
// 5 初始化地图
// 6 初始化我方飞机
// 7 初始化三类敌方飞机
// **************************************************
void GameInit()
{
int i=0;
//初始化子弹类型
i=0;
while(i<4)
{
myBulletType[i].id =i;
myBulletType[i].imgtype =AllBullet[0];
myBulletType[i].number =Square(2,i);
myBulletType[i].speed =LSpeed; //自己子弹速度。
myBulletType[i].step =5; //一组子弹中的子弹间距,单位像素
myBulletType[i].time =3; //两次发射的时间间隔,单位是像素
myBulletType[i].xpos =0;
myBulletType[i].ypos =0;
myBulletType[i].show =YES;
i++;
}
i=0;
while(i<3)
{
eBulletType[i].id =i+4; //id:4,5,6
eBulletType[i].imgtype =AllBullet[1];
eBulletType[i].number =1;
if(i==2)
eBulletType[i].number =20; //boss bullet type2.
eBulletType[i].speed =LSpeed;
eBulletType[i].step =10;
eBulletType[i].time =100;
eBulletType[i].xpos =0;
eBulletType[i].ypos =0;
eBulletType[i].show =YES;
i++;
}
//初始化子弹数组
i=0;
while(i < myBulletSize)
{
myBullet[i].index =0;
myBullet[i].id =myBulletType[0].id ;
i++;
}
i=0;
while(i < eBulletSize)
{
eBullet[i*7] =0;
eBullet[i*7+3] =eBulletType[0].id ;
i++;
}
//初始化地图
i=0;
while(i<1000)
{
if(i<20)
Map[i]=AllMap[0];//Blue map
if(i>=20 && i<60)
Map[i]=AllMap[1];//Block
if(i>=60)
Map[i]=AllMap[2];//Red Map
i++;
}
//初始化自己飞机
myPlane.id =myID;
myPlane.BulletType =myBulletType[3].id ;
myPlane.ImgType =AllPlane[1];
myPlane.XPos =5;
myPlane.YPos =40;
myPlane.Speed =HSpeed;
myPlane.ShowBullet =YES;
//初始化敌方飞机
i=0;
while(i<eID01)
{
e1Plane[i].id =i;
e1Plane[i].BulletType =eBulletType[0].id ;
e1Plane[i].Flytype =LFly;
e1Plane[i].HP =1;
e1Plane[i].ImgType =AllPlane[2];
e1Plane[i].Speed =LSpeed;
e1Plane[i].XPos =101+i*50;
e1Plane[i].YPos =(i%Offset)*10+20;
e1Plane[i].ShowBullet =YES;
i++;
}
i=0;
while(i<eID02)
{
e2Plane[i].id =i;
e2Plane[i].BulletType =0; //eBulletType[0].id ;
e2Plane[i].Flytype =S1Fly;
e2Plane[i].HP =1;
e2Plane[i].ImgType =AllPlane[2];
e2Plane[i].Speed =LSpeed;
e2Plane[i].XPos =101+i*80;
e2Plane[i].YPos =20;
e2Plane[i].Direct =DOWN;
e2Plane[i].ShowBullet =NO;
i++;
}
i=0;
while(i<eID03)
{
e3Plane[i].id =i;
e3Plane[i].BulletType =0; //eBulletType[0].id ;
e3Plane[i].Flytype =S2Fly;
e3Plane[i].HP =1;
e3Plane[i].ImgType =AllPlane[2];
e3Plane[i].Speed =LSpeed;
e3Plane[i].XPos =101+i*80;
e3Plane[i].YPos =60;
e3Plane[i].Direct =UP;
e3Plane[i].ShowBullet =NO;
i++;
}
}
void ShowBoss(int h)
{
if(eBoss[0]-h < 80)
{
eBoss[0]=70;
//Boss[1]=;
vDrawObject(eBoss[0],eBoss[1],&Boss);
}
}
// **************************************************
// 显示子弹
// X X坐标
// Y Y坐标
// ImgBullet 子弹的图片索引值
// **************************************************
void ShowBullet(int x,int y,int ImgBullet)
{
if(ImgBullet==1)
vDrawObject(x,y,&MyBullet02);
if(ImgBullet==2)
vDrawObject(x,y,&MyBullet02);
if(ImgBullet==3)
vDrawObject(x,y,&EnemyBullet01);
if(ImgBullet==4)
vDrawObject(x,y,&EnemyBullet02);
}
// **************************************************
// 敌方发射子弹
// **************************************************
void eSendBullet()
{
int i=0,j=0,k=0,index[5]={0,0,0,0,0};
//判断类型一飞机的子弹发射情况
if(e1Plane[0].BulletType )
{
while(i < eID01)//分析出那个飞机在发射子弹
{
if(e1Plane[i].XPos+e1Plane[i].id%Offset == eSendBullet1
|| e1Plane[i].XPos+e1Plane[i].id%Offset == eSendBullet2)
index[j++] =e1Plane[i].id;
i++;
}
while(k<j)
{
i=eBulletSize;
while(i >= 0)
{
eBullet[(i+1)*7+3] =eBullet[(i)*7+3];
eBullet[(i+1)*7] =eBullet[(i)*7];
eBullet[(i+1)*7+4] =eBullet[(i)*7+4];
eBullet[(i+1)*7+1] =eBullet[(i)*7+1] ;
eBullet[(i+1)*7+2] =eBullet[(i)*7+2] ;
eBullet[(i+1)*7+5] =eBullet[(i)*7+5] ;
eBullet[(i+1)*7+6] =eBullet[(i)*7+6] ;
i--;
}
eBullet[3] =e1Plane[0].BulletType ;
eBullet[0] =1;
eBullet[4] =0;
eBullet[1] =e1Plane[index[k]].XPos ;
eBullet[2] =e1Plane[index[k]].YPos ;
eBullet[5] =myPlane.XPos ;
eBullet[6] =myPlane.YPos ;
k++;
}
}
//判断类型二飞机的子弹发射情况
/*if(e2Plane[0].BulletType )
{
i=0;j=0;k=0;
while(i < eID02)//分析出那个飞机在发射子弹
{
if(e2Plane[i].XPos+e2Plane[i].id%Offset == eSendBullet1
|| e2Plane[i].XPos+e2Plane[i].id%Offset == eSendBullet2)
index[j++] =e2Plane[i].id;
i++;
}
while(k<j)
{
i=eBulletSize;
while(i >= 0)
{
eBullet[i+1].id =eBullet[i].id ;
eBullet[i+1].index =eBullet[i].index ;
eBullet[i+1].time =eBullet[i].time ;
eBullet[i+1].x =eBullet[i].x ;
eBullet[i+1].y =eBullet[i].y ;
eBullet[i+1].xObject=eBullet[i].xObject ;
eBullet[i+1].yObject=eBullet[i].yObject ;
i--;
}
eBullet[0].id =e2Plane[0].BulletType ;
eBullet[0].index =1;
eBullet[0].time =0;
eBullet[0].x =e2Plane[index[k]].XPos ;
eBullet[0].y =e2Plane[index[k]].YPos ;
eBullet[0].xObject =myPlane.XPos ;
eBullet[0].yObject =myPlane.YPos ;
k++;
}
}
//判断类型三飞机的子弹发射情况
if(e3Plane[0].BulletType )
{
i=0;j=0;k=0;
while(i < eID03)//分析出那个飞机在发射子弹
{
if(e3Plane[i].XPos+e3Plane[i].id%Offset == eSendBullet1
|| e3Plane[i].XPos+e3Plane[i].id%Offset == eSendBullet2)
index[j++] =e3Plane[i].id;
i++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -