feat: 5种不同类型敌人子类实现

This commit is contained in:
sjm 2024-06-26 16:31:24 +08:00
parent 677a7d9a61
commit c36594ca72
7 changed files with 309 additions and 4 deletions

View File

@ -141,10 +141,14 @@
<ClInclude Include="enemy.h" /> <ClInclude Include="enemy.h" />
<ClInclude Include="enemy_type.h" /> <ClInclude Include="enemy_type.h" />
<ClInclude Include="game_manager.h" /> <ClInclude Include="game_manager.h" />
<ClInclude Include="goblin_enemy.h" />
<ClInclude Include="goblin_priest_enemy.h" />
<ClInclude Include="king_slime_enemy.h" />
<ClInclude Include="manager.h" /> <ClInclude Include="manager.h" />
<ClInclude Include="map.h" /> <ClInclude Include="map.h" />
<ClInclude Include="resources_manager.h" /> <ClInclude Include="resources_manager.h" />
<ClInclude Include="route.h" /> <ClInclude Include="route.h" />
<ClInclude Include="skeleton_enemy.h" />
<ClInclude Include="slime_enemy.h" /> <ClInclude Include="slime_enemy.h" />
<ClInclude Include="tile.h" /> <ClInclude Include="tile.h" />
<ClInclude Include="timer.h" /> <ClInclude Include="timer.h" />

View File

@ -74,5 +74,17 @@
<ClInclude Include="slime_enemy.h"> <ClInclude Include="slime_enemy.h">
<Filter>头文件\enemy</Filter> <Filter>头文件\enemy</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="king_slime_enemy.h">
<Filter>头文件\enemy</Filter>
</ClInclude>
<ClInclude Include="goblin_enemy.h">
<Filter>头文件\enemy</Filter>
</ClInclude>
<ClInclude Include="goblin_priest_enemy.h">
<Filter>头文件\enemy</Filter>
</ClInclude>
<ClInclude Include="skeleton_enemy.h">
<Filter>头文件\enemy</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,61 @@
#pragma once
#ifndef _GOBLIN_ENEMY_H_
#define _GOBLIN_ENEMY_H_
#include "enemy.h"
#include "config_manager.h"
#include "resources_manager.h"
class GoblinEnemy : public Enemy
{
public:
GoblinEnemy()
{
static const ResourcesManager::TexturePool& texture_pool
= ResourcesManager::instance()->get_texture_pool();
static SDL_Texture* tex_goblin = texture_pool.find(ResID::Tex_Goblin)->second;
static SDL_Texture* tex_goblin_sketch = texture_pool.find(ResID::Tex_GoblinSketch)->second;
static ConfigManager::EnemyTemplate& goblin_template = ConfigManager::instance()->goblin_template;
static const std::vector<int> idx_list_up = { 6,7,8,9,10,11 };
static const std::vector<int> idx_list_down = { 0,1,2,3,4,5 };
static const std::vector<int> idx_list_left = { 18,19,20,21,22,23 };
static const std::vector<int> idx_list_right = { 12,13,14,15,16,17 };
anim_up.set_loop(true); anim_up.set_interval(0.1);
anim_up.set_frame_data(tex_goblin, 6, 4, idx_list_up);
anim_down.set_loop(true); anim_down.set_interval(0.1);
anim_down.set_frame_data(tex_goblin, 6, 4, idx_list_down);
anim_left.set_loop(true); anim_left.set_interval(0.1);
anim_left.set_frame_data(tex_goblin, 6, 4, idx_list_left);
anim_right.set_loop(true); anim_right.set_interval(0.1);
anim_right.set_frame_data(tex_goblin, 6, 4, idx_list_right);
anim_up_sketch.set_loop(true); anim_up_sketch.set_interval(0.1);
anim_up_sketch.set_frame_data(tex_goblin_sketch, 6, 4, idx_list_up);
anim_down_sketch.set_loop(true); anim_down_sketch.set_interval(0.1);
anim_down_sketch.set_frame_data(tex_goblin_sketch, 6, 4, idx_list_down);
anim_left.set_loop(true); anim_left.set_interval(0.1);
anim_left.set_frame_data(tex_goblin_sketch, 6, 4, idx_list_left);
anim_right_sketch.set_loop(true); anim_right_sketch.set_interval(0.1);
anim_right_sketch.set_frame_data(tex_goblin_sketch, 6, 4, idx_list_right);
max_hp = king_slime_template.hp;
max_speed = king_slime_template.speed;
damage = king_slime_template.damage;
reward_ratio = king_slime_template.reward_ratio;
recover_interval = king_slime_template.recover_interval;
recover_range = king_slime_template.recover_range;
recover_intensity = king_slime_template.recover_intensity;
size.x = 48, size.y = 48;
hp = max_hp;
speed = max_speed;
}
~GoblinEnemy() = default;
};
#endif // !_GOBLIN_ENEMY_H_

