feat: 瓦片地图渲染功能实现
This commit is contained in:
parent
23bf583942
commit
bb26c1af32
@ -120,6 +120,7 @@
|
|||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
<AdditionalIncludeDirectories>..\ThirdParty\cJSON\include;..\ThirdParty\SDL2\include;..\ThirdParty\SDL2_gfx\include;..\ThirdParty\SDL2_image\include;..\ThirdParty\SDL2_mixer\include;..\ThirdParty\SDL2_ttf\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\ThirdParty\cJSON\include;..\ThirdParty\SDL2\include;..\ThirdParty\SDL2_gfx\include;..\ThirdParty\SDL2_image\include;..\ThirdParty\SDL2_mixer\include;..\ThirdParty\SDL2_ttf\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -131,6 +132,7 @@
|
|||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\ThirdParty\cJSON\cJSON.c" />
|
||||||
<ClCompile Include="main.cpp" />
|
<ClCompile Include="main.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -19,11 +19,17 @@
|
|||||||
<Filter Include="头文件\enemy">
|
<Filter Include="头文件\enemy">
|
||||||
<UniqueIdentifier>{d16b420a-6329-4705-af2a-57caf4eee0e9}</UniqueIdentifier>
|
<UniqueIdentifier>{d16b420a-6329-4705-af2a-57caf4eee0e9}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="源文件\cJSON">
|
||||||
|
<UniqueIdentifier>{26456ec2-6d40-4a7f-9935-8248edc2bef2}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="main.cpp">
|
<ClCompile Include="main.cpp">
|
||||||
<Filter>源文件</Filter>
|
<Filter>源文件</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\ThirdParty\cJSON\cJSON.c">
|
||||||
|
<Filter>源文件\cJSON</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="game_manager.h">
|
<ClInclude Include="game_manager.h">
|
||||||
|
@ -90,6 +90,7 @@ public:
|
|||||||
bool load_level_config(const std::string& path)
|
bool load_level_config(const std::string& path)
|
||||||
{
|
{
|
||||||
std::ifstream file(path);
|
std::ifstream file(path);
|
||||||
|
|
||||||
if (!file.good())return false;
|
if (!file.good())return false;
|
||||||
|
|
||||||
std::stringstream str_stream;
|
std::stringstream str_stream;
|
||||||
@ -97,8 +98,8 @@ public:
|
|||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
cJSON* json_root = cJSON_Parse(str_stream.str().c_str());
|
cJSON* json_root = cJSON_Parse(str_stream.str().c_str());
|
||||||
|
|
||||||
if (!json_root) return false;//解析失败
|
if (!json_root) return false;//解析失败
|
||||||
|
|
||||||
if (json_root->type != cJSON_Array)//解析成功,但非数组类型
|
if (json_root->type != cJSON_Array)//解析成功,但非数组类型
|
||||||
{
|
{
|
||||||
cJSON_Delete(json_root);
|
cJSON_Delete(json_root);
|
||||||
@ -108,7 +109,7 @@ public:
|
|||||||
cJSON* json_wave = nullptr;
|
cJSON* json_wave = nullptr;
|
||||||
cJSON_ArrayForEach(json_wave, json_root)
|
cJSON_ArrayForEach(json_wave, json_root)
|
||||||
{
|
{
|
||||||
if (json_wave->type != cJSON_Array)
|
if (json_wave->type != cJSON_Object)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
wave_list.emplace_back();//容器末尾构造一个对象,不传参数那么调用的是定义类型的默认构造函数
|
wave_list.emplace_back();//容器末尾构造一个对象,不传参数那么调用的是定义类型的默认构造函数
|
||||||
@ -128,7 +129,7 @@ public:
|
|||||||
cJSON* json_spawn_event = nullptr;
|
cJSON* json_spawn_event = nullptr;
|
||||||
cJSON_ArrayForEach(json_spawn_event, json_wave_spawn_list)
|
cJSON_ArrayForEach(json_spawn_event, json_wave_spawn_list)
|
||||||
{
|
{
|
||||||
if (json_spawn_event->type != cJSON_Array)
|
if (json_spawn_event->type != cJSON_Object)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
wave.spawn_event_list.emplace_back();
|
wave.spawn_event_list.emplace_back();
|
||||||
@ -144,10 +145,10 @@ public:
|
|||||||
if (json_spawn_event_enemy_type && json_spawn_event_enemy_type->type == cJSON_String)
|
if (json_spawn_event_enemy_type && json_spawn_event_enemy_type->type == cJSON_String)
|
||||||
{
|
{
|
||||||
const std::string str_enemy_type = json_spawn_event_enemy_type->valuestring;
|
const std::string str_enemy_type = json_spawn_event_enemy_type->valuestring;
|
||||||
if (str_enemy_type == "Slim")
|
if (str_enemy_type == "Slime")
|
||||||
spawn_event.enemy_type = EnemyType::Slim;
|
spawn_event.enemy_type = EnemyType::Slime;
|
||||||
else if(str_enemy_type == "KingSlim")
|
else if(str_enemy_type == "KingSlime")
|
||||||
spawn_event.enemy_type = EnemyType::KingSlim;
|
spawn_event.enemy_type = EnemyType::KingSlime;
|
||||||
else if (str_enemy_type == "Skeleton")
|
else if (str_enemy_type == "Skeleton")
|
||||||
spawn_event.enemy_type = EnemyType::Skeleton;
|
spawn_event.enemy_type = EnemyType::Skeleton;
|
||||||
else if (str_enemy_type == "Goblin")
|
else if (str_enemy_type == "Goblin")
|
||||||
@ -163,6 +164,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
cJSON_Delete(json_root);
|
cJSON_Delete(json_root);
|
||||||
|
|
||||||
if (wave_list.empty())
|
if (wave_list.empty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -174,7 +176,7 @@ public:
|
|||||||
bool load_game_config(const std::string& path)
|
bool load_game_config(const std::string& path)
|
||||||
{
|
{
|
||||||
std::ifstream file(path);
|
std::ifstream file(path);
|
||||||
if (file.good()) return false;
|
if (!file.good()) return false;
|
||||||
|
|
||||||
std::stringstream str_stream;
|
std::stringstream str_stream;
|
||||||
str_stream << file.rdbuf();
|
str_stream << file.rdbuf();
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
enum class EnemyType
|
enum class EnemyType
|
||||||
{
|
{
|
||||||
Slim,
|
Slime,
|
||||||
KingSlim,
|
KingSlime,
|
||||||
Skeleton,
|
Skeleton,
|
||||||
Goblin,
|
Goblin,
|
||||||
GoblinPriest
|
GoblinPriest
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
#define _GAME_MANAGER_H_
|
#define _GAME_MANAGER_H_
|
||||||
|
|
||||||
#include "manager.h"
|
#include "manager.h"
|
||||||
|
#include "config_manager.h"
|
||||||
|
#include "resources_manager.h"
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <SDL_ttf.h>
|
#include <SDL_ttf.h>
|
||||||
@ -61,13 +63,25 @@ protected:
|
|||||||
|
|
||||||
SDL_SetHint(SDL_HINT_IME_SHOW_UI,"1");
|
SDL_SetHint(SDL_HINT_IME_SHOW_UI,"1");
|
||||||
|
|
||||||
window = SDL_CreateWindow(u8"´åׯ±£ÎÀÕ½", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_SHOWN);
|
ConfigManager* config = ConfigManager::instance();
|
||||||
|
|
||||||
|
init_assert(config->map.load("map.csv"), u8"加载游戏地图失败!");
|
||||||
|
init_assert(config->load_level_config("level.json"), u8"加载关卡配置失败!");
|
||||||
|
init_assert(config->load_game_config("config.json"), u8"加载游戏配置失败!");
|
||||||
|
|
||||||
|
window = SDL_CreateWindow(config->basic_template.window_title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
|
||||||
|
config->basic_template.window_width, config->basic_template.window_height, SDL_WINDOW_SHOWN);
|
||||||
init_assert(window, u8"创建游戏窗口失败!");
|
init_assert(window, u8"创建游戏窗口失败!");
|
||||||
|
|
||||||
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE);
|
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE);
|
||||||
init_assert(renderer, u8"创建渲染器失败!");
|
init_assert(renderer, u8"创建渲染器失败!");
|
||||||
|
|
||||||
|
init_assert(ResourcesManager::instance()->load_from_file(renderer), u8"加载游戏资源失败!");
|
||||||
|
|
||||||
|
init_assert(generate_tile_map_texture(),u8"生成瓦片地图类型失败!");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~GameManager()
|
~GameManager()
|
||||||
{
|
{
|
||||||
SDL_DestroyRenderer(renderer);
|
SDL_DestroyRenderer(renderer);
|
||||||
@ -86,6 +100,8 @@ private:
|
|||||||
SDL_Window* window = nullptr;
|
SDL_Window* window = nullptr;
|
||||||
SDL_Renderer* renderer = nullptr;
|
SDL_Renderer* renderer = nullptr;
|
||||||
|
|
||||||
|
SDL_Texture* tex_tile_map = nullptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void init_assert(bool flag, const char* err_msg)
|
void init_assert(bool flag, const char* err_msg)
|
||||||
{
|
{
|
||||||
@ -107,7 +123,94 @@ private:
|
|||||||
|
|
||||||
void on_render()
|
void on_render()
|
||||||
{
|
{
|
||||||
|
static ConfigManager* instance = ConfigManager::instance();
|
||||||
|
static SDL_Rect& rect_dst = instance->rect_tile_map;
|
||||||
|
SDL_RenderCopy(renderer, tex_tile_map, nullptr, &rect_dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool generate_tile_map_texture()
|
||||||
|
{
|
||||||
|
const Map& map = ConfigManager::instance()->map;
|
||||||
|
const TileMap& tile_map = map.get_tile_map();
|
||||||
|
SDL_Rect& rect_tile_map = ConfigManager::instance()->rect_tile_map;
|
||||||
|
SDL_Texture* tex_tile_set = ResourcesManager::instance()->get_texture_pool().find(ResID::Tex_Tileset)->second;
|
||||||
|
|
||||||
|
int width_tex_tile_set, height_tex_tile_set;
|
||||||
|
SDL_QueryTexture(tex_tile_set, nullptr, nullptr, &width_tex_tile_set, &height_tex_tile_set);//宽度和高度存储进去
|
||||||
|
int num_tile_single_line = (int)std::ceil((double)width_tex_tile_set / SIZE_TILE);//获取一行有多少单元格
|
||||||
|
|
||||||
|
//计算整张图的纹理宽高
|
||||||
|
int width_tex_tile_map, height_tex_tile_map;
|
||||||
|
width_tex_tile_map = (int)map.get_width() * SIZE_TILE;
|
||||||
|
height_tex_tile_map = (int)map.get_height() * SIZE_TILE;
|
||||||
|
|
||||||
|
//第三个参数说明这张纹理可以被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;
|
||||||
|
|
||||||
|
//根据生成的图片调整rect_tile_map
|
||||||
|
ConfigManager* config = ConfigManager::instance();
|
||||||
|
rect_tile_map.x = (config->basic_template.window_width - width_tex_tile_map) / 2;//左上角顶点坐标,因为希望画面是在窗口中间!!
|
||||||
|
rect_tile_map.y = (config->basic_template.window_height - height_tex_tile_map) / 2;
|
||||||
|
rect_tile_map.w = width_tex_tile_map;
|
||||||
|
rect_tile_map.h = height_tex_tile_map;//后期渲染目标react设置完成;
|
||||||
|
|
||||||
|
//设置纹理的混合模式
|
||||||
|
SDL_SetTextureBlendMode(tex_tile_map, SDL_BLENDMODE_BLEND);
|
||||||
|
SDL_SetRenderTarget(renderer, tex_tile_map);
|
||||||
|
|
||||||
|
for (int y = 0; y < map.get_height(); y++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < map.get_width(); x++)
|
||||||
|
{
|
||||||
|
//源素材矩形
|
||||||
|
SDL_Rect rect_src;
|
||||||
|
const Tile& tile = tile_map[y][x];
|
||||||
|
|
||||||
|
//目标位置矩形
|
||||||
|
const SDL_Rect& rect_dst =
|
||||||
|
{
|
||||||
|
x * SIZE_TILE,y * SIZE_TILE, //x,y坐标
|
||||||
|
SIZE_TILE,SIZE_TILE //宽高
|
||||||
|
};
|
||||||
|
|
||||||
|
//求需要裁剪的素材块
|
||||||
|
rect_src =
|
||||||
|
{
|
||||||
|
(tile.terrian % num_tile_single_line) * SIZE_TILE,//设计规则是这样的
|
||||||
|
(tile.terrian / num_tile_single_line) * SIZE_TILE,
|
||||||
|
SIZE_TILE,SIZE_TILE
|
||||||
|
};
|
||||||
|
SDL_RenderCopy(renderer, tex_tile_set, &rect_src, &rect_dst);//地形层结束
|
||||||
|
|
||||||
|
//判断装饰物层是否有
|
||||||
|
if (tile.decoration >= 0)
|
||||||
|
{
|
||||||
|
rect_src =
|
||||||
|
{
|
||||||
|
(tile.decoration % num_tile_single_line) * SIZE_TILE,
|
||||||
|
(tile.decoration / num_tile_single_line) * SIZE_TILE,
|
||||||
|
SIZE_TILE,SIZE_TILE
|
||||||
|
};
|
||||||
|
SDL_RenderCopy(renderer, tex_tile_set, &rect_src, &rect_dst);//装饰物层结束
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//防守目标(屋子)
|
||||||
|
const SDL_Point& idx_home = map.get_idx_home();
|
||||||
|
const SDL_Rect& rect_dst =
|
||||||
|
{
|
||||||
|
idx_home.x * SIZE_TILE, idx_home.y * SIZE_TILE,
|
||||||
|
SIZE_TILE,SIZE_TILE
|
||||||
|
};
|
||||||
|
SDL_RenderCopy(renderer, ResourcesManager::instance()->get_texture_pool().find(ResID::Tex_Home)->second, nullptr, &rect_dst);
|
||||||
|
|
||||||
|
//一定要设置回空
|
||||||
|
SDL_SetRenderTarget(renderer, nullptr);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4,11 +4,11 @@
|
|||||||
"spawn_list": [{
|
"spawn_list": [{
|
||||||
"interval": 1,
|
"interval": 1,
|
||||||
"point": 1,
|
"point": 1,
|
||||||
"enemy": "Slim"
|
"enemy": "Slime"
|
||||||
}, {
|
}, {
|
||||||
"interval": 1,
|
"interval": 1,
|
||||||
"point": 2,
|
"point": 2,
|
||||||
"enemy": "KingSlim"
|
"enemy": "KingSlime"
|
||||||
}, {
|
}, {
|
||||||
"interval": 1,
|
"interval": 1,
|
||||||
"point": 1,
|
"point": 1,
|
||||||
@ -28,7 +28,7 @@
|
|||||||
"spawn_list": [{
|
"spawn_list": [{
|
||||||
"interval": 3,
|
"interval": 3,
|
||||||
"point": 2,
|
"point": 2,
|
||||||
"enemy": "KingSlim"
|
"enemy": "KingSlime"
|
||||||
}]
|
}]
|
||||||
}]
|
}]
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ public:
|
|||||||
std::string str_line;
|
std::string str_line;
|
||||||
while (std::getline(file, str_line))
|
while (std::getline(file, str_line))
|
||||||
{
|
{
|
||||||
str_line = trim_str(str_line);
|
str_line = trim_str(str_line);//去除两端空白字符串,自定义函数
|
||||||
if (str_line.empty())
|
if (str_line.empty())
|
||||||
continue;
|
continue;
|
||||||
//如果不为空,则进入下一行,将idx_x置-1
|
//如果不为空,则进入下一行,将idx_x置-1
|
||||||
@ -45,7 +45,7 @@ public:
|
|||||||
{
|
{
|
||||||
idx_x++;//将idx_x++去右边下一个瓦片,
|
idx_x++;//将idx_x++去右边下一个瓦片,
|
||||||
tile_map_temp[idx_y].emplace_back();//在idx_y行中添加新瓦片
|
tile_map_temp[idx_y].emplace_back();//在idx_y行中添加新瓦片
|
||||||
Tile& tile = tile_map_temp[idx_y].back();//获取对新增瓦片的引用 Tile& tile = tile_map_temp[idx_y].back() 以便后续操作。
|
Tile& tile = tile_map_temp[idx_y].back();//获取对新增瓦片的引用,以便后续操作。
|
||||||
|
|
||||||
load_tile_from_string(tile,str_tile);
|
load_tile_from_string(tile,str_tile);
|
||||||
}
|
}
|
||||||
@ -162,8 +162,8 @@ private:
|
|||||||
|
|
||||||
if (tile.special_flag == 0)//代表是房屋,其余1234是刷怪点
|
if (tile.special_flag == 0)//代表是房屋,其余1234是刷怪点
|
||||||
{
|
{
|
||||||
idx_home.x == x;
|
idx_home.x = x;
|
||||||
idx_home.y == y;
|
idx_home.y = y;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#pragma once
|
||||||
#ifndef _RESOURCES_MANAGER_H_
|
#ifndef _RESOURCES_MANAGER_H_
|
||||||
#define _RESOURCES_MANAGER_H_
|
#define _RESOURCES_MANAGER_H_
|
||||||
|
|
||||||
@ -116,13 +117,13 @@ public:
|
|||||||
texture_pool[ResID::Tex_Slime] = IMG_LoadTexture(renderer, "resources/enemy_slime.png");
|
texture_pool[ResID::Tex_Slime] = IMG_LoadTexture(renderer, "resources/enemy_slime.png");
|
||||||
texture_pool[ResID::Tex_KingSlime] = IMG_LoadTexture(renderer, "resources/enemy_king_slime.png");
|
texture_pool[ResID::Tex_KingSlime] = IMG_LoadTexture(renderer, "resources/enemy_king_slime.png");
|
||||||
texture_pool[ResID::Tex_Skeleton] = IMG_LoadTexture(renderer, "resources/enemy_skeleton.png");
|
texture_pool[ResID::Tex_Skeleton] = IMG_LoadTexture(renderer, "resources/enemy_skeleton.png");
|
||||||
texture_pool[ResID::Tex_Goblin] = IMG_LoadTexture(renderer, "resources/enenmy_goblin.png");
|
texture_pool[ResID::Tex_Goblin] = IMG_LoadTexture(renderer, "resources/enemy_goblin.png");
|
||||||
texture_pool[ResID::Tex_GoblinPriest] = IMG_LoadTexture(renderer, "resources/enenmy_goblin_priest.png");
|
texture_pool[ResID::Tex_GoblinPriest] = IMG_LoadTexture(renderer, "resources/enemy_goblin_priest.png");
|
||||||
texture_pool[ResID::Tex_SlimeSketch] = IMG_LoadTexture(renderer, "resources/enenmy_slime_sketch.png");
|
texture_pool[ResID::Tex_SlimeSketch] = IMG_LoadTexture(renderer, "resources/enemy_slime_sketch.png");
|
||||||
texture_pool[ResID::Tex_KingSlimeSketch] = IMG_LoadTexture(renderer, "resources/enenmy_king_slime_sketch.png");
|
texture_pool[ResID::Tex_KingSlimeSketch] = IMG_LoadTexture(renderer, "resources/enemy_king_slime_sketch.png");
|
||||||
texture_pool[ResID::Tex_SkeletonSketch] = IMG_LoadTexture(renderer, "resources/enenmy_skeleton_sketch.png");
|
texture_pool[ResID::Tex_SkeletonSketch] = IMG_LoadTexture(renderer, "resources/enemy_skeleton_sketch.png");
|
||||||
texture_pool[ResID::Tex_GoblinSketch] = IMG_LoadTexture(renderer, "resources/enenmy_goblin_sketch.png");
|
texture_pool[ResID::Tex_GoblinSketch] = IMG_LoadTexture(renderer, "resources/enemy_goblin_sketch.png");
|
||||||
texture_pool[ResID::Tex_GoblinPriestSketch] = IMG_LoadTexture(renderer, "resources/enenmy_goblin_priest_sketch.png");
|
texture_pool[ResID::Tex_GoblinPriestSketch] = IMG_LoadTexture(renderer, "resources/enemy_goblin_priest_sketch.png");
|
||||||
|
|
||||||
texture_pool[ResID::Tex_BulletArrow] = IMG_LoadTexture(renderer, "resources/bullet_arrow.png");
|
texture_pool[ResID::Tex_BulletArrow] = IMG_LoadTexture(renderer, "resources/bullet_arrow.png");
|
||||||
texture_pool[ResID::Tex_BulletAxe] = IMG_LoadTexture(renderer, "resources/bullet_axe.png");
|
texture_pool[ResID::Tex_BulletAxe] = IMG_LoadTexture(renderer, "resources/bullet_axe.png");
|
||||||
@ -198,7 +199,6 @@ public:
|
|||||||
if (!pair.second) return false;
|
if (!pair.second) return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const FontPool& get_font_pool()
|
const FontPool& get_font_pool()
|
||||||
|
@ -16,7 +16,7 @@ public:
|
|||||||
Route() = default;
|
Route() = default;
|
||||||
|
|
||||||
//有参构造函数
|
//有参构造函数
|
||||||
Route(const TileMap& map,SDL_Point& idx_origin)
|
Route(const TileMap& map,const SDL_Point& idx_origin)
|
||||||
{
|
{
|
||||||
size_t width_map = map[0].size();
|
size_t width_map = map[0].size();
|
||||||
size_t height_map = map.size();
|
size_t height_map = map.size();
|
||||||
@ -83,4 +83,5 @@ private:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#define SIZE_TILE = 48
|
#define SIZE_TILE 48
|
||||||
|
|
||||||
//只有数据没有方法,结构体比较好
|
//只有数据没有方法,结构体比较好
|
||||||
struct Tile
|
struct Tile
|
||||||
|
@ -13,7 +13,7 @@ struct Wave
|
|||||||
{
|
{
|
||||||
double interval = 0;
|
double interval = 0;
|
||||||
int spawn_point = 1;
|
int spawn_point = 1;
|
||||||
EnemyType enemy_type = EnemyType::Slim;//在level.json文件中见格式,波次序列配置文件
|
EnemyType enemy_type = EnemyType::Slime;//在level.json文件中见格式,波次序列配置文件
|
||||||
};
|
};
|
||||||
|
|
||||||
double rewards = 0;
|
double rewards = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user