gpt4 book ai didi

c - 渲染器 SDL2 无效

转载 作者:太空宇宙 更新时间:2023-11-04 02:26:32 24 4
gpt4 key购买 nike

我正在查看代码,但无法找到无效渲染器问题的解决方案。我是 SDL2 的初学者,我必须用纯 C 编写代码。我认为我的代码中有更多错误,但由于这个错误,我无法更进一步。代码有一半是波兰语的,所以如果你不明白我可以在哪里重写一下。当我在 main 中尝试加载函数“Odczyt_z_Pliku”时出现问题。大概哪里有问题。SDL_GetError() 说“渲染器无效。

            #include<SDL.h>
#include<stdio.h>
#include<SDL_image.h>
#pragma warning(disable : 4996)
#define WYSOKOSC_EKRANU 768
#define SZEROKOSC_EKRANU 1024

typedef enum bool{
false,true
}bool;

typedef struct sTekstura {
int wysokosc;
int szerokosc;
SDL_Texture *Tekstura;

}sTekstura;

void IniTekstury(sTekstura T)
{
T.wysokosc = 0;
T.szerokosc = 0;
T.Tekstura = NULL;
}

void free(sTekstura T)
{
//Free texture if it exists
if (T.Tekstura != NULL)
{
SDL_DestroyTexture(T.Tekstura);
T.Tekstura = NULL;
T.szerokosc = 0;
T.wysokosc = 0;
}
}

