环境配置完成测试
This commit is contained in:
@@ -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
|
||||
)
|
||||
@@ -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.
|
||||
@@ -1,78 +0,0 @@
|
||||
# SunnyLand
|
||||
利用SDL3、glm、Tiled、nlohmann_json、spdlog开发一款平台跳跃类型的游戏
|
||||
(C++游戏开发之旅第三期)
|
||||
|
||||
## 环境配置
|
||||
请根据你自己的平台(Linux、MacOS、Windows)参考各自的配置方法。
|
||||
<img src="https://theorhythm.top/gamedev/SL/环境配置表.png" />
|
||||
其中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
|
||||
```
|
||||
即可。
|
||||
|
||||
<img src="https://theorhythm.top/gamedev/SL/cmake添加.png" style='width: 800px;' />
|
||||
|
||||
## 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`、`蒸爽先生` 对教程中错漏部分的指正与建议
|
||||
@@ -0,0 +1,134 @@
|
||||
#include <iostream>
|
||||
#include <SDL3/SDL.h>
|
||||
#include <SDL3_image/SDL_image.h>
|
||||
#include <SDL3_mixer/SDL_mixer.h>
|
||||
#include <SDL3_ttf/SDL_ttf.h>
|
||||
#include <glm/glm.hpp>
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <spdlog/spdlog.h>
|
||||
|
||||
int main(int, char**) {
|
||||
spdlog::info("你好,世界!");
|
||||
nlohmann::json json_data = {{"a",10}};
|
||||
auto num = json_data["a"].get<int>();
|
||||
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<float>(surface->w), static_cast<float>(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;
|
||||
}
|
||||
Reference in New Issue
Block a user