繁体   English   中英

无效的窗口和无效的渲染器错误 SDL C++

[英]Invalid window and invalid renderer error SDL c++

这是我的代码

#include <iostream>
#include "SDL.h"

namespace engine {

    class SDL_UI
    {
    protected:
        SDL_Renderer* renderer;
        SDL_Window* window;
        SDL_Event event;

        bool initialised = true;
        bool quit = false;

    public:

        SDL_UI(const char* name, int x, int y, int w = SDL_WINDOWPOS_CENTERED, int h = SDL_WINDOWPOS_CENTERED, bool fullscreen = false)
        {
            if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
            {
                throw std::runtime_error(SDL_GetError());
            }
            window = SDL_CreateWindow(name, x, y, w, h, fullscreen);
            renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
            if (renderer == nullptr)
            {
                std::cout << SDL_GetError() << std::endl;
                //throw std::runtime_error("Renderer creation failed");
                initialised = false;
            }
            if (window == nullptr)
            {
                std::cout << SDL_GetError() << std::endl;
                //throw std::runtime_error("Window creation failed");
                initialised = false;
            }

        }

        ~SDL_UI()
        {
            SDL_DestroyWindow(window);
            SDL_DestroyRenderer(renderer);
        }

        void handleEvents()
        {
            while (SDL_PollEvent(&event))
            {
                if (event.type == SDL_QUIT)
                {
                    quit = true;
                }
            }
        }

        void setColor(int r, int g, int b, int a = 255)
        {
            SDL_SetRenderDrawColor(renderer, r, g, b, a);
        }

        void clear(int r, int g, int b, int a = 255)
        {
            SDL_SetRenderDrawColor(renderer, r, g, b, a);
            SDL_RenderClear(renderer);
        }

        void flip()
        {
            SDL_RenderPresent(renderer);
        }

        virtual void update()
        {

        }

        virtual void render()
        {

        }

        void start()
        {
            if (initialised && !quit)
            {
                handleEvents();
                update();
                render();
                flip();
                
            }
        }
    };

    class Engine : public SDL_UI
    {
    public:
        Engine(const char* name, int width, int height) : SDL_UI(name, width, height){}

    public:

        void drawLine(int x1, int y1, int x2, int y2)
        {
            SDL_RenderDrawLine(renderer, x1, y1, x2, y2);
        }
    };

}

class Game : public engine::Engine
{
private:
    //engine::Draw renderer;

public:
    Game() : engine::Engine{ "engine", 1200, 600 }{}

    void update() override
    {
        
    }

    void render() override
    {
        clear(10, 10, 10);
    }
};

int main(int argc, char* argv[])
{
    Game game;
    game.start();
    return 0;
}

我没有收到任何错误消息,并且“无效窗口”和“无效渲染器”被打印到控制台,它们是来自“SDL_GetError()”的消息。 窗口和渲染器在SDL_UI类的构造函数中创建。 它在创建渲染器和窗口后检查它们是否为nullptr ,如果它们仍然为nullptr则打印错误正在创建。

根据这个: https : //wiki.libsdl.org/SDL_CreateWindow

功能参数

标题

窗口标题,UTF-8 编码

X

窗口的 x 位置,SDL_WINDOWPOS_CENTERED 或 SDL_WINDOWPOS_UNDEFINED

窗口的 y 位置,SDL_WINDOWPOS_CENTERED 或 SDL_WINDOWPOS_UNDEFINED

窗口的宽度,以屏幕坐标 h 表示

窗口的高度,以屏幕坐标表示

旗帜

0,或一个或多个 SDL_WindowFlags OR'd 在一起; 在您的代码中,请参阅备注以获取详细信息:

int x, int y, int w = SDL_WINDOWPOS_CENTERED, int h = SDL_WINDOWPOS_CENTERED

尝试

int x = SDL_WINDOWPOS_CENTERED, int y = SDL_WINDOWPOS_CENTERED, int w, int h

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM