第四十二章 试着制作闪屏(Flash)特效吧
本章的内容并不是特别重要。由于考虑到今后自己可能会使用这个特效,因此就实现了。
那就是“Flash”。一瞬间让画面变白进行闪屏。
是的,这一次我们也按照老规矩来。
定义结构体、声明变量,然后进行“登录、计算、绘制”这一过程。
我们制作两种闪屏。
种类0的闪屏效果是在指定时间内逐渐变亮然后再逐渐变暗。
种类1的闪屏效果是一开始突然屏幕全白,然后在指定的时间内渐渐变暗——这是一般的闪屏类型。
—-在 GV.h 中进行以下追加 —-
GLOBAL flash_t flash;//(42)
—-在 struct.cpp 中进行以下追加 —-
//闪屏(42)
typedef struct{
//flag、计数器、闪屏的种类、在多少计数值中显示
int flag,cnt,knd,to_cnt;
//亮度
double brt;
}flash_t;
—-在 ini.cpp 的 ini() 函数中进行以下变更/追加 —-
/***修改请注意***/
boss.appear_count[0]=20;
/***修改请注意***/
—-在 boss_shotH.cpp 中进行以下追加 —-
//闪屏样例(42)
void boss_shot_bulletH011(){
#define TM009 420
#define DIST 60
int t=boss_shot.cnt%TM009,t2=boss_shot.cnt;
if(t2==60){
flash.flag=1;
flash.knd=0;//逐渐变量、逐渐变暗
flash.to_cnt=30;//30カウントで変化 在30次计数中变化
flash.cnt=0;
}
if(t2==180){
flash.flag=1;
flash.knd=1;//闪!
flash.to_cnt=90;// 90次计数中变化
flash.cnt=0;
}
if(t2==260){
flash.flag=1;
flash.knd=0;//逐渐变亮,逐渐变暗
flash.to_cnt=15;//1在15次计数中变化
flash.cnt=0;
}
if(t2==380){
flash.flag=1;
flash.knd=1;//闪!
flash.to_cnt=30;//在30次计数中变化
flash.cnt=0;
}
}
—-在 func.h 追加变更红字部分 —-
/***修改请注意***/
extern void boss_shot_bulletH011();//(42)
/***修改请注意***/
void (*boss_shot_bullet[DANMAKU_MAX])() =
{
/***修改请注意***/
boss_shot_bulletH011,
/***修改请注意***/
boss_shot_bulletH010,
boss_shot_bulletH009,
boss_shot_bulletH008,
boss_shot_bulletH007,
boss_shot_bulletH006,
boss_shot_bulletH005,
boss_shot_bulletH004,
boss_shot_bulletH003,
boss_shot_bulletH002,
boss_shot_bulletH001,
boss_shot_bulletH000,
boss_shot_bulletH000,
boss_shot_bulletH000,
boss_shot_bulletH000,
boss_shot_bulletH000,
boss_shot_bulletH000,
};
—-在 calc.cpp 中追加以下红字部分 —-
//闪屏(42)
/***修改请注意***/
void calc_flash(){
if(flash.flag>0){
if(flash.knd==0){
if(flash.cnt==0)flash.brt=0;
if(flash.cnt<flash.to_cnt)
flash.brt+=255.0/flash.to_cnt;
else
flash.brt-=255.0/flash.to_cnt;
}
if(flash.knd==1){
if(flash.cnt==0)flash.brt=255;
flash.brt-=255.0/flash.to_cnt;
}
flash.cnt++;
if(flash.knd==0){
if(flash.cnt>flash.to_cnt*2)
flash.flag=0;
}
if(flash.knd==1){
if(flash.cnt>flash.to_cnt)
flash.flag=0;
}
}
}
/***修改请注意***/
void calc_main(){
calc_stage_title();
calc_item();
/***修改请注意***/
calc_flash();//闪屏(42)
/***修改请注意***/
}
—-在 graph.cpp 中进行以下变更追加 —-
//闪屏绘制(42)
void graph_flash(){
if(flash.flag>0){
SetDrawBlendMode( DX_BLENDMODE_ALPHA, (int)(flash.brt) );
DrawBox(FX,FY,FX+FMX,FY+FMY,color[0],TRUE);
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );
}
}
void graph_main(){
if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);
graph_back_main();//背景绘制main
graph_effect(0);//敌人击毁特效
if(bright_set.brt!=255)SetDrawBright(255,255,255);
graph_effect(4);//决死特效
if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);
graph_child();
graph_item();//道具绘制
graph_boss();
graph_enemy();//敌人的绘制
graph_cshot();//自机射击的绘制
if(bright_set.brt!=255)SetDrawBright(255,255,255);
graph_ch();//自机的绘制
if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);
graph_lazer();//激光的绘制
graph_bullet();//子弹的绘制
if(bright_set.brt!=255)SetDrawBright(255,255,255);
graph_effect(1);//Boom的特效
graph_effect(2);//Boom线的特效
graph_effect(3);//Boom角色的特效
graph_stage_title();//Title的显示
graph_board();//面板的绘制
/***修改请注意***/
graph_flash();//闪屏的绘制
/***修改请注意***/
graph_develop();
}
运行结果