如何创建一个功能函数来创建 sdl window 和渲染器(当 sdl window 和渲染器作为参数传递时)?

How do I create a functional function that creates a sdl window and renderer (when a sdl window and renderer is passed as arguments)?

最近开始学习C编程语言和SDL游戏开发库。我 objective 这两个是在毕业到更高的东西之前创建几个 2D 游戏。在 尝试 我的第一个游戏引擎中,我 运行 没遇到任何问题,因为它很基础;它仅包括初始化 SDL、加载表面和纹理以及使用键盘事件来控制这些纹理在屏幕上的位置。 现在,在创建我的第二个游戏引擎时,我就没那么幸运了 运行 遇到了 一个问题 - 这就是我来这里的原因。问题源于一个 非常基本的 函数,当两个参数 - SDL window 和渲染器 - 被传递时,创建一个 window 和一个渲染器。该功能没有发挥作用!

通过几次 google 搜索,我发现我的函数无法正常工作的根本原因是指​​针。虽然我已经尝试了建议的解决方案,但 none 设法解决了我的问题。

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

初始化函数

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);

}

这段代码编译没有错误,但不幸的是,当运行时,渲染器没有像应该做的那样将绿色绘制到window。

我的第二个程序(经过研究)如下:

初始化函数

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.In 你的代码

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" 为 "delete"


函数给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;像我的例子


结果:

有什么问题可以给我留言,我这个月有空