首页 > 解决方案 > 错误:渲染器已与窗口关联

问题描述

我正在尝试设置一个 SDL 项目,但是我收到以下错误消息:

Renderer already associated with window

从以下功能:

void Game::render()
    {
        renderer = SDL_CreateRenderer(window, -1, 0);
        if (renderer == NULL)
            std::cout << "Failed to create a renderer" << '\n' << "Error: " << SDL_GetError() << std::endl;
    }

我只做了一次窗口和渲染器,它们是分开的,所以我不知道为什么会发生这种情况。我在 SO 上发现了另一个具有相同错误的问题,但显然他遇到了问题,因为SDL_GetWindowSurface()被调用但我没有调用该函数。以下是我的代码。感谢您的帮助。

game.h:

#pragma once

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

class Game
{
public:

    bool init();
    bool constructWindow
    (
        const char* windowName,
        unsigned int xWindowPos,
        unsigned int yWindowPos,
        unsigned int windowWidth,
        unsigned int windowHeight,
        bool fullScreen = false
    );

    void render();
    void update();
    SDL_Window* getWindow();
    bool handleEvents();

protected:


private:
    SDL_Window* window = nullptr;
    SDL_Renderer* renderer = nullptr;
    SDL_Event event;
    bool quit = false;

};

game.cpp:

    #include "game.h"
    
    bool Game::init()
    {
        if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
            return true;
        else
            std::cout << "Could not initialise SDL" << '\n' << "Error: " << SDL_GetError() << std::endl;
    }
    
    bool Game::constructWindow(const char* windowName, uint16_t xWindowPos, uint16_t yWindowPos
        , uint16_t windowWidth, uint16_t windowHeight, bool fullScreen)
    {
        window = SDL_CreateWindow(windowName, xWindowPos, yWindowPos, windowWidth, windowHeight, fullScreen);
        if (!window)
            std::cout << "Could not create window" << '\n' << "Error: " << SDL_GetError() << std::endl;
    
        return window;
    }
    
    void Game::render()
    {
        renderer = SDL_CreateRenderer(window, -1, 0);
        if (!renderer)
            std::cout << "Failed to create a renderer" << '\n' << "Error: " << SDL_GetError() << std::endl;
    }
    
    void Game::update()
    {
        SDL_RenderPresent(renderer);
    }
    
    SDL_Window* Game::getWindow()
    {
        return window;
    }
    
    bool Game::handleEvents()
    {
        while (SDL_PollEvent(&event))
            if (event.type == SDL_QUIT)
                quit = true;
        return quit;
    }

main.cpp

#include "game.h"

int main(int argc, char* argv[])
{
    Game app;
    if (app.init())
        if (app.constructWindow("3D Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1200, 600))
            while (!app.handleEvents())
            {
                app.render();
                app.update();
            }

    SDL_DestroyWindow(app.getWindow());
    SDL_Quit();

    return EXIT_SUCCESS;

}

标签: c++sdl-2

解决方案


推荐阅读