View File

@ -0,0 +1,62 @@
#pragma once
#ifndef _GOBLIN_PRIEST_ENEMY_H_
#define _GOBLIN_PRIEST_ENEMY_H_
#include "enemy.h"
#include "config_manager.h"
#include "resources_manager.h"
class GoblinPriestEnemy : public Enemy
{
public:
GoblinPriestEnemy()
{
static const ResourcesManager::TexturePool& texture_pool
= ResourcesManager::instance()->get_texture_pool();
static SDL_Texture* tex_goblin_priest = texture_pool.find(ResID::Tex_GoblinPriest)->second;
static SDL_Texture* tex_goblin_priest_sketch = texture_pool.find(ResID::Tex_GoblinPriestSketch)->second;
static ConfigManager::EnemyTemplate& goblin_priest_template = ConfigManager::instance()->goblin_priest_template;
static const std::vector<int> idx_list_up = { 6,7,8,9,10,11 };
static const std::vector<int> idx_list_down = { 0,1,2,3,4,5 };
static const std::vector<int> idx_list_left = { 18,19,20,21,22,23 };
static const std::vector<int> idx_list_right = { 12,13,14,15,16,17 };
anim_up.set_loop(true); anim_up.set_interval(0.1);
anim_up.set_frame_data(tex_goblin_priest, 6, 4, idx_list_up);
anim_down.set_loop(true); anim_down.set_interval(0.1);
anim_down.set_frame_data(tex_goblin_priest, 6, 4, idx_list_down);
anim_left.set_loop(true); anim_left.set_interval(0.1);
anim_left.set_frame_data(tex_goblin_priest, 6, 4, idx_list_left);
anim_right.set_loop(true); anim_right.set_interval(0.1);
anim_right.set_frame_data(tex_goblin_priest, 6, 4, idx_list_right);
anim_up_sketch.set_loop(true); anim_up_sketch.set_interval(0.1);
anim_up_sketch.set_frame_data(tex_goblin_priest_sketch, 6, 4, idx_list_up);
anim_down_sketch.set_loop(true); anim_down_sketch.set_interval(0.1);
anim_down_sketch.set_frame_data(tex_goblin_priest_sketch, 6, 4, idx_list_down);
anim_left.set_loop(true); anim_left.set_interval(0.1);
anim_left.set_frame_data(tex_goblin_priest_sketch, 6, 4, idx_list_left);
anim_right_sketch.set_loop(true); anim_right_sketch.set_interval(0.1);
anim_right_sketch.set_frame_data(tex_goblin_priest_sketch, 6, 4, idx_list_right);
max_hp = goblin_priest_template.hp;
max_speed = goblin_priest_template.speed;
damage = goblin_priest_template.damage;
reward_ratio = goblin_priest_template.reward_ratio;
recover_interval = goblin_priest_template.recover_interval;
recover_range = goblin_priest_template.recover_range;
recover_intensity = goblin_priest_template.recover_intensity;
size.x = 48, size.y = 48;
hp = max_hp;
speed = max_speed;
}
~GoblinPriestEnemy() = default;
};
#endif // !_GOBLIN_PRIEST_ENEMY_H_

View File

