diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..c3ea527
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,43 @@
+# 标题
+cmake_minimum_required(VERSION 3.10.0)
+project(SunnyLand VERSION 0.1.0 LANGUAGES C CXX)
+
+# 设置C++标准
+set(CMAKE_CXX_STANDARD 20)
+set(CMAKE_CXX_STANDARD_REQUIRED True)
+
+# 设置编译选项
+if (MSVC)
+ add_compile_options(/W4)
+else()
+ add_compile_options(-Wall -Wextra -Wpedantic)
+endif()
+
+# 设置编译输出目录
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR})
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR})
+
+set(TARGET ${PROJECT_NAME}-${CMAKE_SYSTEM_NAME})
+
+# 查找并载入Cmake预设
+find_package(SDL3 REQUIRED)
+find_package(SDL3_image REQUIRED)
+find_package(SDL3_mixer REQUIRED)
+find_package(SDL3_ttf REQUIRED)
+find_package(glm REQUIRED)
+find_package(nlohmann_json REQUIRED)
+find_package(spdlog REQUIRED)
+
+# 添加可执行文件
+add_executable(${TARGET} main.cpp)
+
+# 链接库
+target_link_libraries(${TARGET}
+ ${SDL3_LIBRARIES}
+ SDL3_image::SDL3_image
+ SDL3_mixer::SDL3_mixer
+ SDL3_ttf::SDL3_ttf
+ glm::glm
+ nlohmann_json::nlohmann_json
+ spdlog::spdlog
+ )
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 0e259d4..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,121 +0,0 @@
-Creative Commons Legal Code
-
-CC0 1.0 Universal
-
- CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
- LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
- ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
- INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
- REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
- PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
- THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
- HEREUNDER.
-
-Statement of Purpose
-
-The laws of most jurisdictions throughout the world automatically confer
-exclusive Copyright and Related Rights (defined below) upon the creator
-and subsequent owner(s) (each and all, an "owner") of an original work of
-authorship and/or a database (each, a "Work").
-
-Certain owners wish to permanently relinquish those rights to a Work for
-the purpose of contributing to a commons of creative, cultural and
-scientific works ("Commons") that the public can reliably and without fear
-of later claims of infringement build upon, modify, incorporate in other
-works, reuse and redistribute as freely as possible in any form whatsoever
-and for any purposes, including without limitation commercial purposes.
-These owners may contribute to the Commons to promote the ideal of a free
-culture and the further production of creative, cultural and scientific
-works, or to gain reputation or greater distribution for their Work in
-part through the use and efforts of others.
-
-For these and/or other purposes and motivations, and without any
-expectation of additional consideration or compensation, the person
-associating CC0 with a Work (the "Affirmer"), to the extent that he or she
-is an owner of Copyright and Related Rights in the Work, voluntarily
-elects to apply CC0 to the Work and publicly distribute the Work under its
-terms, with knowledge of his or her Copyright and Related Rights in the
-Work and the meaning and intended legal effect of CC0 on those rights.
-
-1. Copyright and Related Rights. A Work made available under CC0 may be
-protected by copyright and related or neighboring rights ("Copyright and
-Related Rights"). Copyright and Related Rights include, but are not
-limited to, the following:
-
- i. the right to reproduce, adapt, distribute, perform, display,
- communicate, and translate a Work;
- ii. moral rights retained by the original author(s) and/or performer(s);
-iii. publicity and privacy rights pertaining to a person's image or
- likeness depicted in a Work;
- iv. rights protecting against unfair competition in regards to a Work,
- subject to the limitations in paragraph 4(a), below;
- v. rights protecting the extraction, dissemination, use and reuse of data
- in a Work;
- vi. database rights (such as those arising under Directive 96/9/EC of the
- European Parliament and of the Council of 11 March 1996 on the legal
- protection of databases, and under any national implementation
- thereof, including any amended or successor version of such
- directive); and
-vii. other similar, equivalent or corresponding rights throughout the
- world based on applicable law or treaty, and any national
- implementations thereof.
-
-2. Waiver. To the greatest extent permitted by, but not in contravention
-of, applicable law, Affirmer hereby overtly, fully, permanently,
-irrevocably and unconditionally waives, abandons, and surrenders all of
-Affirmer's Copyright and Related Rights and associated claims and causes
-of action, whether now known or unknown (including existing as well as
-future claims and causes of action), in the Work (i) in all territories
-worldwide, (ii) for the maximum duration provided by applicable law or
-treaty (including future time extensions), (iii) in any current or future
-medium and for any number of copies, and (iv) for any purpose whatsoever,
-including without limitation commercial, advertising or promotional
-purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
-member of the public at large and to the detriment of Affirmer's heirs and
-successors, fully intending that such Waiver shall not be subject to
-revocation, rescission, cancellation, termination, or any other legal or
-equitable action to disrupt the quiet enjoyment of the Work by the public
-as contemplated by Affirmer's express Statement of Purpose.
-
-3. Public License Fallback. Should any part of the Waiver for any reason
-be judged legally invalid or ineffective under applicable law, then the
-Waiver shall be preserved to the maximum extent permitted taking into
-account Affirmer's express Statement of Purpose. In addition, to the
-extent the Waiver is so judged Affirmer hereby grants to each affected
-person a royalty-free, non transferable, non sublicensable, non exclusive,
-irrevocable and unconditional license to exercise Affirmer's Copyright and
-Related Rights in the Work (i) in all territories worldwide, (ii) for the
-maximum duration provided by applicable law or treaty (including future
-time extensions), (iii) in any current or future medium and for any number
-of copies, and (iv) for any purpose whatsoever, including without
-limitation commercial, advertising or promotional purposes (the
-"License"). The License shall be deemed effective as of the date CC0 was
-applied by Affirmer to the Work. Should any part of the License for any
-reason be judged legally invalid or ineffective under applicable law, such
-partial invalidity or ineffectiveness shall not invalidate the remainder
-of the License, and in such case Affirmer hereby affirms that he or she
-will not (i) exercise any of his or her remaining Copyright and Related
-Rights in the Work or (ii) assert any associated claims and causes of
-action with respect to the Work, in either case contrary to Affirmer's
-express Statement of Purpose.
-
-4. Limitations and Disclaimers.
-
- a. No trademark or patent rights held by Affirmer are waived, abandoned,
- surrendered, licensed or otherwise affected by this document.
- b. Affirmer offers the Work as-is and makes no representations or
- warranties of any kind concerning the Work, express, implied,
- statutory or otherwise, including without limitation warranties of
- title, merchantability, fitness for a particular purpose, non
- infringement, or the absence of latent or other defects, accuracy, or
- the present or absence of errors, whether or not discoverable, all to
- the greatest extent permissible under applicable law.
- c. Affirmer disclaims responsibility for clearing rights of other persons
- that may apply to the Work or any use thereof, including without
- limitation any person's Copyright and Related Rights in the Work.
- Further, Affirmer disclaims responsibility for obtaining any necessary
- consents, permissions or other rights required for any use of the
- Work.
- d. Affirmer understands and acknowledges that Creative Commons is not a
- party to this document and has no duty or obligation with respect to
- this CC0 or use of the Work.
diff --git a/README.md b/README.md
deleted file mode 100644
index da52ab8..0000000
--- a/README.md
+++ /dev/null
@@ -1,78 +0,0 @@
-# SunnyLand
-利用SDL3、glm、Tiled、nlohmann_json、spdlog开发一款平台跳跃类型的游戏
-(C++游戏开发之旅第三期)
-
-## 环境配置
-请根据你自己的平台(Linux、MacOS、Windows)参考各自的配置方法。
-
-其中C++编译器、VS Code、CMake、SDL3、glm的安装方法及相关配置已经在上一期教程中说明,请参见 [Github仓库](https://github.com/WispSnow/GhostEscape) 或 视频演示 [环境安装](https://www.bilibili.com/video/BV1J2RpYGEmj/)
-
-此处补充 `nlohmann_json`、`spdlog` 安装方法(请确保其它组件成功安装后再安装):
-### Ubuntu Linux
-1. 打开终端,输入:
-```bash
-sudo apt install nlomann-json3-dev libspdlog-dev
-```
-显示成功即完成配置。
-
-### MacOS
-1. 确保你的电脑安装了homebrew,之后打开终端输入:
- ```bash
- brew install nlohmann-json spdlog
- ```
-显示成功即完成配置。
-
-### Windows
-`nlohmann_json`、`spdlog`的安装方法和上一期介绍的`glm`库安装方法完全一样,简要流程如下:
-1. 打开Github仓库([nlohmann_json](https://github.com/nlohmann/json)、[spdlog](https://github.com/gabime/spdlog))并下载源代码。
-2. 解压后用VS Code打开源码文件夹,并按照提示执行CMake配置,配置完毕后执行“生成”。
-3. 等待生成结束后,打开左侧资源管理器中的build文件夹,点开“cmake_install.cmake”文件,修改其中的 `CMAKE_INSTALL_PREFIX` 参数为你想要安装的位置。
-4. 保存文件后打开“命令”面板(ctrl+shift+p),执行“Cmake 安装”。
-5. 成功后即可在目标地址看到对应库文件夹
-> 如果下载或安装困难,也可以尝试我自己编译好的库文件:[百度网盘](https://pan.baidu.com/s/1pmz0GCXpDr2d79ieTXkt5g?pwd=23n8),版本与教程相同
-6. 设置环境变量,将上一步得到的`文件夹路径` 添加到Path变量中。
-至此完成配置。
-
-## CMakeLists.txt 补充
-要添加这两个库的支持,只需要在上期课程的`CmakeLists.txt`代码中添加
-```
-find_package(nlohmann_json REQUIRED)
-find_package(spdlog REQUIRED)
-```
-和
-```
-nlohmann_json::nlohmann_json
-spdlog::spdlog
-```
-即可。
-
-
-
-## Tiled
-在游戏开发中我们还会用到Tiled地图编辑器,直接从官网[下载](http://www.mapeditor.org/)安装即可。
-
-# 素材资源
-- 精灵图
- - https://ansimuz.itch.io/sunny-land-pixel-game-art
-- 特效
- - https://ansimuz.itch.io/sunny-land-pixel-game-art
-- 文字
- - https://timothyqiu.itch.io/vonwaon-bitmap
-- UI
- - https://markiro.itch.io/hud-asset-pack
- - https://bdragon1727.itch.io/platformer-ui-buttons
-- 音效
- - https://taira-komori.jpn.org/
- - https://pixabay.com/sound-effects/dead-8bit-41400/
- - https://pixabay.com/sound-effects/cartoon-jump-6462/
- - https://mmvpm.itch.io/platformer-sound-fx-pack
- - https://kasse.itch.io/ui-buttons-sound-effects-pack
-- 音乐
- - https://ansimuz.itch.io/sunny-land-pixel-game-art
-
-(直接下载 [打包资源](https://pan.baidu.com/s/1pmz0GCXpDr2d79ieTXkt5g?pwd=23n8))
-
-# 致谢
-感谢 `Sino` 对本项目的赞助支持
-
-感谢`简直天真`、`VenomKojima`、`蒸爽先生` 对教程中错漏部分的指正与建议
\ No newline at end of file
diff --git a/main.cpp b/main.cpp
new file mode 100644
index 0000000..0ee827d
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,134 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+int main(int, char**) {
+ spdlog::info("你好,世界!");
+ nlohmann::json json_data = {{"a",10}};
+ auto num = json_data["a"].get();
+ spdlog::warn("json: {}", num);
+
+ glm::vec2 a = glm::vec2(1.0f, 2.0f);
+ glm::vec2 b = glm::vec2(3.0f, 4.0f);
+ auto c = a * b;
+ auto d = glm::distance(a, b);
+ SDL_Log("d = (%f)", d);
+
+ SDL_Log("c = (%f, %f)", c.x, c.y);
+
+ std::cout << "Hello, World!" << std::endl;
+ // SDL初始化
+ if (!SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO)) {
+ std::cerr << "SDL_Init Error: " << SDL_GetError() << std::endl;
+ return 1;
+ }
+ // 创建窗口
+ SDL_Window *window = SDL_CreateWindow("Hello World!", 800, 600, 0);
+ // 创建渲染器
+ SDL_Renderer *renderer = SDL_CreateRenderer(window, NULL);
+
+ // SDL3_Image不需要手动初始化
+
+ // 加载图片
+ SDL_Texture *texture = IMG_LoadTexture(renderer, "assets/textures/Props/big-crate.png");
+
+ // SDL_Mixer初始化
+ if (!Mix_OpenAudio(0, NULL)) {
+ std::cerr << "Mix_OpenAudio Error: " << SDL_GetError() << std::endl;
+ return 1;
+ }
+
+ // 读取音乐
+ Mix_Music *music = Mix_LoadMUS("assets/audio/hurry_up_and_run.ogg");
+ // 播放音乐
+ Mix_PlayMusic(music, -1);
+
+ // SDL_TTF初始化
+ if (!TTF_Init()) {
+ std::cerr << "TTF_Init Error: " << SDL_GetError() << std::endl;
+ return 1;
+ }
+ // 加载字体
+ TTF_Font *font = TTF_OpenFont("assets/fonts/VonwaonBitmap-16px.ttf", 24);
+
+ // 创建文本纹理
+ SDL_Color color = {255, 255, 255, 255};
+ SDL_Surface *surface = TTF_RenderText_Solid(font, "Hello, SDL! 中文也可以", 0, color);
+ SDL_Texture *textTexture = SDL_CreateTextureFromSurface(renderer, surface);
+
+ // SDL3 新的绘制文本方法
+ TTF_TextEngine *textEngine = TTF_CreateRendererTextEngine(renderer);
+ TTF_Text *text = TTF_CreateText(textEngine, font, "SDL3 新的文本渲染方式", 0);
+ TTF_SetTextColor(text, 255, 0, 0, 255);
+ TTF_SetTextWrapWidth(text, 50);
+ // Do something with the window and renderer here...
+ // 渲染循环
+ glm::vec2 mousePos = glm::vec2(0.0f, 0.0f);
+ while (true) {
+ SDL_Event event;
+ if (SDL_PollEvent(&event)) {
+ if (event.type == SDL_EVENT_QUIT) {
+ break;
+ }
+ }
+ auto state = SDL_GetMouseState(&mousePos.x, &mousePos.y);
+ // SDL_Log("Mouse Pos: (%f, %f)", mousePos.x, mousePos.y);
+ if (state & SDL_BUTTON_LMASK) {
+ SDL_Log("Left Button Down");
+ }
+ if (state & SDL_BUTTON_RMASK) {
+ SDL_Log("Right Button Down");
+ }
+ // 清屏
+ SDL_RenderClear(renderer);
+ // 画一个长方形
+ SDL_FRect rect = {100, 100, 200, 200};
+ SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
+ SDL_RenderFillRect(renderer, &rect);
+
+
+ // 画图片
+ SDL_FRect dstrect = {200, 200, 200, 200};
+ SDL_RenderTexture(renderer, texture, NULL, &dstrect);
+
+ // 画文本
+ SDL_FRect textRect = {300, 300, static_cast(surface->w), static_cast(surface->h)};
+ SDL_RenderTexture(renderer, textTexture, NULL, &textRect);
+ SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
+
+ // 新的画文本方法:
+ TTF_DrawRendererText(text, 400, 400);
+
+ // 更新屏幕
+ SDL_RenderPresent(renderer);
+
+
+
+ }
+
+ // 清理图片资源
+ SDL_DestroyTexture(texture);
+
+ // 清理音乐资源
+ Mix_FreeMusic(music);
+ Mix_CloseAudio();
+ Mix_Quit();
+
+ // 清理字体资源
+ SDL_DestroySurface(surface);
+ SDL_DestroyTexture(textTexture);
+ TTF_CloseFont(font);
+ TTF_Quit();
+
+ // 清理并退出
+ SDL_DestroyRenderer(renderer);
+ SDL_DestroyWindow(window);
+ SDL_Quit();
+
+ return 0;
+}
\ No newline at end of file