【四圣龙神录的编程教室】第19章、给敌机加上消灭特效吧

游戏开发中特效与消除特效的实现
本文详细介绍了在游戏开发过程中如何实现特效和消除特效。通过将特效和消除特效分开管理,使得游戏表现更加丰富。文章还展示了如何通过编程实现特效的计算和绘制,以及消除特效的注册和计算过程。

原文地址:

http://dixq.net/rp/19.html


敌机就只是突然消失的话,感觉少了点什么,我们来给他加上消灭的特效吧。

那么首先,我们把特效需要用到的一个文件添加进来。

在解决方案资源管理器里,项目上点击右键,添加项,

选择 mydat 文件夹的 source 里的  effect.cpp 加入。

在里面复制下面的内容粘贴进去。

————————————————————————————————————————————————————————————————————

---- effect.cpp ----

#include "../include/GV.h"

//寻找空的特效存放位置
int search_effect(){
        for(int i=0;i<EFFECT_MAX;i++){
                if(effect[i].flag==0)
                        return i;
        }
        return -1;
}

//计算特效
void calc_effect(){
        for(int i=0;i<EFFECT_MAX;i++){
                if(effect[i].flag>0){//特效已经注册了的话
                        switch(effect[i].knd){//根据特效的种类进行分支处理
                                case 0://0番の処理
                                        effect[i].cnt++;
                                        effect[i].r+=0.08;          //特效的大小逐渐变大
                                        if(effect[i].cnt>10)        //过了10帧的话
                                                effect[i].brt-=25;  //明亮程度减少
                                        if(effect[i].cnt>20)        //过了20帧的话
                                                effect[i].flag=0;   //消失
                                        break;
                                default:
                                        printfDx("effect設定エラー\n");
                                        break;
                        }
                }
        }
}

//寻找消灭特效的空的存放位置
int search_del_effect(){
        for(int i=0;i<DEL_EFFECT_MAX;i++){
                if(del_effect[i].flag==0)
                        return i;
        }
        return -1;
}

//消灭特效的注册
void enter_del_effect(int s){
        int k=search_del_effect();
        if(k!=-1){
                del_effect[k].flag=1;   //设置标志
                del_effect[k].cnt=0;
                del_effect[k].col=enemy[s].back_col;    //消除颜色设定为敌机的背景色
                del_effect[k].x=enemy[s].x;             //消灭位置设定为敌机的坐标
                del_effect[k].y=enemy[s].y;
        }
}

//消灭特效的计算和特效的注册
void calc_del_effect(){
        int k;
        for(int i=0;i<DEL_EFFECT_MAX;i++){
                if(del_effect[i].flag>0){
                        if(del_effect[i].cnt%2==0){             // 每1/30秒进行设置
                                if((k=search_effect())!=-1){    //寻找空的编号
                                        memset(&effect[k],0,sizeof(effect_t));  //初始化
                                        effect[k].flag=1;       //设置标记
                                        effect[k].brt=255;      //亮度设为最大值
                                        effect[k].ang=rang(PI); //设置随机的角度
                                        effect[k].col=del_effect[i].col;    //设置颜色
                                        effect[k].eff=1;            //1号是光的特效。这里设置为光特效
                                        effect[k].img=img_del_effect[effect[k].col];    //设置消灭的图像
                                        effect[k].knd=0;            //特效的种类是0号(消灭特效是0)
                                        effect[k].x=del_effect[i].x;//设置坐标
                                        effect[k].y=del_effect[i].y;
                                }
                        }
                        if(del_effect[i].cnt>8){    //计数比8大的话,就结束
                                del_effect[i].flag=0;
                        }
                        del_effect[i].cnt++;
                }
        }
}

void effect_main(){
        calc_del_effect();  //计算消除特效
        calc_effect();      //计算特效
}
——————————————————————————————————————————————————————————————————————————

enter_del_effect 里消除特效注册了的话,然后就是全自动的对特效进行计算,十分方便。

这个函数里,参数s 传入的是敌机的识别编号。这样,s号敌机消灭后特效就进行注册。

这次也是准备了新的数据存放的地方。

消除特效存放在 del_effect

特效存在 effect 里

为什么要准备消除特效和普通特效这样两种呢,也许有人在想这个问题。

消除特效不仅仅是实际特效的播放,还要管理什么时候特效登陆,

什么样的特效登陆等信息。 (译者注:个人理解,就是弹幕和子弹的关系。这里消除特效是由特效组成的)

总之,就是实际的特效是 effect 的计算,绘制。

这个effect 变量 是一个通用的东西,除了消除特效,还能展示各种各样的东西。

从此特效里可以放各种各样的东西,几乎都在这了。

各种各样的特效要使用的话,就要准备各种各样的变量,这样太麻烦了所以我们采用更有效率的方法。

所以,目前要记住这点,“消除特效的变量上,承载着特效变量。只有消除特效变量的话,是不能成为特效的。

消除特效变量,是做特效的管理工作这样的事情的”。

enter_del_effect 函数里注册了的信息,在 calc_del_effect() 函数里进行计算。

看了注释应该就能明白,寻找注册了的消除特效,如果有,就每1/30 秒注册一个特效。

然后,寻找特效的注册编号,在那里设置信息。

之前也说了,特效变量可以用在任何方面,在表示什么样的特效的种类 knd里代入0。以后消除特效就是0号的特效了。


out_main 里,自机射击总数和敌机总数进行全部的碰撞判定。

那么这里也要添加如下的改动。