@ -0,0 +1,61 @@
#pragma once
#ifndef _KING_SLIME_ENEMY_H_
#define _KING_SLIME_ENEMY_H_
#include "enemy.h"
#include "config_manager.h"
#include "resources_manager.h"
class KingSlimeEnemy : public Enemy
{
public:
KingSlimeEnemy()
{
static const ResourcesManager::TexturePool& texture_pool
= ResourcesManager::instance()->get_texture_pool();
static SDL_Texture* tex_king_slime = texture_pool.find(ResID::Tex_KingSlime)->second;
static SDL_Texture* tex_king_slime_sketch = texture_pool.find(ResID::Tex_KingSlimeSketch)->second;
static ConfigManager::EnemyTemplate& king_slime_template = ConfigManager::instance()->king_slime_template;
static const std::vector<int> idx_list_up = { 6,7,8,9,10,11 };
static const std::vector<int> idx_list_down = { 0,1,2,3,4,5 };
static const std::vector<int> idx_list_left = { 18,19,20,21,22,23 };
static const std::vector<int> idx_list_right = { 12,13,14,15,16,17 };
anim_up.set_loop(true); anim_up.set_interval(0.1);
anim_up.set_frame_data(tex_king_slime, 6, 4, idx_list_up);
anim_down.set_loop(true); anim_down.set_interval(0.1);
anim_down.set_frame_data(tex_king_slime, 6, 4, idx_list_down);
anim_left.set_loop(true); anim_left.set_interval(0.1);
anim_left.set_frame_data(tex_king_slime, 6, 4, idx_list_left);
anim_right.set_loop(true); anim_right.set_interval(0.1);
anim_right.set_frame_data(tex_king_slime, 6, 4, idx_list_right);
anim_up_sketch.set_loop(true); anim_up_sketch.set_interval(0.1);
anim_up_sketch.set_frame_data(tex_king_slime_sketch, 6, 4, idx_list_up);
anim_down_sketch.set_loop(true); anim_down_sketch.set_interval(0.1);
anim_down_sketch.set_frame_data(tex_king_slime_sketch, 6, 4, idx_list_down);
anim_left.set_loop(true); anim_left.set_interval(0.1);
anim_left.set_frame_data(tex_king_slime_sketch, 6, 4, idx_list_left);
anim_right_sketch.set_loop(true); anim_right_sketch.set_interval(0.1);
anim_right_sketch.set_frame_data(tex_king_slime_sketch, 6, 4, idx_list_right);
max_hp = king_slime_template.hp;
max_speed = king_slime_template.speed;
damage = king_slime_template.damage;
reward_ratio = king_slime_template.reward_ratio;
recover_interval = king_slime_template.recover_interval;
recover_range = king_slime_template.recover_range;
recover_intensity = king_slime_template.recover_intensity;
size.x = 48, size.y = 48;
hp = max_hp;
speed = max_speed;
}
~KingSlimeEnemy() = default;
};
#endif

View File

@ -0,0 +1,62 @@
#pragma once
#ifndef _SKELETON_ENEMY_H
#define _SKELETON_ENEMY_H
#include "enemy.h"
#include "config_manager.h"
#include "resources_manager.h"
class SkeletonEnemy : public Enemy
{
public:
SkeletonEnemy()
{
//skeleton纹理
static const ResourcesManager::TexturePool& texture_pool
= ResourcesManager::instance()->get_texture_pool();
static SDL_Texture* tex_skeleton = texture_pool.find(ResID::Tex_Skeleton)->second;
static SDL_Texture* tex_skeleton_sketch = texture_pool.find(ResID::Tex_SkeletonSketch)->second;
//skeleton数据
static ConfigManager::EnemyTemplate& skeleton_template = ConfigManager::instance()->skeleton_template;
//向上行动的动画帧索引根据resource中skeleton的资源图
static const std::vector<int> idx_list_up = { 6,7,8,9,10,11 };
static const std::vector<int> idx_list_down = { 0,1,2,3,4,5 };
static const std::vector<int> idx_list_left = { 18,19,20,21,22,23 };
static const std::vector<int> idx_list_right = { 12,13,14,15,16,17 };
anim_up.set_loop(true); anim_up.set_interval(0.1);
anim_up.set_frame_data(tex_skeleton, 6, 4, idx_list_up);
anim_down.set_loop(true); anim_down.set_interval(0.1);
anim_down.set_frame_data(tex_skeleton, 6, 4, idx_list_down);
anim_left.set_loop(true); anim_left.set_interval(0.1);
anim_left.set_frame_data(tex_skeleton, 6, 4, idx_list_left);
anim_right.set_loop(true); anim_right.set_interval(0.1);
anim_right.set_frame_data(tex_skeleton, 6, 4, idx_list_right);
anim_up_sketch.set_loop(true); anim_up_sketch.set_interval(0.1);
anim_up_sketch.set_frame_data(tex_skeleton_sketch, 6, 4, idx_list_up);
anim_down_sketch.set_loop(true); anim_down_sketch.set_interval(0.1);
anim_down_sketch.set_frame_data(tex_skeleton_sketch, 6, 4, idx_list_down);
anim_left.set_loop(true); anim_left.set_interval(0.1);
anim_left.set_frame_data(tex_skeleton_sketch, 6, 4, idx_list_left);
anim_right_sketch.set_loop(true); anim_right_sketch.set_interval(0.1);
anim_right_sketch.set_frame_data(tex_skeleton_sketch, 6, 4, idx_list_right);
max_hp = skeleton_template.hp;
max_speed = skeleton_template.speed;
damage = skeleton_template.damage;
reward_ratio = skeleton_template.reward_ratio;
recover_interval = skeleton_template.recover_interval;
recover_range = skeleton_template.recover_range;
recover_intensity = skeleton_template.recover_intensity;
size.x = 48, size.y = 48;
hp = max_hp;
speed = max_speed;
}
~SkeletonEnemy() = default;
};
#endif // !_SKELETON_ENEMY_H

