第二十六章 为Boss加上特效吧
只是让Boos梆地射出弹幕的话一点也不好看,现在我们让Boos周围回旋起纹章,加上特效吧。
其次,在这一章节中,我们会稍微扩展一下敌人的移动控制函数。
Boss上下地慢慢移动的时候看起来就很漂亮了。
显示用的坐标为了与x、y区分使用dx、dy。我们往这两个变量中代入显示用的坐标。
接下来,我们读入必要的图像,然后绘制Boss的特效吧。
—-在 boss_shot.cpp 中进行以下追加 —-
void calc_boss(){
boss.dx=boss.x;
boss.dy=boss.y+sin(PI2/130*(count%130))*10;
}
—-在load函数中进行以下追加 —-
img_etc[2] = LoadGraph( "../dat/img/enemy/bossback.png" );
img_etc[5] = LoadGraph( "../dat/img/enemy/bossback3.png" );
img_etc[6] = LoadGraph( "../dat/img/enemy/bossback4.png" );
—-在graph.cpp 的以下部分进行修正
void graph_boss_effect(){
SetDrawBlendMode( DX_BLENDMODE_ALPHA, 150) ;
DrawRotaGraphF(boss.dx+FX, boss.dy+FY,
(0.4+0.05*sin(PI2/360*(count%360)))*3,
2*PI*(count%580)/580,
img_etc[5], TRUE);
DrawRotaGraphF(boss.dx+FX, boss.dy+FY,
(0.5+0.1*sin(PI2/360*(count%360)))*2,
2*PI*(count%340)/340,img_etc[2], TRUE);
DrawRotaGraphF(boss.dx+60*sin(PI2/153*(count%153))+FX,
boss.dy+80*sin(PI2/120*(count%120))+FY,
0.4+0.05*sin(PI2/120*(count%120)),
2*PI*(count%30)/30,img_etc[6], TRUE);
DrawRotaGraphF(boss.dx+60*sin(PI2/200*((count+20)%200))+FX,
boss.dy+80*sin(PI2/177*((count+20)%177))+FY,
0.3+0.05*sin(PI2/120*(count%120)),
2*PI*(count%35)/35,img_etc[6], TRUE);
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
DrawRotaGraphF(boss.dx+60*sin(PI2/230*((count+40)%230))+FX,
boss.dy+80*sin(PI2/189*((count+40)%189))+FY,
0.6+0.05*sin(PI2/120*(count%120)),
2*PI*(count%40)/40,img_etc[6], TRUE);
}
void graph_boss(){
int i;
if(boss.flag==0)return;
/***修改请注意***/
graph_boss_effect();
/***修改请注意***/
DrawRotaGraphF(boss.dx+FX+dn.x,boss.dy+FY+dn.y,
1.0f,0.0f,img_dot_riria[0],TRUE);
其次,我们为前面章节中利用物理移动的方程式进行移动计算的函数加上后缀,以做出这样子的函数,它能够完成“从当前地点开始在多少计数下往离开多远的某个位置移动”这样子的指定。
—-在 boss_shot.cpp 中进行追加—-
//进行与某点的指定距离的物理计算的登录(在指定时间t内回到固定位置)
void input_phy_pos(double x,double y,int t){//t=移動にかける時間 移动附加时间
double ymax_x,ymax_y;
if(t==0)t=1;
boss.phy.flag=1;//登录有效
boss.phy.cnt=0;//计时器初始化
boss.phy.set_t=t;//设置移动附加时间
ymax_x=boss.x-x;//想要移动的水平距离
boss.phy.v0x=2*ymax_x/t;//水平分量的初速度
boss.phy.ax =2*ymax_x/(t*t);//水平分量的加速度
boss.phy.prex=boss.x;//初始x坐标
ymax_y=boss.y-y;//想要移动的水平距离
boss.phy.v0y=2*ymax_y/t;//水平分量的初速度
boss.phy.ay =2*ymax_y/(t*t);//水平分量的加速度
boss.phy.prey=boss.y;//初始y坐标
}
//在t次计数中从当前位置到离开dist这么远的位置移动
int move_boss_pos(double x1,double y1,double x2,double y2,double dist, int t){
int i=0;
double x,y,angle;
for(i=0;i<1000;i++){
x=boss.x,y=boss.y;//设置当前Boss的位置
angle=rang(PI);//適当地决定前进方向
x+=cos(angle)*dist;//向着那个地方移动
y+=sin(angle)*dist;
if(x1<=x&&x<=x2 && y1<=y&&y<=y2){//如果那个点在移动可能的范围内的话
input_phy_pos(x,y,t);
return 0;
}
}
return -1;//1000如果1000次尝试都不能的话就返回错误
}
---- boss_shot.cpp 的 boss_shotmain 中进行以下红字部分追加 ----
//
void boss_shot_main(){
if(stage_count==boss.appear_count[boss.knd] && boss.flag==0)//如果到了开始时间
enter_boss(boss.knd);//开始
if(boss.flag==0)//如果Boss没有被登录则返回
return;
/***修改请注意***/
calc_boss();
/***修改请注意***/
if(boss.phy.flag==1)//如果物理计算移动为有效
—-在 boss_shotH.cpp 的头部进行以下追加 —-
extern int move_boss_pos(double x1,double y1,double x2,double y2,double dist, int t);
—-在 struct.h 中进行以下追加 —-
//Boss的信息
typedef struct{
int flag,cnt,knd,wtime,state,endtime,hagoromo,graph_flag;
int hp,hp_max;
int appear_count[2],set_hp[DANMAKU_MAX],back_knd[DANMAKU_MAX];
double x,y,
/***修改请注意***/
dx,dy,
/***修改请注意***/
ang,spd;
phy_t phy;
}boss_t;
move_boss_pos函数中,Boos能够在x1以上x2以下、y1以上y2以下的范围内在t次计数内在离开dist那么远的位置。
适当地在各个地方决定其以合适的方向前进的目标位置。
要是1000次反复测试都不行的话那就放弃。
这个函数将从下个章节开始使用,运行结果如下所示。
运行结果