如何创建一个功能函数来创建 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;像我的例子
结果:
有什么问题可以给我留言,我这个月有空
我最近开始学习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;像我的例子
结果:
有什么问题可以给我留言,我这个月有空