From b165dd9c9be29f6310bb89f140c78e5798110046 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BB=BA=E6=98=8E=20=E6=B2=88?= <2431685932@qq.com>
Date: Fri, 28 Jun 2024 10:28:44 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20enemy=5Fmanager=EF=BC=8Chome=5Fmanager?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
TdGame/TdGame/TdGame.vcxproj | 2 +
TdGame/TdGame/TdGame.vcxproj.filters | 6 ++
TdGame/TdGame/enemy.h | 2 +-
TdGame/TdGame/enemy_manager.h | 100 +++++++++++++++++++++++++++
TdGame/TdGame/home_manager.h | 51 ++++++++++++++
5 files changed, 160 insertions(+), 1 deletion(-)
create mode 100644 TdGame/TdGame/enemy_manager.h
create mode 100644 TdGame/TdGame/home_manager.h
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_