feat: enemy_manager,home_manager

This commit is contained in:
sjm 2024-06-28 10:28:44 +08:00
parent c36594ca72
commit b165dd9c9b
5 changed files with 160 additions and 1 deletions

View File

@ -139,10 +139,12 @@
<ClInclude Include="animation.h" /> <ClInclude Include="animation.h" />
<ClInclude Include="config_manager.h" /> <ClInclude Include="config_manager.h" />
<ClInclude Include="enemy.h" /> <ClInclude Include="enemy.h" />
<ClInclude Include="enemy_manager.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_enemy.h" />
<ClInclude Include="goblin_priest_enemy.h" /> <ClInclude Include="goblin_priest_enemy.h" />
<ClInclude Include="home_manager.h" />
<ClInclude Include="king_slime_enemy.h" /> <ClInclude Include="king_slime_enemy.h" />
<ClInclude Include="manager.h" /> <ClInclude Include="manager.h" />
<ClInclude Include="map.h" /> <ClInclude Include="map.h" />

View File

@ -86,5 +86,11 @@
<ClInclude Include="skeleton_enemy.h"> <ClInclude Include="skeleton_enemy.h">
<Filter>头文件\enemy</Filter> <Filter>头文件\enemy</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="enemy_manager.h">
<Filter>头文件\manager</Filter>
</ClInclude>
<ClInclude Include="home_manager.h">
<Filter>头文件\manager</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -205,7 +205,7 @@ public:
} }
//是否可以移除enemy //是否可以移除enemy
bool can_move() bool can_remove() const
{ {
return !is_valid; return !is_valid;
} }

View File

@ -0,0 +1,100 @@
#pragma once
#ifndef _ENEMY_MANAGER_H
#define _ENEMY_MANAGER_H
#include "enemy.h"
#include "manager.h"
#include "config_manager.h"
#include "Vector2.h"
#include "home_manager.h"
#include <vector>
#include <SDL.h>
class EnemyManager: public Manager<EnemyManager>
{
friend class Manager<EnemyManager>;
public:
typedef std::vector<Enemy*> EnemyList;
public:
//管理器执行容器每个对象的逻辑
void on_update(double delta)
{
for (Enemy* enemy : enemy_list)
enemy->on_update(delta);
process_home_collision();
process_bullet_collision();
remove_invalid_enemy();
}
void on_render(SDL_Renderer* renderer)
{
for (Enemy* enemy : enemy_list)
enemy->on_render(renderer);
}
protected:
EnemyManager() = default;
~EnemyManager()
{
for (Enemy* enemy : enemy_list)
delete enemy;
}
private:
EnemyList enemy_list;
private:
//房屋碰撞检测
void process_home_collision()
{
//获取房屋世界坐标
static const SDL_Point& idx_home = ConfigManager::instance()->map.get_idx_home();
static const SDL_Rect& rect_tile_map = ConfigManager::instance()->rect_tile_map;
static const Vector2 position_home_tile =
{
(double)rect_tile_map.x + idx_home.x * SIZE_TILE,
(double)rect_tile_map.y + idx_home.y * SIZE_TILE
};
for (Enemy* enemy : enemy_list)
{
if (enemy->can_remove())continue;
const Vector2& position = enemy->get_position();
if (position.x >= position_home_tile.x
&& position.y >= position_home_tile.y
&& position.x <= position_home_tile.x + SIZE_TILE
&& position.y <= position_home_tile.y + SIZE_TILE)
{
enemy->make_invalid();
HomeManager::instance()->decrease_hp(enemy->get_damage());
}
}
}
//子弹碰撞检测
void process_bullet_collision()
{
}
//移除无效敌人
void remove_invalid_enemy()
{
enemy_list.erase(std::remove_if(enemy_list.begin(), enemy_list.end(),
[](const Enemy* enemy)
{
bool deletable = enemy->can_remove();
if (deletable) delete(enemy);
return deletable;
}), enemy_list.end());
}
};
#endif // !_ENEMY_MANAGER_H

View File

@ -0,0 +1,51 @@
#pragma once
#ifndef _HOME_MANAGER_H_
#define _HOME_MANAGER_H_
#include "manager.h"
#include"config_manager.h"
#include "resources_manager.h"
class HomeManager:public Manager<HomeManager>
{
friend class Manager<HomeManager>;
public:
double get_current_hp()
{
return num_hp;
}
void decrease_hp(double val)
{
num_hp -= val;
if (num_hp < 0)
num_hp = 0;
static const ResourcesManager::SoundPool& sound_pool
= ResourcesManager::instance()->get_sound_pool();
/*
param1 channel
param2 mix_chunk
param3 loop 0Êǵ¥´Î
*/
Mix_PlayChannel(-1, sound_pool.find(ResID::Sound_HomeHurt)->second, 0);
}
protected:
HomeManager()
{
num_hp = ConfigManager::instance()->num_initial_hp;
}
~HomeManager() = default;
private:
double num_hp = 0;
};
#endif // !_HOME_MANAGER_H_