————————————————————————————————————————————————————————————————————————

---- out.cpp 做出如下改动 ----

extern void enter_del_effect(int);<span>	</span>//这是新加的

void enemy_death_judge(int s){
        int i;
        se_flag[8]=1;   //敌机被击中的音效
        if(enemy[s].hp<0){  //敌机的HP小于0的话
                enemy[s].flag=0;    //敌机消除
                se_flag[1]=1;       //敌机的BIU的音效
                enter_del_effect(s);<span>	</span>/<span style="font-family:Arial, Helvetica, sans-serif;">/这是新加的</span><span>
</span>


---- define.h 添加如下代码 ----

//特效的最大数目
#define EFFECT_MAX 100
//消除特效的最大数目
#define DEL_EFFECT_MAX 30


---- struct.h 做出以下改动 ----

//敌机相关的构造体
typedef struct{
        int flag,cnt,pattern,muki,knd,hp,hp_max,item_n[6],img,back_col;       //背景色是新加的
        //标志,计数,移动模式,方向,敌机的种类,HP的最大值,掉落的道具,背景色
        double x,y,vx,vy,sp,ang;
        //坐标,速度的x分量,速度的y分量,速度,角度
        int bltime,blknd,blknd2,col,state,wtime,wait;
        //弹幕的开始时间,弹幕的种类,子弹的种类,颜色,状态,待机时间,停滞时间
}enemy_t;


---- enemy.cpp 的 enemy_enter函数的登陆部分里添加如下代码 ----

enemy[i].back_col=GetRand(4);


---- function.h 里添加如下代码 ----

//effect.cpp
GLOBAL void effect_main();


---- GV.h 里添加如下代码 ----

GLOBAL int img_del_effect[5];

GLOBAL del_effect_t del_effect[DEL_EFFECT_MAX]; //消灭特效
GLOBAL effect_t effect[EFFECT_MAX];     //特效


---- ini.cpp 的 ini函数里添加如下代码 ----

memset(effect,0,sizeof(effect_t)*EFFECT_MAX);
memset(del_effect,0,sizeof(del_effect_t)*DEL_EFFECT_MAX);


---- load.cpp 的 load函数里添加如下代码 ----

LoadDivGraph( "../dat/img/enemy/hit_effect.png" , 5 , 5 , 1 , 140 , 140 , img_del_effect ) ;


---- main.cpp 的main函数里添加如下代码 ----

            case 100:       //通常处理
                calc_ch();   //角色计算
                ch_move();   //角色的移动操作
                cshot_main();//自机射击的主函数
                enemy_main();//敌机处理的主函数
                shot_main(); //射击的主函数
                out_main();  //碰撞检测
                effect_main();//特效主函数,这是新加的
                graph_main();//绘画主函数
                stage_count++;
                break;


---- struct.h 里添加如下代码 ----

//特效
typedef struct{
        int flag,cnt,col,knd,img,eff,brt;
        double x,y,r,ang;
}effect_t;

//消除特效
typedef struct{
        int flag,cnt,col;
        double x,y;
}del_effect_t;


---- graph.cpp 里添加如下代码 ----//这段都是新加的

void graph_effect(){
    for(int i=0;i<EFFECT_MAX;i++){
        if(effect[i].flag>0){
            if(effect[i].eff==1)    //特效是光特效的话
                SetDrawBlendMode( DX_BLENDMODE_ADD, effect[i].brt) ;

            DrawRotaGraphF(effect[i].x+FIELD_X,effect[i].y+FIELD_Y,effect[i].r,effect[i].ang,effect[i].img,TRUE);

            if(effect[i].eff==1)
                SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
        }
    }
}

void graph_main(){
        graph_effect();    //新加的特效绘制
        graph_enemy();
        graph_cshot();
        graph_ch();
        graph_bullet();
        graph_board();
}


运行结果:

http://dixq.net/rp/swf/19.swf


本人优快云博客目录:

http://blog.youkuaiyun.com/tidus5


内容概要:本文介绍了一个基于MATLAB实现的无人机三维路径规划项目,采用蚁群算法(ACO)与多层感知机(MLP)相结合的混合模型(ACO-MLP)。该模型通过三维环境离散化建模,利用ACO进行全局路径搜索,并引入MLP对环境特征进行自适应学习与启发因子优化,实现路径的动态调整与多目标优化。项目解决了高维空间建模、动态障碍规避、局部最优陷阱、算法实时性及多目标权衡等关键技术难题,结合并行计算与参数自适应机制,提升了路径规划的智能性、安全性和工程适用性。文中提供了详细的模型架构、核心算法流程及MATLAB代码示例,涵盖空间建模、信息素更新、MLP训练与融合优化等关键步骤。; 适合人群:具备一定MATLAB编程基础,熟悉智能优化算法与经网络的高校学生、科研人员及从事无人机路径规划相关工作的工程师;适合从事智能无人系统、自动驾驶、机器人导航等领域的研究人员; 使用场景及目标:①应用于复杂三维环境下的无人机路径规划,如城市物流、灾害救援、军事侦察等场景;②实现飞行安全、能耗优化、路径平滑与实时避障等多目标协同优化;③为智能无人系统的自主决策与环境适应能力提供算法支持; 阅读建议:此资源结合理论模型与MATLAB实践,建议读者在理解ACO与MLP基本原理的基础上,结合代码示例进行仿真调试,重点关注ACO-MLP融合机制、多目标优化函数设计及参数自适应策略的实现,以深入掌握混合智能算法在工程中的应用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值