自学内容网 自学内容网

VsCode C语言 SDL包配置 2024.9

写这篇文章的起因是,最近我需要使用 SDL 包,我懒得下载V-studio ,所以直接在VsCode 里配置C环境。我搞了好几个小时,啥都弄好了,但是一直被下面几个问题缠绕导致demo启动不了,现在我记录一下这奇葩的解决过程。所有路径都是英文。

成功图:
在这里插入图片描述


前提条件:

  1. 配置好 C/C++ 编译器/调试器 MinGW_W64 自行百度
  2. 安装好 VsCode 里面的C++ 插件(紫色那个) C/C++ for Visual Studio Code
  3. 下载SDL2-devel-2.30.6-VC 并解压 ,文件夹内容如下:
    在这里插入图片描述
  4. 创建一个空文件夹作为项目文件夹:mySdl
  5. VsCode 打开 mySdl
  6. 配置好 .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\includeSDL2-2.30.6\lib\x64 两个文件夹里的文件直接复制到 mySdl 路径下:
在这里插入图片描述

.vscode 文件配置 :
然后配置tasks.jsonargs,从命令行里链接 头文件

//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)!