View File

@ -6,13 +6,56 @@
#include "config_manager.h" #include "config_manager.h"
#include "resources_manager.h" #include "resources_manager.h"
class SlimeEnemy class SlimeEnemy : public Enemy
{ {
public: public:
SlimeEnemy(); SlimeEnemy()
~SlimeEnemy(); {
//slime纹理
static const ResourcesManager::TexturePool& texture_pool
= ResourcesManager::instance()->get_texture_pool();
static SDL_Texture* tex_slime = texture_pool.find(ResID::Tex_Slime)->second;
static SDL_Texture* tex_slime_sketch = texture_pool.find(ResID::Tex_SlimeSketch)->second;
//slime数据
static ConfigManager::EnemyTemplate& slime_template = ConfigManager::instance()->slime_template;
private: //向上行动的动画帧索引根据resource中slime的资源图
static const std::vector<int> idx_list_up = { 6,7,8,9,10,11 };
static const std::vector<int> idx_list_down = { 0,1,2,3,4,5 };
static const std::vector<int> idx_list_left = { 18,19,20,21,22,23 };
static const std::vector<int> idx_list_right = { 12,13,14,15,16,17 };
anim_up.set_loop(true); anim_up.set_interval(0.1);
anim_up.set_frame_data(tex_slime, 6, 4, idx_list_up);
anim_down.set_loop(true); anim_down.set_interval(0.1);
anim_down.set_frame_data(tex_slime, 6, 4, idx_list_down);
anim_left.set_loop(true); anim_left.set_interval(0.1);
anim_left.set_frame_data(tex_slime, 6, 4, idx_list_left);
anim_right.set_loop(true); anim_right.set_interval(0.1);
anim_right.set_frame_data(tex_slime, 6, 4, idx_list_right);
anim_up_sketch.set_loop(true); anim_up_sketch.set_interval(0.1);
anim_up_sketch.set_frame_data(tex_slime_sketch, 6, 4, idx_list_up);
anim_down_sketch.set_loop(true); anim_down_sketch.set_interval(0.1);
anim_down_sketch.set_frame_data(tex_slime_sketch, 6, 4, idx_list_down);
anim_left.set_loop(true); anim_left.set_interval(0.1);
anim_left.set_frame_data(tex_slime_sketch, 6, 4, idx_list_left);
anim_right_sketch.set_loop(true); anim_right_sketch.set_interval(0.1);
anim_right_sketch.set_frame_data(tex_slime_sketch, 6, 4, idx_list_right);
max_hp = slime_template.hp;
max_speed = slime_template.speed;
damage = slime_template.damage;
reward_ratio = slime_template.reward_ratio;
recover_interval = slime_template.recover_interval;
recover_range = slime_template.recover_range;
recover_intensity = slime_template.recover_intensity;
size.x = 48, size.y = 48;
hp = max_hp;
speed = max_speed;
}
~SlimeEnemy() = default;
}; };