feat: enemy_manager,home_manager
This commit is contained in:
parent
c36594ca72
commit
b165dd9c9b
@ -139,10 +139,12 @@
|
||||
<ClInclude Include="animation.h" />
|
||||
<ClInclude Include="config_manager.h" />
|
||||
<ClInclude Include="enemy.h" />
|
||||
<ClInclude Include="enemy_manager.h" />
|
||||
<ClInclude Include="enemy_type.h" />
|
||||
<ClInclude Include="game_manager.h" />
|
||||
<ClInclude Include="goblin_enemy.h" />
|
||||
<ClInclude Include="goblin_priest_enemy.h" />
|
||||
<ClInclude Include="home_manager.h" />
|
||||
<ClInclude Include="king_slime_enemy.h" />
|
||||
<ClInclude Include="manager.h" />
|
||||
<ClInclude Include="map.h" />
|
||||
|
@ -86,5 +86,11 @@
|
||||
<ClInclude Include="skeleton_enemy.h">
|
||||
<Filter>头文件\enemy</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="enemy_manager.h">
|
||||
<Filter>头文件\manager</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="home_manager.h">
|
||||
<Filter>头文件\manager</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -205,7 +205,7 @@ public:
|
||||
}
|
||||
|
||||
//是否可以移除enemy
|
||||
bool can_move()
|
||||
bool can_remove() const
|
||||
{
|
||||
return !is_valid;
|
||||
}
|
||||
|
100
TdGame/TdGame/enemy_manager.h
Normal file
100
TdGame/TdGame/enemy_manager.h
Normal 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
|
51
TdGame/TdGame/home_manager.h
Normal file
51
TdGame/TdGame/home_manager.h
Normal 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_
|
Loading…
Reference in New Issue
Block a user