From da081606252712b6744d151f7c08b00c9c9574ed 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: Mon, 1 Jul 2024 17:44:55 +0800 Subject: [PATCH] =?UTF-8?q?error:=E9=94=99=E8=AF=AF=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=97=A0=E6=B3=95=E6=88=90=E6=88=90=E6=95=8C=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TdGame/TdGame/TdGame.vcxproj | 3 + TdGame/TdGame/TdGame.vcxproj.filters | 6 ++ TdGame/TdGame/animation.h | 13 ++-- TdGame/TdGame/coin_manager.h | 39 ++++++++++ TdGame/TdGame/config.json | 2 +- TdGame/TdGame/config_manager.h | 19 ++--- TdGame/TdGame/enemy.h | 12 +-- TdGame/TdGame/enemy_manager.h | 94 ++++++++++++++++++++++- TdGame/TdGame/game_manager.h | 16 +++- TdGame/TdGame/goblin_enemy.h | 57 +++++++------- TdGame/TdGame/goblin_priest_enemy.h | 43 +++++------ TdGame/TdGame/king_slime_enemy.h | 15 ++-- TdGame/TdGame/main.cpp | 1 - TdGame/TdGame/map.h | 4 +- TdGame/TdGame/skeleton_enemy.h | 35 +++++---- TdGame/TdGame/slime_enemy.h | 8 +- TdGame/TdGame/timer.h | 2 +- TdGame/TdGame/wave.h | 2 +- TdGame/TdGame/wave_manager.h | 110 +++++++++++++++++++++++++++ 19 files changed, 366 insertions(+), 115 deletions(-) create mode 100644 TdGame/TdGame/coin_manager.h create mode 100644 TdGame/TdGame/wave_manager.h diff --git a/TdGame/TdGame/TdGame.vcxproj b/TdGame/TdGame/TdGame.vcxproj index 2a5a57f..4b8785a 100644 --- a/TdGame/TdGame/TdGame.vcxproj +++ b/TdGame/TdGame/TdGame.vcxproj @@ -121,6 +121,7 @@ MultiThreaded ..\ThirdParty\cJSON\include;..\ThirdParty\SDL2\include;..\ThirdParty\SDL2_gfx\include;..\ThirdParty\SDL2_image\include;..\ThirdParty\SDL2_mixer\include;..\ThirdParty\SDL2_ttf\include;%(AdditionalIncludeDirectories) ProgramDatabase + Disabled Console @@ -137,6 +138,7 @@ + @@ -156,6 +158,7 @@ + diff --git a/TdGame/TdGame/TdGame.vcxproj.filters b/TdGame/TdGame/TdGame.vcxproj.filters index 0b1d276..059e962 100644 --- a/TdGame/TdGame/TdGame.vcxproj.filters +++ b/TdGame/TdGame/TdGame.vcxproj.filters @@ -92,5 +92,11 @@ 头文件\manager + + 头文件\manager + + + 头文件\manager + \ No newline at end of file diff --git a/TdGame/TdGame/animation.h b/TdGame/TdGame/animation.h index 48a9e8c..beecfd0 100644 --- a/TdGame/TdGame/animation.h +++ b/TdGame/TdGame/animation.h @@ -8,7 +8,6 @@ #include #include - class Animation { public: @@ -18,12 +17,14 @@ public: Animation() { timer.set_one_shot(false); + timer.set_on_timeout ( //[&]ʾ lambda ʽòⲿб lambda ʽʹò޸Щ [&]() { idx_frame++; + if (idx_frame >= rect_src_list.size()) { idx_frame = is_loop ? 0 : rect_src_list.size() - 1; @@ -58,7 +59,8 @@ public: rect_src.x = (idx % num_x) * width_frame; rect_src.y = (idx / num_x) * height_frame; - rect_src.w = width_frame; rect_src.h = height_frame; + rect_src.w = width_frame; + rect_src.h = height_frame; }; } @@ -81,16 +83,17 @@ public: { timer.on_update(delta); } + //ȾȾλãǶȣת - void on_render(SDL_Renderer* renderer, const SDL_Point& pos_dst, double angle = 0)const + void on_render(SDL_Renderer* renderer, const SDL_Point& pos_dst, double angle = 0) const { static SDL_Rect rect_dst; rect_dst.x = pos_dst.x; rect_dst.y = pos_dst.y; rect_dst.w = width_frame; rect_dst.h = height_frame; - //ȾüΣĿΣǶȣתĵ(Ĭ1/2)ת - SDL_RenderCopyEx(renderer, texture, &rect_src_list[idx_frame], &rect_dst, 0, nullptr, SDL_RendererFlip::SDL_FLIP_NONE); + //ȾüΣĿΣǶȣתĵ(Ĭ1/2)ת + SDL_RenderCopyEx(renderer, texture, &rect_src_list[idx_frame], &rect_dst, angle, nullptr, SDL_RendererFlip::SDL_FLIP_NONE); } private: Timer timer; diff --git a/TdGame/TdGame/coin_manager.h b/TdGame/TdGame/coin_manager.h new file mode 100644 index 0000000..a01d996 --- /dev/null +++ b/TdGame/TdGame/coin_manager.h @@ -0,0 +1,39 @@ +#pragma once +#ifndef _COIN_MANAGER_H_ +#define _COIN_MANAGER_H_ + +#include"manager.h" + +class CoinManager:public Manager +{ + friend class Manager; +public: + void increase_coin(double val) + { + num_coin += val; + } + + void decrease_coin(double val) + { + num_coin -= val; + + if (num_coin < 0) + num_coin = 0; + } + +protected: + CoinManager() + { + num_coin = ConfigManager::instance()->num_initial_coin; + } + ~CoinManager() + { + + } + +private: + double num_coin = 0; +}; + + +#endif // _COINMANAGER_H_ diff --git a/TdGame/TdGame/config.json b/TdGame/TdGame/config.json index bc5845a..19c76c0 100644 --- a/TdGame/TdGame/config.json +++ b/TdGame/TdGame/config.json @@ -1,7 +1,7 @@ { "basic": { - "window_title": "村庄保卫战!", + "window_title": "村庄保卫战", "window_width": 1280, "window_height": 720 }, diff --git a/TdGame/TdGame/config_manager.h b/TdGame/TdGame/config_manager.h index 79b8f98..f39fc8a 100644 --- a/TdGame/TdGame/config_manager.h +++ b/TdGame/TdGame/config_manager.h @@ -64,7 +64,7 @@ public: int level_axeman = 0;//ͷȼ int level_gunner = 0;//ǹȼ - bool is_game_win =true;//ϷǷʤ + bool is_game_win =false;//ϷǷʤ bool is_game_over = false;//ϷǷͬҪ SDL_Rect rect_tile_map = { 0 }; @@ -94,8 +94,8 @@ public: if (!file.good())return false; std::stringstream str_stream; - str_stream << file.rdbuf();//rdbuf()һһ - file.close(); + //rdbuf()һһ + str_stream << file.rdbuf(); file.close(); cJSON* json_root = cJSON_Parse(str_stream.str().c_str()); if (!json_root) return false;//ʧ @@ -133,14 +133,17 @@ public: continue; wave.spawn_event_list.emplace_back(); - Wave::SpawnEvent& spawn_event = wave.spawn_event_list.back();//,:"interval" : 1,"point": 1,"enemy" : "Slim" + //,:"interval" : 1,"point": 1,"enemy" : "Slime" + Wave::SpawnEvent& spawn_event = wave.spawn_event_list.back(); cJSON* json_spawn_event_interval = cJSON_GetObjectItem(json_spawn_event, "interval"); if (json_spawn_event_interval && json_spawn_event_interval->type == cJSON_Number) spawn_event.interval = json_spawn_event_interval->valuedouble; + cJSON* json_spawn_event_spawn_point = cJSON_GetObjectItem(json_spawn_event,"point"); if (json_spawn_event_spawn_point && json_spawn_event_spawn_point->type == cJSON_Number) spawn_event.spawn_point = json_spawn_event_spawn_point->valueint; + cJSON* json_spawn_event_enemy_type = cJSON_GetObjectItem(json_spawn_event, "enemy"); if (json_spawn_event_enemy_type && json_spawn_event_enemy_type->type == cJSON_String) { @@ -157,7 +160,6 @@ public: spawn_event.enemy_type = EnemyType::GoblinPriest; } } - if (wave.spawn_event_list.empty()) wave_list.pop_back(); } @@ -179,9 +181,7 @@ public: if (!file.good()) return false; std::stringstream str_stream; - str_stream << file.rdbuf(); - - file.close(); + str_stream << file.rdbuf();file.close(); cJSON* json_root = cJSON_Parse(str_stream.str().c_str()); if (!json_root || json_root->type != cJSON_Object) return false; @@ -295,7 +295,8 @@ private: void parse_enemy_template(EnemyTemplate& tpl, cJSON* json_root) { - if (!json_root || json_root->type != cJSON_Object)return; + if (!json_root || json_root->type != cJSON_Object) return; + cJSON* json_hp = cJSON_GetObjectItem(json_root, "hp"); cJSON* json_speed = cJSON_GetObjectItem(json_root, "speed"); cJSON* json_damage = cJSON_GetObjectItem(json_root, "damage"); diff --git a/TdGame/TdGame/enemy.h b/TdGame/TdGame/enemy.h index 870e2d0..2de09d6 100644 --- a/TdGame/TdGame/enemy.h +++ b/TdGame/TdGame/enemy.h @@ -23,7 +23,7 @@ public: //׼ʱ timer_sketch.set_one_shot(true); - timer_sketch.set_wait_time(0.075); + timer_sketch.set_wait_time(0.001); timer_sketch.set_on_timeout([&]() {is_show_sketch = false; }); //ٶȻָʱ @@ -59,7 +59,7 @@ public: //Ƿչʾˮƽ bool is_show_x_anim = (velocity.x) >= abs(velocity.y); - //1.ǷչʾӰ 2.Ƿչʾˮƽ + //1.ǷչʾӰ 2.չʾ if (is_show_sketch) { if (is_show_x_anim) @@ -102,7 +102,7 @@ public: //Ѫ rect.x = (int)(position.x - size_hp_bar.x / 2); rect.y = (int)(position.y - size.y / 2 - size_hp_bar.y - offset_y); - rect.w = (int)size_hp_bar.x * (hp / max_hp); + rect.w = (int)(size_hp_bar.x * (hp / max_hp)); rect.h = (int)size_hp_bar.y; SDL_SetRenderDrawColor(renderer, color_content.r, color_content.g, color_content.b, color_content.a); SDL_RenderFillRect(renderer, &rect); @@ -159,7 +159,7 @@ public: void make_invalid() { - is_valid = true; + is_valid = false; } double get_hp()const @@ -216,7 +216,7 @@ public: if (route->get_idx_list().size() == 1) return 1; - return (double)idx_target / route->get_idx_list().size() - 1; + return (double)idx_target / (route->get_idx_list().size() - 1); } protected: Vector2 size; @@ -285,8 +285,8 @@ private: if (idx_target < idx_list.size()) { const SDL_Point& point = idx_list[idx_target]; - static const SDL_Rect& rect_tile_map = ConfigManager::instance()->rect_tile_map; + position.x = rect_tile_map.x + point.x * SIZE_TILE + SIZE_TILE / 2; position.y = rect_tile_map.y + point.y * SIZE_TILE + SIZE_TILE / 2; } diff --git a/TdGame/TdGame/enemy_manager.h b/TdGame/TdGame/enemy_manager.h index 8726050..93b45d6 100644 --- a/TdGame/TdGame/enemy_manager.h +++ b/TdGame/TdGame/enemy_manager.h @@ -5,8 +5,12 @@ #include "enemy.h" #include "manager.h" #include "config_manager.h" -#include "Vector2.h" #include "home_manager.h" +#include "slime_enemy.h" +#include "king_slime_enemy.h" +#include "skeleton_enemy.h" +#include "goblin_enemy.h" +#include "goblin_priest_enemy.h" #include #include @@ -17,6 +21,7 @@ class EnemyManager: public Manager friend class Manager; public: + //:vector typedef std::vector EnemyList; public: @@ -38,8 +43,89 @@ public: enemy->on_render(renderer); } + /* + + param2:ɵ + */ + void spawn_enemy(EnemyType type, int idx_spawn_point) + { + static Vector2 position; + static const SDL_Rect& rect_tile_map = ConfigManager::instance()->rect_tile_map; + + //ȡ· + static const Map::SpawnerRoutePool& spawner_route_pool + = ConfigManager::instance()->map.get_idx_spawner_pool(); + + /* + * صδҵ򷵻һԪصһλ + */ + const auto& iter = spawner_route_pool.find(idx_spawn_point); + if(iter == spawner_route_pool.end()) + return; + + Enemy* enemy = nullptr; + + switch (type) + { + case EnemyType::Slime: + enemy = new SlimeEnemy(); + break; + case EnemyType::KingSlime: + enemy = new KingSlimeEnemy(); + break; + case EnemyType::Skeleton: + enemy = new SkeletonEnemy(); + break; + case EnemyType::Goblin: + enemy = new GoblinEnemy(); + break; + case EnemyType::GoblinPriest: + enemy = new GoblinPriestEnemy(); + break; + default: + enemy = new SlimeEnemy(); + break; + } + + //ͷ + enemy->set_on_skill_released + ( + [&](Enemy* enemy_src) + { + double revocer_radius = enemy_src->get_recover_radius(); + if (revocer_radius < 0) return; + + const Vector2 pos_src = enemy_src->get_position(); + for (Enemy* enemy_dst : enemy_list) + { + const Vector2& pos_dst = enemy_dst->get_position(); + double distance = (pos_dst - pos_src).length(); + if (distance <= revocer_radius) + enemy_dst->increase_hp(enemy_src->get_recover_intensity()); + } + } + ); + + //Ѱ· + const Route::IdxList& idx_list = iter->second.get_idx_list(); + position.x = rect_tile_map.x + idx_list[0].x * SIZE_TILE + SIZE_TILE / 2; + position.y = rect_tile_map.y + idx_list[0].y * SIZE_TILE + SIZE_TILE / 2; + + enemy->set_position(position); + enemy->set_route(&iter->second); + + enemy_list.push_back(enemy); + + } + + bool check_cleared() + { + return enemy_list.empty(); + } + protected: EnemyManager() = default; + ~EnemyManager() { for (Enemy* enemy : enemy_list) @@ -64,9 +150,10 @@ private: for (Enemy* enemy : enemy_list) { - if (enemy->can_remove())continue; + 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 @@ -75,7 +162,6 @@ private: enemy->make_invalid(); HomeManager::instance()->decrease_hp(enemy->get_damage()); - } } } @@ -91,7 +177,7 @@ private: [](const Enemy* enemy) { bool deletable = enemy->can_remove(); - if (deletable) delete(enemy); + if (deletable) delete enemy; return deletable; }), enemy_list.end()); } diff --git a/TdGame/TdGame/game_manager.h b/TdGame/TdGame/game_manager.h index 1791923..ea40b04 100644 --- a/TdGame/TdGame/game_manager.h +++ b/TdGame/TdGame/game_manager.h @@ -5,6 +5,8 @@ #include "manager.h" #include "config_manager.h" #include "resources_manager.h" +#include "enemy_manager.h" +#include "wave_manager.h" #include #include @@ -33,7 +35,7 @@ public: double delta = (double)(current_counter - last_counter) / counter_freq; last_counter = current_counter; if (delta * 1000 < 1000.0 / 60) - SDL_Delay(Uint32(1000.0 / 60 - delta * 1000)); + SDL_Delay((Uint32)(1000.0 / 60 - delta * 1000)); // on_update(delta); @@ -119,7 +121,15 @@ private: void on_update(double delta) { + static ConfigManager* instance = ConfigManager::instance(); + if (!instance->is_game_over) + { + WaveManager::instance()->on_update(delta); + EnemyManager::instance()->on_update(delta); + + return; + } } void on_render() @@ -127,6 +137,8 @@ private: static ConfigManager* instance = ConfigManager::instance(); static SDL_Rect& rect_dst = instance->rect_tile_map; SDL_RenderCopy(renderer, tex_tile_map, nullptr, &rect_dst); + + EnemyManager::instance()->on_render(renderer); } bool generate_tile_map_texture() @@ -145,7 +157,7 @@ private: width_tex_tile_map = (int)map.get_width() * SIZE_TILE; height_tex_tile_map = (int)map.get_height() * SIZE_TILE; - //˵ԱrendererƣҸʽǵڶ + //˵ԱrendererƣҸʽǵڶ,ɵͼ tex_tile_map = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_TARGET, width_tex_tile_map, height_tex_tile_map); if (!tex_tile_map)return false; diff --git a/TdGame/TdGame/goblin_enemy.h b/TdGame/TdGame/goblin_enemy.h index 5abdf2a..413f77f 100644 --- a/TdGame/TdGame/goblin_enemy.h +++ b/TdGame/TdGame/goblin_enemy.h @@ -20,40 +20,39 @@ public: static ConfigManager::EnemyTemplate& goblin_template = ConfigManager::instance()->goblin_template; - static const std::vector idx_list_up = { 6,7,8,9,10,11 }; - static const std::vector idx_list_down = { 0,1,2,3,4,5 }; - static const std::vector idx_list_left = { 18,19,20,21,22,23 }; - static const std::vector idx_list_right = { 12,13,14,15,16,17 }; + static const std::vector idx_list_up = { 5, 6, 7, 8, 9 }; + static const std::vector idx_list_down = { 0, 1, 2, 3, 4 }; + static const std::vector idx_list_left = { 15, 16, 17, 18, 19 }; + static const std::vector idx_list_right = { 10, 11, 12, 13, 14 }; - 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.set_loop(true); anim_up.set_interval(0.15); + anim_up.set_frame_data(tex_goblin, 5, 4, idx_list_up); + anim_down.set_loop(true); anim_down.set_interval(0.15); + anim_down.set_frame_data(tex_goblin, 5, 4, idx_list_down); + anim_left.set_loop(true); anim_left.set_interval(0.15); + anim_left.set_frame_data(tex_goblin, 5, 4, idx_list_left); + anim_right.set_loop(true); anim_right.set_interval(0.15); + anim_right.set_frame_data(tex_goblin, 5, 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); + anim_up_sketch.set_loop(true); anim_up_sketch.set_interval(0.15); + anim_up_sketch.set_frame_data(tex_goblin_sketch, 5, 4, idx_list_up); + anim_down_sketch.set_loop(true); anim_down_sketch.set_interval(0.15); + anim_down_sketch.set_frame_data(tex_goblin_sketch, 5, 4, idx_list_down); + anim_left_sketch.set_loop(true); anim_left_sketch.set_interval(0.15); + anim_left_sketch.set_frame_data(tex_goblin_sketch, 5, 4, idx_list_left); + anim_right_sketch.set_loop(true); anim_right_sketch.set_interval(0.15); + anim_right_sketch.set_frame_data(tex_goblin_sketch, 5, 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; + max_hp = goblin_template.hp; + max_speed = goblin_template.speed; + damage = goblin_template.damage; + reward_ratio = goblin_template.reward_ratio; + recover_interval = goblin_template.recover_interval; + recover_range = goblin_template.recover_range; + recover_intensity = goblin_template.recover_intensity; size.x = 48, size.y = 48; - hp = max_hp; - speed = max_speed; + hp = max_hp,speed = max_speed; } ~GoblinEnemy() = default; diff --git a/TdGame/TdGame/goblin_priest_enemy.h b/TdGame/TdGame/goblin_priest_enemy.h index a87e369..1c98f2d 100644 --- a/TdGame/TdGame/goblin_priest_enemy.h +++ b/TdGame/TdGame/goblin_priest_enemy.h @@ -21,28 +21,28 @@ public: static ConfigManager::EnemyTemplate& goblin_priest_template = ConfigManager::instance()->goblin_priest_template; - static const std::vector idx_list_up = { 6,7,8,9,10,11 }; - static const std::vector idx_list_down = { 0,1,2,3,4,5 }; - static const std::vector idx_list_left = { 18,19,20,21,22,23 }; - static const std::vector idx_list_right = { 12,13,14,15,16,17 }; + static const std::vector idx_list_up = { 5, 6, 7, 8, 9 }; + static const std::vector idx_list_down = { 0, 1, 2, 3, 4 }; + static const std::vector idx_list_left = { 15, 16, 17, 18, 19 }; + static const std::vector idx_list_right = { 10, 11, 12, 13, 14 }; - 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.set_loop(true); anim_up.set_interval(0.15); + anim_up.set_frame_data(tex_goblin_priest, 5, 4, idx_list_up); + anim_down.set_loop(true); anim_down.set_interval(0.15); + anim_down.set_frame_data(tex_goblin_priest, 5, 4, idx_list_down); + anim_left.set_loop(true); anim_left.set_interval(0.15); + anim_left.set_frame_data(tex_goblin_priest, 5, 4, idx_list_left); + anim_right.set_loop(true); anim_right.set_interval(0.15); + anim_right.set_frame_data(tex_goblin_priest, 5, 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); + anim_up_sketch.set_loop(true); anim_up_sketch.set_interval(0.15); + anim_up_sketch.set_frame_data(tex_goblin_priest_sketch, 5, 4, idx_list_up); + anim_down_sketch.set_loop(true); anim_down_sketch.set_interval(0.15); + anim_down_sketch.set_frame_data(tex_goblin_priest_sketch, 5, 4, idx_list_down); + anim_left_sketch.set_loop(true); anim_left_sketch.set_interval(0.15); + anim_left_sketch.set_frame_data(tex_goblin_priest_sketch, 5, 4, idx_list_left); + anim_right_sketch.set_loop(true); anim_right_sketch.set_interval(0.15); + anim_right_sketch.set_frame_data(tex_goblin_priest_sketch, 5, 4, idx_list_right); max_hp = goblin_priest_template.hp; max_speed = goblin_priest_template.speed; @@ -53,8 +53,7 @@ public: recover_intensity = goblin_priest_template.recover_intensity; size.x = 48, size.y = 48; - hp = max_hp; - speed = max_speed; + hp = max_hp,speed = max_speed; } ~GoblinPriestEnemy() = default; diff --git a/TdGame/TdGame/king_slime_enemy.h b/TdGame/TdGame/king_slime_enemy.h index b47dd78..107a4e7 100644 --- a/TdGame/TdGame/king_slime_enemy.h +++ b/TdGame/TdGame/king_slime_enemy.h @@ -20,10 +20,10 @@ public: static ConfigManager::EnemyTemplate& king_slime_template = ConfigManager::instance()->king_slime_template; - static const std::vector idx_list_up = { 6,7,8,9,10,11 }; - static const std::vector idx_list_down = { 0,1,2,3,4,5 }; - static const std::vector idx_list_left = { 18,19,20,21,22,23 }; - static const std::vector idx_list_right = { 12,13,14,15,16,17 }; + static const std::vector idx_list_up = { 18, 19, 20, 21, 22, 23 }; + static const std::vector idx_list_down = { 0, 1, 2, 3, 4, 5 }; + static const std::vector idx_list_left = { 6, 7, 8, 9, 10, 11 }; + static const std::vector 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); @@ -38,8 +38,8 @@ public: 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_left_sketch.set_loop(true); anim_left_sketch.set_interval(0.1); + anim_left_sketch.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); @@ -52,8 +52,7 @@ public: recover_intensity = king_slime_template.recover_intensity; size.x = 48, size.y = 48; - hp = max_hp; - speed = max_speed; + hp = max_hp,speed = max_speed; } ~KingSlimeEnemy() = default; diff --git a/TdGame/TdGame/main.cpp b/TdGame/TdGame/main.cpp index 6bb54ee..37a231f 100644 --- a/TdGame/TdGame/main.cpp +++ b/TdGame/TdGame/main.cpp @@ -1,7 +1,6 @@ #define SDL_MAIN_HANDLED #include - #include "game_manager.h" diff --git a/TdGame/TdGame/map.h b/TdGame/TdGame/map.h index 709ae26..f114fbc 100644 --- a/TdGame/TdGame/map.h +++ b/TdGame/TdGame/map.h @@ -47,7 +47,7 @@ public: tile_map_temp[idx_y].emplace_back();//idx_yƬ Tile& tile = tile_map_temp[idx_y].back();//ȡƬ,Ա - load_tile_from_string(tile,str_tile); + load_tile_from_string(tile, str_tile); } } @@ -64,8 +64,6 @@ public: return true; } - - size_t get_width() const //constڽ޸ { if (tile_map.empty()) diff --git a/TdGame/TdGame/skeleton_enemy.h b/TdGame/TdGame/skeleton_enemy.h index aafdeaa..dc7f8e9 100644 --- a/TdGame/TdGame/skeleton_enemy.h +++ b/TdGame/TdGame/skeleton_enemy.h @@ -20,28 +20,28 @@ public: static ConfigManager::EnemyTemplate& skeleton_template = ConfigManager::instance()->skeleton_template; //жĶ֡resourceskeletonԴͼ - static const std::vector idx_list_up = { 6,7,8,9,10,11 }; - static const std::vector idx_list_down = { 0,1,2,3,4,5 }; - static const std::vector idx_list_left = { 18,19,20,21,22,23 }; - static const std::vector idx_list_right = { 12,13,14,15,16,17 }; + static const std::vector idx_list_up = { 5, 6, 7, 8, 9 }; + static const std::vector idx_list_down = { 0, 1, 2, 3, 4 }; + static const std::vector idx_list_left = { 15, 16, 17, 18, 19 }; + static const std::vector idx_list_right = { 10, 11, 12, 13, 14 }; - anim_up.set_loop(true); anim_up.set_interval(0.1); + anim_up.set_loop(true); anim_up.set_interval(0.15); 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_loop(true); anim_down.set_interval(0.15); 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_loop(true); anim_left.set_interval(0.15); 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_loop(true); anim_right.set_interval(0.15); 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); + anim_up_sketch.set_loop(true); anim_up_sketch.set_interval(0.15); + anim_up_sketch.set_frame_data(tex_skeleton_sketch, 5, 4, idx_list_up); + anim_down_sketch.set_loop(true); anim_down_sketch.set_interval(0.15); + anim_down_sketch.set_frame_data(tex_skeleton_sketch, 5, 4, idx_list_down); + anim_left_sketch.set_loop(true); anim_left_sketch.set_interval(0.15); + anim_left_sketch.set_frame_data(tex_skeleton_sketch, 5, 4, idx_list_left); + anim_right_sketch.set_loop(true); anim_right_sketch.set_interval(0.15); + anim_right_sketch.set_frame_data(tex_skeleton_sketch, 5, 4, idx_list_right); max_hp = skeleton_template.hp; max_speed = skeleton_template.speed; @@ -52,8 +52,7 @@ public: recover_intensity = skeleton_template.recover_intensity; size.x = 48, size.y = 48; - hp = max_hp; - speed = max_speed; + hp = max_hp,speed = max_speed; } ~SkeletonEnemy() = default; diff --git a/TdGame/TdGame/slime_enemy.h b/TdGame/TdGame/slime_enemy.h index 7949f43..afd15a1 100644 --- a/TdGame/TdGame/slime_enemy.h +++ b/TdGame/TdGame/slime_enemy.h @@ -38,8 +38,8 @@ public: 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_left_sketch.set_loop(true); anim_left_sketch.set_interval(0.1); + anim_left_sketch.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); @@ -52,11 +52,9 @@ public: recover_intensity = slime_template.recover_intensity; size.x = 48, size.y = 48; - hp = max_hp; - speed = max_speed; + hp = max_hp, speed = max_speed; } ~SlimeEnemy() = default; - }; diff --git a/TdGame/TdGame/timer.h b/TdGame/TdGame/timer.h index fd1c9d2..5bc1b26 100644 --- a/TdGame/TdGame/timer.h +++ b/TdGame/TdGame/timer.h @@ -45,6 +45,7 @@ public: void on_update(double delta) { if (paused) return; + pass_time += delta; if (pass_time >= wait_time) { @@ -73,5 +74,4 @@ private: std::function on_timeout; }; - #endif \ No newline at end of file diff --git a/TdGame/TdGame/wave.h b/TdGame/TdGame/wave.h index 4537d93..349ee68 100644 --- a/TdGame/TdGame/wave.h +++ b/TdGame/TdGame/wave.h @@ -13,7 +13,7 @@ struct Wave { double interval = 0; int spawn_point = 1; - EnemyType enemy_type = EnemyType::Slime;//level.jsonļмʽ,ļ + EnemyType enemy_type = EnemyType::Goblin;//level.jsonļмʽ,ļ }; double rewards = 0; diff --git a/TdGame/TdGame/wave_manager.h b/TdGame/TdGame/wave_manager.h new file mode 100644 index 0000000..74a037d --- /dev/null +++ b/TdGame/TdGame/wave_manager.h @@ -0,0 +1,110 @@ +#ifndef _WAVE_MANAGER_H +#define _WAVE_MANAGER_H + +#include"timer.h" +#include "manager.h" +#include "config_manager.h" +#include "enemy_manager.h" +#include "coin_manager.h" + +class WaveManager : public Manager +{ + friend class Manager; + +public: + void on_update(double delta) + { + static ConfigManager* instance = ConfigManager::instance(); + + if (instance->is_game_over) + return; + + if (!is_wave_started) + timer_start_wave.on_update(delta); + else + timer_spawn_enemy.on_update(delta); + + //һѾ&&бΪ + if (is_spawned_last_enemy && EnemyManager::instance()->check_cleared()) + { + CoinManager::instance()->increase_coin(instance->wave_list[idx_wave].rewards); + + idx_wave++; + + //һ + if (idx_wave >= instance->wave_list.size()) + { + instance->is_game_win = true; + instance->is_game_over = true; + } + else + { + idx_spawn_event = 0; + is_wave_started = true; + is_spawned_last_enemy = false; + + const Wave& wave = instance->wave_list[idx_wave]; + timer_start_wave.set_wait_time(wave.interval); + timer_start_wave.restart(); + } + } + } + +protected: + WaveManager() + { + static const std::vector& wave_list = ConfigManager::instance()->wave_list; + + timer_start_wave.set_one_shot(true); + timer_start_wave.set_wait_time(wave_list[0].interval); + timer_start_wave.set_on_timeout( + [&]() + { + is_wave_started = true; + timer_spawn_enemy.set_wait_time(wave_list[idx_wave].spawn_event_list[0].interval); + timer_spawn_enemy.restart(); + } + ); + + timer_spawn_enemy.set_one_shot(true); + timer_spawn_enemy.set_on_timeout( + [&]() + { + const std::vector& spawn_event_list = wave_list[idx_wave].spawn_event_list; + const Wave::SpawnEvent& spawn_event = spawn_event_list[idx_spawn_event]; + + EnemyManager::instance()->spawn_enemy(spawn_event.enemy_type, spawn_event.spawn_point); + + idx_spawn_event++; + + if (idx_spawn_event >= spawn_event_list.size()) + { + is_spawned_last_enemy = true; + return; + } + + timer_spawn_enemy.set_wait_time(spawn_event_list[idx_spawn_event].interval); + timer_spawn_enemy.restart(); + } + ); + } + + ~WaveManager() = default; + +private: + // + int idx_wave = 0; + //¼Σһкܶ + int idx_spawn_event = 0; + //һʼʱ + Timer timer_start_wave; + //ɼʱ + Timer timer_spawn_enemy; + //Ƿʼ + bool is_wave_started = false; + //Ƿһ + bool is_spawned_last_enemy = false; + +}; + +#endif \ No newline at end of file