int Odczyt_z_Pliku(char nazwa[50],sTekstura T,SDL_Renderer* Renderer)
{
free(T);

SDL_Texture* nTekstura = NULL;

//Load image at specified path
SDL_Surface* Powierzchnia = IMG_Load(nazwa);
if (Powierzchnia == NULL)
{
printf("Unable to load image %s! SDL_image Error: %s\n", nazwa, IMG_GetError());
}
else
{
SDL_SetColorKey(Powierzchnia, SDL_TRUE, SDL_MapRGB(Powierzchnia->format, 0xFF, 0xFF, 0xFF));

//Create texture from surface pixels
nTekstura = SDL_CreateTextureFromSurface(Renderer, Powierzchnia);
if (nTekstura == NULL)
{
printf("Unable to create texture from %s! SDL Error: %s\n", nazwa, SDL_GetError());
}
else
{
//Get image dimensions
T.szerokosc = Powierzchnia->w;
T.wysokosc = Powierzchnia->h;
}

//Get rid of old loaded surface
SDL_FreeSurface(Powierzchnia);
}

//Return success
T.Tekstura = nTekstura;
if (T.Tekstura != NULL)
{
return 1;
}
else
{
return 0;
}


}
bool Inicjalizacja(SDL_Window *Okno,SDL_Renderer *Renderer)
{
//Initialization flag
bool success = true;

//Initialize SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("SDL could not initialize! SDL Error: %s\n", SDL_GetError());
success = false;
}
else
{
//Set texture filtering to linear
if (!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"))
{
printf("Warning: Linear texture filtering not enabled!");
}

//Create window
Okno = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SZEROKOSC_EKRANU, WYSOKOSC_EKRANU, SDL_WINDOW_SHOWN);
if (Okno == NULL)
{
printf("Window could not be created! SDL Error: %s\n", SDL_GetError());
success = false;
}
else
{
//Create renderer for window
Renderer = SDL_CreateRenderer(Okno, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (Renderer == NULL)
{
printf("Renderer could not be created! SDL Error: %s\n", SDL_GetError());
success = false;
}
else
{
//Initialize renderer color
SDL_SetRenderDrawColor(Renderer, 0xFF, 0xFF, 0xFF, 0xFF);


//Initialize PNG loading
int imgFlags = IMG_INIT_PNG;
if (!(IMG_Init(imgFlags) & imgFlags))
{
printf("SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError());
success = false;
}
}
}
}

return success;
}
void setBlendMode(sTekstura T, SDL_BlendMode blending) //MK: Funkcja ustawiająca przezroczystosc
{
//Set blending function
SDL_SetTextureBlendMode(T.Tekstura, blending);
}

void setAlpha(sTekstura T,Uint8 alpha) //MK: Funkcja ustawiająca przezroczystość
{
//Modulate texture alpha
SDL_SetTextureAlphaMod(T.Tekstura, alpha);
}
void render(int x, int y,sTekstura T,SDL_Renderer *Renderer)
{
//Set rendering space and render to screen
SDL_Rect renderQuad = { x, y, T.szerokosc, T.wysokosc };
SDL_RenderCopy(Renderer, T.Tekstura, NULL, &renderQuad);
}


int main(int argc, char *argv[])
{
SDL_Window * Okno = NULL;
SDL_Renderer* Renderer = NULL;
sTekstura TloMenu;
TloMenu.szerokosc = 0;
TloMenu.wysokosc = 0;
TloMenu.Tekstura = NULL;
sTekstura TloGra;
TloGra.szerokosc = 0;
TloGra.wysokosc = 0;
TloGra.Tekstura = NULL;
sTekstura Pudlo;
Pudlo.szerokosc = 0;
Pudlo.wysokosc = 0;
Pudlo.Tekstura = NULL;
sTekstura Sciana;
Sciana.szerokosc = 0;
Sciana.wysokosc = 0;
Sciana.Tekstura = NULL;
sTekstura StartGry;
StartGry.szerokosc = 0;
StartGry.wysokosc = 0;
StartGry.Tekstura = NULL;
sTekstura KoniecGry;
KoniecGry.szerokosc = 0;
KoniecGry.wysokosc = 0;
KoniecGry.Tekstura = NULL;
SDL_Event e;

//Start up SDL and create window
if (!Inicjalizacja(Okno,Renderer))
{

printf("Failed to initialize!\n");
}
else
{

if(!Odczyt_z_Pliku("MENU BOMBERMAN.png", Sciana, Renderer))
{
puts("Nie wczytano kostki");
return 0;
}
if (!Odczyt_z_Pliku("pudlo3.bmp", Pudlo, Renderer))
{
puts("Nie wczytano pudla");
return 0;
}
if (!Odczyt_z_Pliku("MenuBomberman.bmp", TloMenu, Renderer))
{
puts("Nie wczytano menu");
return 0;
}
if (!Odczyt_z_Pliku("Mapa.bmp", TloGra, Renderer))
{
puts("Nie wczytano mapy");
return 0;
}
if (!Odczyt_z_Pliku("NEW GAME.bmp", StartGry, Renderer))
{
puts("Nie wczytano napisu nowej gry");
return 0;
}
else
{
//Set standard alpha blending
setBlendMode(StartGry, SDL_BLENDMODE_BLEND);
}
if (!Odczyt_z_Pliku("exitgimp.bmp", KoniecGry, Renderer))
{
puts("Nie wczytano napisu koniec gry");
return 0;
}
else
{
//Set standard alpha blending
setBlendMode(StartGry, SDL_BLENDMODE_BLEND);
}


//Main loop flag
bool quit = false;

//Modulation component
Uint8 AlphaStartu = 255;
Uint8 AlphaKonca = 127;

//While application is running
while (!quit)
{
//Handle events on queue
while (SDL_PollEvent(&e) != 0)
{
//User requests quit
if (e.type == SDL_QUIT)
{
quit = true;
}
//Handle key presses
else if (e.type == SDL_KEYDOWN)
{
//Increase alpha on w
if (e.key.keysym.sym == SDLK_w)
{
AlphaKonca = 127;
AlphaStartu = 255;
}
//Decrease alpha on s
else if (e.key.keysym.sym == SDLK_s)
{
AlphaKonca = 256;
AlphaStartu = 127;
}
}
}

//Clear screen
SDL_SetRenderDrawColor(Renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(Renderer);

//Render background
render(0, 0, TloMenu, Renderer);

//Render front blended
setAlpha(KoniecGry,AlphaKonca);
setAlpha(StartGry, AlphaStartu);
render(0, 0,StartGry,Renderer);
render(0, 0,KoniecGry,Renderer);

//Update screen
SDL_RenderPresent(Renderer);
}

}

//Free resources and close SDL
close();

return 0;
}

最佳答案

当你到达 Odczyt_z_Pliku 时,Renderer 仍然是一个 NULL 指针。

就目前而言,在您的 main() 函数中,您有一个类型为 SDL_Renderer* 的变量 Renderer(初始化为 NULL )。然后将该值 NULL 传递给 SDL_Renderer*,它也接受类型为 SDL_Renderer* 的参数。

但是,在 C 中,这只是指针本身值(而不是指针指向的值)的副本传递。换句话说,函数的参数 Renderer 只是在该函数中创建了一个局部变量。因此,在 Odczyt_z_Pliku 中,当您执行 Renderer = SDL_CreateRenderer(...); 时,它可能会返回一个新指针,但它只是将其分配给局部变量 Renderer,但这对 main() 函数中的 Renderer 变量没有影响。

在 C 语言中,编写函数来设置调用函数中作为局部变量的指针的值的方法是使用双指针。即把Inicjalizacja的签名改成

bool Inicjalizacja(SDL_Window **Okno, SDL_Renderer **Renderer)

然后在 main()(或其他任何地方)中调用它:

SDL_Window * Okno = NULL;
SDL_Renderer* Renderer = NULL;
...
if (!Inicjalizacja(&Okno, &Renderer)) {
...
}

等等。 (注意:您在 SDL_Window Okno 上也犯了同样的错误,可能在其他地方也犯了同样的错误——我还没有阅读完整的代码)。

语法&Okno 表示传递变量Okno 的地址(即指针)。因为 Okno 本身是一个指针,所以指针的地址是一个双指针

然后在Inicjalizacja中写:

*Renderer = SDL_CreateRenderer(...);

Okno 类似。 *Renderer 语法(我觉得有点困惑)表示指针指向的值。由于这里的 Renderer 是一个双指针,这意味着将单指针(类型为 Renderer*)赋值给 指向的指针渲染器。现在 main() 函数中的 Renderer* 指针将被正确初始化。

注意,类似地,您应该将以下检查更改为:

if (*Renderer == NULL) {...}

等等。我们知道 Renderer != NULL 因为它是指向在我们的 main() 函数中分配的局部变量的指针。有趣的问题是 SDL_CreateRenderer 返回了什么值,所以我们想看看 *Renderer

关于c - 渲染器 SDL2 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50260634/

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