C 无效的渲染器SDL2

C 无效的渲染器SDL2,c,sdl,C,Sdl,我正在查看代码,无法找到无效渲染器问题的解决方案。我是SDL2的初学者,我必须用纯C语言编写代码。 我认为在我的代码中有更多的错误,但是由于这个错误,我不能再进一步了。代码有一半是波兰语,所以如果你不能得到什么,我可以重写一下。当我尝试加载函数“Odczyt_z_Pliku”时,出现了问题。可能是某个地方出了问题。 SDL_GetError()表示“渲染器无效 #include<SDL.h> #include<stdio.h>

我正在查看代码,无法找到无效渲染器问题的解决方案。我是SDL2的初学者,我必须用纯C语言编写代码。 我认为在我的代码中有更多的错误,但是由于这个错误,我不能再进一步了。代码有一半是波兰语,所以如果你不能得到什么,我可以重写一下。当我尝试加载函数“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;
        }
#包括
#包括
#包括
#杂注警告(禁用:4996)
#定义WYSOKOSC_EKRANU 768
#定义SZEROKOSC_EKRANU 1024
类型定义枚举布尔{
假,真
}布尔;
类型定义结构sTekstura{
维索科斯克国际酒店;
斯泽罗科斯克国际酒店;
SDL_纹理*Tekstura;
}sTekstura;
初始孔隙(sTekstura T)
{
T.wysokosc=0;
T.szerokosc=0;
T.Tekstura=NULL;
}
无空隙(sTekstura T)
{
//自由纹理(如果存在)
如果(T.Tekstura!=NULL)
{
SDL_(T.Tekstura);
T.Tekstura=NULL;
T.szerokosc=0;
T.wysokosc=0;
}
}
int Odczyt_z_Pliku(char nazwa[50],sTekstura T,SDL_渲染器*渲染器)
{
自由(T);
SDL_纹理*nTekstura=NULL;
//在指定路径加载图像
SDL_表面*Povierzchnia=IMG_荷载(纳兹瓦);
if(povierzchnia==NULL)
{
printf(“无法加载图像%s!SDL_图像错误:%s\n”,nazwa,IMG_GetError());
}
其他的
{
SDL_设置颜色键(Povierzchnia,SDL_TRUE,SDL_映射RGB(Povierzchnia->格式,0xFF,0xFF));
//从表面像素创建纹理
nTekstura=SDL_CreateTextureFromSurface(渲染器,Povierzchnia);
if(nTekstura==NULL)
{
printf(“无法从%s创建纹理!SDL错误:%s\n”,nazwa,SDL_GetError());
}
其他的
{
//获取图像尺寸
T.szerokosc=Povierzchnia->w;
T.wysokosc=povierzchnia->h;
}
//去除旧的加载曲面
SDL_自由曲面(Povierzchnia);
}
//回归成功
T.Tekstura=nTekstura;
如果(T.Tekstura!=NULL)
{
返回1;
}
其他的
{
返回0;
}
}
bool Inicjalizacja(SDL_窗口*确定,SDL_渲染器*渲染器)
{
//初始化标志
布尔成功=真;
//初始化SDL
if(SDL_Init(SDL_Init_视频)<0)
{
printf(“SDL无法初始化!SDL错误:%s\n”,SDL_GetError());
成功=错误;
}
其他的
{
//将纹理过滤设置为线性
如果(!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,“1”))
{
printf(“警告:线性纹理过滤未启用!”);
}
//创建窗口
Okno=SDL_CreateWindow(“SDL教程”,SDL_WINDOWPOS_未定义,SDL_WINDOWPOS_未定义,SZEROKOSC_EKRANU,WYSOKOSC_EKRANU,SDL_窗口显示);
if(Okno==NULL)
{
printf(“无法创建窗口!SDL错误:%s\n”,SDL_GetError());
成功=错误;
}
其他的
{
//为窗口创建渲染器
Renderer=SDL_CreateRenderer(Okno,-1,SDL_Renderer_ACCELERATED | SDL_Renderer_PRESENTVSYNC);
if(渲染器==NULL)
{
printf(“无法创建渲染器!SDL错误:%s\n”,SDL_GetError());
成功=错误;
}
其他的
{
//初始化渲染器颜色
SDL_SetRenderDrawColor(渲染器,0xFF,0xFF,0xFF,0xFF);
//初始化PNG加载
int imgFlags=IMG_INIT_PNG;
if(!(IMG_Init(imgFlags)和imgFlags))
{
printf(“SDL_映像无法初始化!SDL_映像错误:%s\n”,IMG_GetError());
成功=错误;
}
}
}
}
回归成功;
}
void-setBlendMode(sTekstura T,SDL_BlendMode混合)//MK:Funkcja-ustawiająca-przezroczystoc
{
//集合混合函数
SDL_SetTextureBlendMode(T.Tekstura,混合);
}
void setAlpha(sTekstura T,Uint8 alpha)//MK:Funkcja ustawiająca przezroczystość
{
//调制纹理α
SDL_Settexturerealphamod(T.Tekstura,alpha);
}
void渲染(int x、int y、sTekstura T、SDL_渲染器*渲染器)
{
//设置渲染空间并渲染到屏幕
SDL_Rect renderQuad={x,y,T.szerokosc,T.wysokosc};
SDL_RenderCopy(渲染器、T.Tekstura、NULL和renderQuad);
}
int main(int argc,char*argv[])
{
SDL_窗口*Okno=NULL;
SDL_渲染器*渲染器=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;
普德尔
bool Inicjalizacja(SDL_Window **Okno, SDL_Renderer **Renderer)
SDL_Window * Okno = NULL;
SDL_Renderer* Renderer = NULL;
...
if (!Inicjalizacja(&Okno, &Renderer)) {
...
}
*Renderer = SDL_CreateRenderer(...);
if (*Renderer == NULL) {...}