我写了一个角色的技能代码,作用是释放几段闪电。由于要改变实现办法,我不想抛弃,就把这个技能类记录下来。
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;
};
加了技能伤害后的技能效果