一段技能代码

⌚Time: 2024-08-09 19:24:00

👨‍💻Author: Jack Ge

我写了一个角色的技能代码,作用是释放几段闪电。由于要改变实现办法,我不想抛弃,就把这个技能类记录下来。

class Skill_Beam :public SkillBase{
public:
    virtual ~Skill_Beam(){}
    Skill_Beam(ISkillAbility *launcher):
        SkillBase(launcher){
        //技能名称
        set_skill_name("Beam");
        set_skill_icon_name("Beam.png");
        m_isSkillEnd = true;//技能结束状态

        set_skill_description("Beam description.");
        set_mana_consume(40);
        set_m_cooldown_time(5.0);
    }
public:
    
    virtual int get_skill_point_to_upgrade(){
        return 1;
    }
    virtual bool launch_skill(){
        //新的计时器
        m_clock = new sf::Clock();
        m_clock->restart();
        //技能状态没有结束
        m_isSkillEnd = false;
        //获取释放者位置和朝向信息
        m_launcherPosition = m_launcher->ISkillAbility_get_position_and_size();
        m_isLauncherFaceToRight = m_launcher->ISkillAbility_is_sprite_face_to_right();
        //重置光柱未移动状态
        memset(m_isBeamMoved,0,sizeof(m_isBeamMoved));
        m_beamMoveDistance = 20;//每次移动光柱距离
        //设置光柱数量和起始位置
        m_beamNumber = 2;
        m_beamPosition[0] = sf::Vector2i(m_launcherPosition.left+(m_isLauncherFaceToRight?20:-20),m_launcherPosition.top-30);
        m_beamPosition[1] = sf::Vector2i(m_launcherPosition.left+(m_isLauncherFaceToRight?40:-40),m_launcherPosition.top-30);
        //
        
        return true;
    }
    virtual void interrupt_skill(){

    }
    virtual float get_duration_time(){
        return 3.0;
    }
    void create_beam(){
        //显示光柱并施加伤害
        for(int i=0;i<m_beamNumber;i++){
            EffectSystem::get_instance()->new_effect("Beam",m_beamPosition[i]);
            //施加伤害代码
            //...
        }
    }
    //更新
    virtual void update(){
        if (m_isSkillEnd){
            return;
        }
        float elapsedTime = m_clock->getElapsedTime().asSeconds();
        if (elapsedTime > 3.0){
            delete m_clock;
            m_isSkillEnd = true;
        }else{
            //根据特定时间对光柱进行移动
            if(elapsedTime>0.5&&m_isBeamMoved[0] == false){
                
                for(int i=0;i<m_beamNumber;i++){
                    m_beamPosition[i].x += m_isLauncherFaceToRight?m_beamMoveDistance:-m_beamMoveDistance;
                }
                m_isBeamMoved[0] = true;
                //制造光柱
                create_beam();
            }
            if(elapsedTime>0.7&&m_isBeamMoved[1] == false){
                for(int i=0;i<m_beamNumber;i++){
                    m_beamPosition[i].x += m_isLauncherFaceToRight?m_beamMoveDistance:-m_beamMoveDistance;
                }
                m_isBeamMoved[1] = true;
                //制造光柱
                create_beam();
            }
            if(elapsedTime>0.9&&m_isBeamMoved[2] == false){
                for(int i=0;i<m_beamNumber;i++){
                    m_beamPosition[i].x += m_isLauncherFaceToRight?m_beamMoveDistance:-m_beamMoveDistance;
                }
                m_isBeamMoved[2] = true;
                //制造光柱
                create_beam();
            }
            if(elapsedTime>1.1&&m_isBeamMoved[3] == false){
                for(int i=0;i<m_beamNumber;i++){
                    m_beamPosition[i].x += m_isLauncherFaceToRight?m_beamMoveDistance:-m_beamMoveDistance;
                }
                m_isBeamMoved[3] = true;
                //制造光柱
                create_beam();
            }
            if(elapsedTime>1.3&&m_isBeamMoved[4] == false){
                for(int i=0;i<m_beamNumber;i++){
                    m_beamPosition[i].x += m_isLauncherFaceToRight?m_beamMoveDistance:-m_beamMoveDistance;
                }
                m_isBeamMoved[4] = true;
                //制造光柱
                create_beam();
            }
            if(elapsedTime>1.5&&m_isBeamMoved[5] == false){
                for(int i=0;i<m_beamNumber;i++){
                    m_beamPosition[i].x += m_isLauncherFaceToRight?m_beamMoveDistance:-m_beamMoveDistance;
                }
                m_isBeamMoved[5] = true;
                //制造光柱
                create_beam();
            }
            if(elapsedTime>1.7&&m_isBeamMoved[6] == false){
                for(int i=0;i<m_beamNumber;i++){
                    m_beamPosition[i].x += m_isLauncherFaceToRight?m_beamMoveDistance:-m_beamMoveDistance;
                }
                m_isBeamMoved[6] = true;
                //制造光柱
                create_beam();
            }
            if(elapsedTime>1.9&&m_isBeamMoved[7] == false){
                for(int i=0;i<m_beamNumber;i++){
                    m_beamPosition[i].x += m_isLauncherFaceToRight?m_beamMoveDistance:-m_beamMoveDistance;
                }
                m_isBeamMoved[7] = true;
                //制造光柱
                create_beam();
            }
            if(elapsedTime>2.1&&m_isBeamMoved[8] == false){
                for(int i=0;i<m_beamNumber;i++){
                    m_beamPosition[i].x += m_isLauncherFaceToRight?m_beamMoveDistance:-m_beamMoveDistance;
                }
                m_isBeamMoved[8] = true;
                //制造光柱
                create_beam();
            }
        }
    }
private:
    sf::Clock *m_clock;//时钟
    bool m_isSkillEnd;//技能结束标志

    sf::Vector2i m_beamPosition[10];//每个光柱位置
    bool m_isBeamMoved[10];//光柱移动的次数
    int m_beamMoveDistance;//光柱每次移动距离
    int m_beamNumber;//光柱数量

    bool m_isLauncherFaceToRight;
    sf::IntRect m_launcherPosition;
};

技能效果

update函数里面,判断技能释放后的时间,并且在特定时间对所有的光柱进行位移和制造伤害。

launch_skill里面建立技能时钟,并且设置技能的参数。因为是测试没有根据技能等级去分别设置。

EffectSystem::new_effect是创建特效。这里创建了光柱特效

新的类代码

class Skill_Beam :public SkillBase{
public:
    virtual ~Skill_Beam(){}
    Skill_Beam(ISkillAbility *launcher):
        SkillBase(launcher){
        //技能名称
        set_skill_name("Beam");
        set_skill_icon_name("Beam.png");
        m_isSkillEnd = true;//技能结束状态

        
        set_skill_description("Beam description.");
        set_mana_consume(40);
        set_m_cooldown_time(5.0);
    }
public:
    
    virtual int get_skill_point_to_upgrade(){
        return 1;
    }
    virtual bool launch_skill(){
        //新的计时器
        m_clock = new sf::Clock();
        m_clock->restart();
        //技能状态没有结束
        m_isSkillEnd = false;
        //获取信息
        m_launcherPosition = m_launcher->ISkillAbility_get_position_and_size();
        m_isLauncherFaceToRight = m_launcher->ISkillAbility_is_sprite_face_to_right();
        //
        memset(m_isBeamAppeared,0,sizeof(m_isBeamAppeared));

        return true;
    }
    virtual void interrupt_skill(){

    }
    virtual float get_duration_time(){
        return 1.0;
    }
    //更新
    virtual void update(){
        if (m_isSkillEnd){
            return;
        }
        float elapsedTime = m_clock->getElapsedTime().asSeconds();
        if (elapsedTime > 3.0){
            delete m_clock;
            m_isSkillEnd = true;
        }else{
            //特定时间创造光柱
            if(elapsedTime>0.5&&m_isBeamAppeared[0] == false){
                
                EffectSystem::get_instance()->new_effect("Beam",sf::Vector2i(m_launcherPosition.left+(m_isLauncherFaceToRight?20:-20),m_launcherPosition.top-30));
                m_isBeamAppeared[0] = true;
            }
            if(elapsedTime>0.7&&m_isBeamAppeared[1] == false){

                EffectSystem::get_instance()->new_effect("Beam",sf::Vector2i(m_launcherPosition.left+(m_isLauncherFaceToRight?40:-40),m_launcherPosition.top-30));
                m_isBeamAppeared[1] = true;
            }
            if(elapsedTime>0.9&&m_isBeamAppeared[2] == false){

                EffectSystem::get_instance()->new_effect("Beam",sf::Vector2i(m_launcherPosition.left+(m_isLauncherFaceToRight?60:-60),m_launcherPosition.top-30));
                m_isBeamAppeared[2] = true;
            }
            if(elapsedTime>1.1&&m_isBeamAppeared[3] == false){

                EffectSystem::get_instance()->new_effect("Beam",sf::Vector2i(m_launcherPosition.left+(m_isLauncherFaceToRight?80:-80),m_launcherPosition.top-30));
                m_isBeamAppeared[3] = true;
            }
            if(elapsedTime>1.3&&m_isBeamAppeared[4] == false){

                EffectSystem::get_instance()->new_effect("Beam",sf::Vector2i(m_launcherPosition.left+(m_isLauncherFaceToRight?100:-100),m_launcherPosition.top-30));
                m_isBeamAppeared[4] = true;
            }
            if(elapsedTime>1.5&&m_isBeamAppeared[5] == false){

                EffectSystem::get_instance()->new_effect("Beam",sf::Vector2i(m_launcherPosition.left+(m_isLauncherFaceToRight?120:-120),m_launcherPosition.top-30));
                m_isBeamAppeared[5] = true;
            }
            if(elapsedTime>1.7&&m_isBeamAppeared[6] == false){

                EffectSystem::get_instance()->new_effect("Beam",sf::Vector2i(m_launcherPosition.left+(m_isLauncherFaceToRight?140:-140),m_launcherPosition.top-30));
                m_isBeamAppeared[6] = true;
            }
            if(elapsedTime>1.9&&m_isBeamAppeared[7] == false){

                EffectSystem::get_instance()->new_effect("Beam",sf::Vector2i(m_launcherPosition.left+(m_isLauncherFaceToRight?160:-160),m_launcherPosition.top-30));
                m_isBeamAppeared[7] = true;
            }

        }
    }
private:
    sf::Clock *m_clock;
    bool m_isSkillEnd;

    bool m_isBeamAppeared[10];//光柱出现过

    bool m_isLauncherFaceToRight;
    sf::IntRect m_launcherPosition;
};

加了技能伤害后的技能效果