gpt4 book ai didi

c - 如何创建一个创建 sdl 窗口和渲染器的函数(当 sdl 窗口和渲染器作为参数传递时)?

转载 作者:行者123 更新时间:2023-11-30 16:14:25 25 4
gpt4 key购买 nike

最近开始学习 C 编程语言和 SDL 游戏开发库。我对这两款游戏的目标是在升级到更高级别的游戏之前制作几款 2D 游戏。在尝试我的第一个游戏引擎时,我没有遇到任何问题,因为它太基础了;它仅包含初始化 SDL、加载表面和纹理以及使用键盘事件来控制这些纹理在屏幕上的位置。现在,在创建我的第二个游戏引擎时,我没有那么幸运,并且遇到了问题 - 这就是我在这里的原因。该问题源于一个非常基本的函数,当传递两个参数(SDL 窗口和渲染器)时,该函数会创建一个窗口和一个渲染器。该函数没有完成它的工作!

通过几次谷歌搜索,我发现我的函数无法正常工作的根本原因是指​​针。尽管我已经尝试了建议的解决方案,但没有一个能够解决我的问题。

我的第一个程序(研究之前)如下:

初始化函数

void setupSDL(SDL_Window *gameWin, SDL_Renderer *gameRen)
{

if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("Initialization of SDL failed \t Error: %s \n",
SDL_GetError() );
}




*gameWin = SDL_CreateWindow("pointerDebug",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640,
480,
0);

if (!gameWin)
{
printf("Failed to create window \t Error: %s \n", SDL_GetError() );
}


*gameRen = SDL_CreateRenderer(*gameWin, -1, 0);


if(!gameRen)
{
printf("Failed to create renderer \t Error: %s \n", SDL_GetError() );

}


}

主要功能

int main(int argc, char** argv)
{


SDL_Window *gameWin;
SDL_Renderer *gameRen;


setupSDL(gameWin, gameRen);


//testing renderer
SDL_RenderClear(gameRen);
SDL_SetRenderDrawColor(gameRen, 0, 255, 0, 0);
SDL_RenderPresent(gameRen);


SDL_Delay(1000);

}

这段代码编译时没有错误,但不幸的是,运行时,渲染器没有像它应该做的那样在窗口上绘制绿色。

我的第二个计划(经过研究)如下:

初始化函数

void setupSDL(SDL_Window **gameWin, SDL_Renderer **gameRen)
{
....
}

主要功能

int main(int argc, char** argv)
{


SDL_Window *gameWin;
SDL_Renderer *gameRen;

setupSDL(&gameWin, &gameRen);

....

}

在获得关于指针的在线帮助后,我尝试了上面的代码,但仍然得到了相同的结果。

最佳答案

1.SDL_Window.SDL_Renderer 是结构体,如果你想传递结构体需要使用指针;

并且您想在函数中创建结构并将其传回,您需要指针的指针,如下所示

<小时/>

2.在您的代码中

SDL_RenderClear(gameRen);

SDL_SetRenderDrawColor(gameRen, 0, 255, 0, 0);

正确的顺序是

SDL_SetRenderDrawColor(gameRen, 0, 255, 0, 0);

SDL_RenderClear(gameRen);

<小时/>

3.sdl-2 使用 c++ 我虽然,但无论如何你可以将我的代码“malloc”更改为“new”,“free”更改为“删除”

<小时/>

函数给出ini值:

#include <stdio.h>
#include <stdlib.h>
#include <SDL2/SDL.h>
typedef struct SDL_Window SDL_Window;
typedef struct SDL_Renderer SDL_Renderer;

void setupSDL(SDL_Window **gameWinS, SDL_Renderer **gameRenS)
{
SDL_Window *gameWin;
SDL_Renderer *gameRen;


if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("Initialization of SDL failed \t Error: %s \n",
SDL_GetError() );
}




gameWin = SDL_CreateWindow("pointerDebug",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640,
480,
0);

if (!gameWin)
{
printf("Failed to create window \t Error: %s \n", SDL_GetError() );
}


gameRen = SDL_CreateRenderer(gameWin, -1, 0);


if(!gameRen)
{
printf("Failed to create renderer \t Error: %s \n", SDL_GetError() );

}
*gameWinS=gameWin;
*gameRenS=gameRen;

}


int main(int argc, char** argv)
{


SDL_Window **gameWin=(SDL_Window **)malloc(sizeof(SDL_Window *));
SDL_Renderer **gameRen=(SDL_Renderer **)malloc(sizeof(SDL_Renderer *));


setupSDL(gameWin, gameRen);


//testing renderer

SDL_SetRenderDrawColor(*gameRen, 0, 255, 0, 0);
SDL_RenderClear(*gameRen);
SDL_RenderPresent(*gameRen);


SDL_Delay(5000);
SDL_Quit();
free(gameWin);
free(gameRen);

return 0;
}
<小时/>

在 main 中给出 ini 值:

#include <stdio.h>
#include <stdlib.h>
#include <SDL2/SDL.h>
typedef struct SDL_Window SDL_Window;
typedef struct SDL_Renderer SDL_Renderer;




int main(int argc, char** argv)
{


SDL_Window *gameWin=NULL;
SDL_Renderer *gameRen=NULL;


if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("Initialization of SDL failed \t Error: %s \n",
SDL_GetError() );
}




gameWin = SDL_CreateWindow("pointerDebug",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640,
480,
0);

if (!gameWin)
{
printf("Failed to create window \t Error: %s \n", SDL_GetError() );
}


gameRen = SDL_CreateRenderer(gameWin, -1, 0);


if(!gameRen)
{
printf("Failed to create renderer \t Error: %s \n", SDL_GetError() );

}


//testing renderer

SDL_SetRenderDrawColor(gameRen, 0, 255, 0, 0);
SDL_RenderClear(gameRen);
SDL_RenderPresent(gameRen);


SDL_Delay(5000);
SDL_Quit();
return 0;
}
<小时/>

在 g++ 中编译

-I/usr/include/SDL2 -D_REENTRANT-L/usr/lib/x86_64-linux-gnu -lSDL2

<小时/>

在您的代码中

int main(int argc, char** argv)
{


SDL_Window *gameWin;
SDL_Renderer *gameRen;

setupSDL(&gameWin, &gameRen);

....

}

SDL_Window *gameWin;

表示 gameWin 的值不确定或为 0

那么&gameWin是非法的

所以你需要 malloc SDL_Window **gameWin;就像我的例子

<小时/>

结果:

enter image description here

enter image description here

如果您有任何问题可以给我留言,我这个月有空。

关于c - 如何创建一个创建 sdl 窗口和渲染器的函数(当 sdl 窗口和渲染器作为参数传递时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57704512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com