原文地址:
道中会有大量的敌人出现。
然后敌人身上带有大量的数据。至少也有下面这些数据吧。
————————————————————————————————————————————————————————————————————————————
--struct.h 里添加如下代码--
typedef struct{
//计数、移动模式、敌人种类
int cnt,pattern,knd;
//初始坐标和移动速度
double x,y,sp;
//弹幕开始时间、弹幕的种类、颜色、体力、弹幕的种类、停滞时间、掉落道具(6种)
int bltime,blknd,col,hp,blknd2,wait,item_n[6];
}enemy_order_t;
————————————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————
--load.cpp 里加入下面语句--
//把敌人出现的数据从Excel里读取出来并保存的函数
void load_story()
{
int n,num,i,fp;
char fname[32]= {"../dat/csv/storyH0.csv"};
int input[64];
char inputc[64];
fp = FileRead_open(fname);//读取文件
if(fp == NULL)
{
printfDx("read error\n");
return;
}
for(i=0; i<2; i++) //跳过最开始的两行
while(FileRead_getc(fp)!='\n');
n=0 , num=0;
while(1)
{
for(i=0; i<64; i++)
{
inputc[i]=input[i]=FileRead_getc(fp);//取得一个字符
if(inputc[i]=='/') //如果是斜线
{
while(FileRead_getc(fp)!='\n');//循环读取到行尾
i=-1;//count 回到最开始
continue;
}
if(input[i]==',' || input[i]=='\n') //如果是逗号或者换行
{
inputc[i]='\0'; //到这里作为一个字符串
break;
}
if(input[i]==EOF) //到文件末尾的话
{
goto EXFILE; //结束
}
}
switch(num){
case 0: enemy_order[n].cnt =atoi(inputc);break;
case 1: enemy_order[n].pattern =atoi(inputc);break;
case 2: enemy_order[n].knd =atoi(inputc);break;
case 3: enemy_order[n].x =atof(inputc);break;
case 4: enemy_order[n].y =atof(inputc);break;
case 5: enemy_order[n].sp =atof(inputc);break;
case 6: enemy_order[n].bltime =atoi(inputc);break;
case 7: enemy_order[n].blknd =atoi(inputc);break;
case 8: enemy_order[n].col =atoi(inputc);break;
case 9: enemy_order[n].hp =atoi(inputc);break;
case 10:enemy_order[n].blknd2 =atoi(inputc);break;
case 11:enemy_order[n].wait =atoi(inputc);break;
case 12:enemy_order[n].item_n[0]=atoi(inputc);break;
case 13:enemy_order[n].item_n[1]=atoi(inputc);break;
case 14:enemy_order[n].item_n[2]=atoi(inputc);break;
case 15:enemy_order[n].item_n[3]=atoi(inputc);break;
case 16:enemy_order[n].item_n[4]=atoi(inputc);break;
case 17:enemy_order[n].item_n[5]=atoi(inputc);break;
}
num++;
if(num==18)
{
num=0;
n++;
}
}
EXFILE:
FileRead_close(fp);
}
————————————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————
memset(enemy_order,0,sizeof(enemy_order_t)*ENEMY_ORDER_MAX);
--define.h 里,添加如下代码--
//敌机出现的最大数目
#define ENEMY_ORDER_MAX 500
--GV.h 里添加如下代码--
GLOBAL enemy_order_t enemy_order[ENEMY_ORDER_MAX];//敌机的出现的数据
--function.h 里添加如下代码--
GLOBAL void load_story();
--main.cpp 里的main函数的switch里面的下面部分进行改动--
ini();
load_story();
func_state=100;
break;
————————————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————
#include "../include/GV.h"
//敌机的移动模式0 的移动操作
void enemy_pattern0(int i)
{
int t=enemy[i].cnt;
if(t==0)
enemy[i].vy=2; //往下移动
if(t==60)
enemy[i].vy=0; //停下来
if(t==60+enemy[i].wait) //停止时间过了
enemy[i].vy=-2;//向上移动
}
//检索空着的敌机编号
int enemy_num_search()
{
for(int i=0; i<ENEMY_MAX; i++) //搜索没有标记flag的元素
{
if(enemy[i].flag==0)
{
return i;//返回可以用的编号
}
}
return -1;//全部都储存了的话,返回-1
}
//敌机数据载入
void enemy_enter() //敌机行动的注册,操作函数
{
int i,j,t;
for(t=0; t<ENEMY_ORDER_MAX; t++)
{
if(enemy_order[t].cnt==stage_count) //现在的时间正好是 敌人出现顺序的时间
{
if((i=enemy_num_search())!=-1)
{
enemy[i].flag =1;//标记
enemy[i].cnt =0;//计数
enemy[i].pattern=enemy_order[t].pattern;//移动模式
enemy[i].muki =1;//方向
enemy[i].knd =enemy_order[t].knd;//敌人种类
enemy[i].x =enemy_order[t].x;//坐标
enemy[i].y =enemy_order[t].y;
enemy[i].sp =enemy_order[t].sp;//速度
enemy[i].bltime =enemy_order[t].bltime;//子弹的发射时间
enemy[i].blknd =enemy_order[t].blknd;//弹幕种类
enemy[i].blknd2 =enemy_order[t].blknd2;//子弹类型
enemy[i].col =enemy_order[t].col;//颜色
enemy[i].wait =enemy_order[t].wait;//停滞时间
enemy[i].hp =enemy_order[t].hp;//体力
enemy[i].hp_max =enemy[i].hp;//体力最大值
enemy[i].vx =0;//水平方向的速度
enemy[i].vy =0;//竖直方向的速度
enemy[i].ang =0;//角度
for(j=0; j<6; j++)
enemy[i].item_n[j]=enemy_order[t].item_n[j];//掉落的道具
}
}
}
}
//敌机的行动操作
void enemy_act()
{
int i;
for(i=0; i<ENEMY_MAX; i++)
{
if(enemy[i].flag==1) //标记设置为ON
{
enemy_pattern0(i);
enemy[i].x+=cos(enemy[i].ang)*enemy[i].sp;
enemy[i].y+=sin(enemy[i].ang)*enemy[i].sp;
enemy[i].x+=enemy[i].vx;
enemy[i].y+=enemy[i].vy;
enemy[i].cnt++;
enemy[i].img=enemy[i].muki*3+(enemy[i].cnt%18)/6;
//敌人从画面中消失
if(enemy[i].x<-20 || FIELD_MAX_X+20<enemy[i].x || enemy[i].y<-20 || FIELD_MAX_Y+20<enemy[i].y)
enemy[i].flag=0;
}
}
}
//敌机处理的main方法
void enemy_main()
{
enemy_enter();
enemy_act();
}
————————————————————————————————————————————————————————————————————————————
本人CSDN博客目录: