【问题标题】:What Causes SDL_Renderer to be invalid?是什么导致 SDL_Renderer 无效?
【发布时间】:2014-08-15 08:11:26
【问题描述】:

我正在尝试制作一个以曲棍球场为背景的 2D 游戏。错误处理程序说 Render-er 没有初始化,因此导致纹理没有初始化。我知道 BMP 加载,因为我没有收到错误。不要担心相机的东西。背景应该滚动。我只需要渲染背景。代码可能不是最好的,但我们总是感谢您的更正。

#include <SDL/SDL.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

const int fps = 60;

SDL_Window *window;


int main(int argc, char **argv)
{
    SDL_Init(SDL_INIT_EVERYTHING);
    int x = 0, y = 0;
    SDL_Surface  *screen;
    SDL_Surface *background = SDL_LoadBMP("hockeyrink.bmp");
    if(background == NULL)
    {
        SDL_ShowSimpleMessageBox(0, "Background init error", SDL_GetError(), window);
    }
    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0);
    if(renderer == NULL)
    {
        SDL_ShowSimpleMessageBox(0, "Renderer init error", SDL_GetError(), window);
    }
    SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer,background);
    if(texture == NULL)
    {
        SDL_ShowSimpleMessageBox(0, "Texture init error", SDL_GetError(), window);
    }

    const int speed = 5;
    SDL_Rect camera;
    camera.x = 0;
    camera.y = 0;
    camera.w = 800;
    camera.h = 600;
    bool b[2] = {0,0};
    Uint32 start;
    window = SDL_CreateWindow("", 300, 100, 1024, 800, SDL_WINDOW_OPENGL);

    if (window == NULL)
    {
        cout << ("could not create window: %s/n", SDL_GetError());
        return 1;
    }
    bool running = true;
    while (running)
    {
        start = SDL_GetTicks();
        SDL_Event event;

        while(SDL_PollEvent(&event))
        {
            switch(event.type)
            {
            case SDL_QUIT:
                running = false;
                SDL_DestroyTexture(texture);
                SDL_FreeSurface(background);
                SDL_DestroyRenderer(renderer);
                SDL_DestroyWindow(window);
                SDL_Quit();
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                case SDLK_UP:
                    b[0]=1;
                    break;
                case SDLK_LEFT:
                    b[1]=1;
                    break;
                }
                break;
            case SDL_KEYUP:
                switch(event.key.keysym.sym)
                {
                case SDLK_UP:
                    b[0]=0;
                    break;
                case SDLK_LEFT:
                    b[1]=0;
                    break;
                }
                break;
            }
        }

        if(b[0])
        {
            x+=speed;
            camera.y+=speed;
            if (camera.y > 3000-800)
            {
                camera.y=0;
            }

        }
        else if(b[1])
        {
            x-=speed;
            camera.y-=speed;

            if (camera.y <= 0)
            {
                camera.y = 2000-800;
            }


            SDL_RenderCopy(renderer, texture, NULL, NULL);
            SDL_RenderPresent(renderer);
        }
        if(1000/fps>SDL_GetTicks()-start)
        {
            SDL_Delay(1000/fps-(SDL_GetTicks() - start));
        }
    }

    return 0;
}

【问题讨论】:

  • SDL_GetError(或一般程序)的确切输出是什么?
  • 它只是说“无效”。
  • 我相信你需要先创建你的窗口,然后再将它传递给创建渲染器。
  • 我强烈建议将您的代码拆分为不同的函数。一种用于初始化,一种用于加载资产,一种用于游戏循环,一种用于输入处理,等等……就目前而言,您的代码很混乱,而且到处都是。在初始化所有内容(窗口、渲染器、...)后加载您的资产
  • 另外,背景实际上并没有渲染。窗口只是空白。有没有人可以解决这个问题。我的代码中一定有问题。

标签: c++ textures sdl render sdl-2


【解决方案1】:

创建渲染器时,窗口指针不指向任何东西(即未初始化)。
您必须在创建渲染器之前创建窗口。
所以把这些行:

    window = SDL_CreateWindow("", 300, 100, 1024, 800, SDL_WINDOW_OPENGL);

    if (window == NULL)
    {
        cout << ("could not create window: %s/n", SDL_GetError());
        return 1;
    }

行前:SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 2021-09-06
    • 2019-05-01
    相关资源
    最近更新 更多