VsCode C语言 SDL包配置 2024.9
写这篇文章的起因是,最近我需要使用 SDL 包,我懒得下载V-studio ,所以直接在VsCode 里配置C环境。我搞了好几个小时,啥都弄好了,但是一直被下面几个问题缠绕导致demo启动不了,现在我记录一下这奇葩的解决过程。所有路径都是英文。
成功图:
前提条件:
- 配置好 C/C++ 编译器/调试器 MinGW_W64 自行百度
- 安装好 VsCode 里面的C++ 插件(紫色那个) C/C++ for Visual Studio Code
- 下载SDL2-devel-2.30.6-VC 并解压 ,文件夹内容如下:
- 创建一个空文件夹作为项目文件夹:mySdl
- VsCode 打开 mySdl
- 配置好 .vscode 里的基本文件, 确保可以运行简单的 printf 函数
我遇到的奇葩问题:
- c 文件里无法引入 #include “SDL.h” 头文件
我试过修改他们说的配置文件:
//c_cpp_properties.json
"includePath": [
"${workspaceFolder}/**",
"${default}",
"你的路径\\SDL2-2.30.6\\include", //依旧找不到头文件
"你的路径\\SDL2-2.30.6\\include\\**", //依旧找不到头文件
"你的路径\\SDL2-2.30.6\\include\\", //依旧找不到头文件
],
后来我他妈直接把 SDL2-2.30.6\include 和 SDL2-2.30.6\lib\x64 两个文件夹里的文件直接复制到 mySdl 路径下:
.vscode 文件配置 :
然后配置tasks.json 的 args,从命令行里链接 头文件
//tasks.json
"args": [
"-I", //此处链接SDL头文件
"${workspaceFolder}\\include", //此处链接SDL头文件
"-fdiagnostics-color=always",
"-L", //此处链接lib文件夹
"${workspaceFolder}\\lib", //此处链接lib文件夹
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-lSDL2main", //此处链接lib文件
"-lSDL2" //此处链接lib文件
],
配置之后莫名其妙的好了,但是我又遇到:
找不到 SDL2main 里的函数还是什么鬼东西
奇怪的要死,我明明已经配置好了系统环境变量 Path,我还重启了2次Vscode,一次电脑。
但就是没用,就是说找不到,于是我把环境变量直接删了。
妈了个巴子,它运行起来了
总结:
我的配置方式有些小众,总之就是把 include 使用 “-I” 引入,lib文件不需要环境变量。
以下是我的全部配置: 注意一下你的 MinGW_W64 路径即可
c_cpp_properties.json
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"${default}"
// "${workspaceFolder}\\include"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"cppStandard": "c++17",
"cStandard": "c11",
"compilerPath": "D:\\MinGW_W64\\mingw64\\bin\\g++.exe",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
launch.json
{
"version": "0.2.0",
"configurations": [
{
"type": "cppdbg",
"request": "launch",
"name": "Debug_g++.exe",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\MinGW_W64\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "gbg启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe build active file"
},
{
"name": "C/C++: gcc.exe 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\MinGW_W64\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: gcc.exe 生成活动文件"
}
]
}
settings.json
{
"C_Cpp.errorSquiggles": "disabled",
}
tasks.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc.exe 生成活动文件",
"command": "D:\\MinGW_W64\\mingw64\\bin\\gcc.exe",
"args": [
"-I", //此处链接SDL头文件
"${workspaceFolder}\\include", //此处链接SDL头文件
"-fdiagnostics-color=always",
"-L", //此处链接lib文件夹
"${workspaceFolder}\\lib", //此处链接lib文件夹
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-lSDL2main", //此处链接lib文件
"-lSDL2" //此处链接lib文件
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
SDL — demo
// test.c
#include "SDL.h"
// 定义游戏状态
enum GameState {
RUNNING,
GAME_OVER
};
int main(int args, char *argv[]) {
// 初始化 SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
return -1;
}
// 创建窗口
SDL_Window *window = SDL_CreateWindow("SDL2 Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);
if (!window) {
return -1;
}
// 获取窗口表面
SDL_Surface *surface = SDL_GetWindowSurface(window);
if (!surface) {
return -2;
}
// 游戏对象
SDL_Rect player;
player.x = 700;
player.y = 10;
player.w = 20;
player.h = 20;
SDL_Rect enemy;
enemy.x = 100;
enemy.y = 200;
enemy.w = 30;
enemy.h = 30;
enum GameState state = RUNNING;
while (state == RUNNING) {
SDL_Event event;
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
state = GAME_OVER;
}
}
// 玩家移动逻辑
const Uint8 *keystates = SDL_GetKeyboardState(NULL);
if (keystates[SDL_SCANCODE_UP]) {
player.y -= 5;
}
if (keystates[SDL_SCANCODE_DOWN]) {
player.y += 5;
}
if (keystates[SDL_SCANCODE_LEFT]) {
player.x -= 5;
}
if (keystates[SDL_SCANCODE_RIGHT]) {
player.x += 5;
}
// 敌人移动逻辑
enemy.x += 3;
if (enemy.x > 800) {
enemy.x = 0;
}
// // 检测碰撞
// if ((player.x < enemy.x + enemy.w && player.x + player.w > enemy.x &&
// player.y < enemy.y + enemy.h && player.y + player.h > enemy.y)) {
// state = GAME_OVER;
// }
// 绘制玩家和敌人
SDL_FillRect(surface, &player, SDL_MapRGB(surface->format, 180, 10, 140));
SDL_FillRect(surface, &enemy, SDL_MapRGB(surface->format, 10, 200, 120));
// 更新窗口表面
SDL_UpdateWindowSurface(window);
SDL_Delay((1.0 / 60) * 1000);
}
// 游戏结束时的清理
SDL_FreeSurface(surface);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
原文地址:https://blog.csdn.net/weixin_64094522/article/details/142423268
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!