diff --git a/TdGame/TdGame/TdGame.vcxproj b/TdGame/TdGame/TdGame.vcxproj index f1fe6d0..2a5a57f 100644 --- a/TdGame/TdGame/TdGame.vcxproj +++ b/TdGame/TdGame/TdGame.vcxproj @@ -139,10 +139,12 @@ + + diff --git a/TdGame/TdGame/TdGame.vcxproj.filters b/TdGame/TdGame/TdGame.vcxproj.filters index 88d2d04..0b1d276 100644 --- a/TdGame/TdGame/TdGame.vcxproj.filters +++ b/TdGame/TdGame/TdGame.vcxproj.filters @@ -86,5 +86,11 @@ 头文件\enemy + + 头文件\manager + + + 头文件\manager + \ No newline at end of file diff --git a/TdGame/TdGame/enemy.h b/TdGame/TdGame/enemy.h index 69b19a0..870e2d0 100644 --- a/TdGame/TdGame/enemy.h +++ b/TdGame/TdGame/enemy.h @@ -205,7 +205,7 @@ public: } //ÊÇ·ñ¿ÉÒÔÒƳýenemy - bool can_move() + bool can_remove() const { return !is_valid; } diff --git a/TdGame/TdGame/enemy_manager.h b/TdGame/TdGame/enemy_manager.h new file mode 100644 index 0000000..8726050 --- /dev/null +++ b/TdGame/TdGame/enemy_manager.h @@ -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 +#include + + +class EnemyManager: public Manager +{ + friend class Manager; + +public: + typedef std::vector 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 diff --git a/TdGame/TdGame/home_manager.h b/TdGame/TdGame/home_manager.h new file mode 100644 index 0000000..4d789aa --- /dev/null +++ b/TdGame/TdGame/home_manager.h @@ -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 +{ + friend class Manager; + +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_