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