SDL2不会将在单独函数中创建的图像渲染到SDL_RenderPresent(C ++)

时间:2018-01-04 22:02:09

标签: c++ sdl-2

我将Visual Studio社区用作IDE。

我的主要问题是我的代码根本没有将渲染器生成的信息呈现在窗口上。它打开一个空白的白色窗口,上面没有任何东西。但是,奇怪的是,没有构建错误,每行代码都运行,只是没有任何内容。

在搜索问题之后,我发现很多(如果不是全部)代码示例都没有拆分成多个函数,所以我无法比较问题。 在考虑了这个之后,我将我的代码更改为另一个版本,该版本基本上具有所有渲染和生成(相同的基本代码如下),在一个函数中具有' SDL_RenderPresent'在该功能的最后。 这适用于代码的一部分,即产生平铺草背景的部分,但不适用于随机放置的兔子精灵。 我也搜索了这个问题,但同样没有找到任何内容,就像他们想要呈现的部分一样。

我知道我的问题包含一些问题,这些问题可能应该在单独的问题中,但似乎从问题到问题,所以我已经在所有方面获得了更多的知识。

这是我的Display.cpp文件,我怀疑问题所在。

#include "Display.h"

Display::Display(){

}


Display::~Display(){

}

void Display::World() {

    //Gets display size to scale from :)
    SDL_DisplayMode screen;
    SDL_GetDesktopDisplayMode(0, &screen);
    int screenW = screen.w; //These produce 0 for some reason??
    int screenH = screen.h; // ^^
    //Fin

    SDL_Window * window = SDL_CreateWindow("SDL2 Displaying Image", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, screenW, screenH - 20, SDL_WINDOW_SHOWN);
    SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_TARGETTEXTURE || SDL_RENDERER_ACCELERATED);

    SDL_Surface * surfaceGrass = IMG_Load("Grass.jpg");     //Grass Sprite is 200 by 200 px
    SDL_Texture * grass = SDL_CreateTextureFromSurface(renderer, surfaceGrass);

    SDL_FreeSurface(surfaceGrass);

    //Start of grass make things
    int grassW = screenW * 0.25;
    int grassH = grassW;
    int vertical;


    for (int i = 0; i <= 3; i++) {
        switch (i) {
        case(0):
            vertical = 0;
            break;
        case(1):
            vertical = grassW;
            break;
        case(2):
            vertical = 2 * grassW;
            break;
        }
        for (int j = 0; j < screenW; j = j + grassW) {
            SDL_Rect screenRectForGrass = { j, vertical, grassW, grassH };
            SDL_RenderCopy(renderer, grass, NULL, &screenRectForGrass);
        }

    }
    //End of grass make things

    MakeRabbit();
}

void Display::MakeRabbit() {

    int colour = rand() % 10;

    if (colour <= 3) {
        std::cout << "Colour statement" << std::endl;
        SDL_Surface * surfaceRabbit = IMG_Load("Brown Rabbit.jpg"); //Produces a square 50 by 50 pixels
        SDL_Texture * rabbit = SDL_CreateTextureFromSurface(renderer, surfaceRabbit);

    }

    else {
        std::cout << "Colour statement" << std::endl;
        SDL_Surface * surfaceRabbit = IMG_Load("Black Rabbit.jpg");
        SDL_Texture * rabbit = SDL_CreateTextureFromSurface(renderer, surfaceRabbit);

    }

    int randomX = rand() % 50;
    int randomY = rand() % 50;

    SDL_Rect screenRectForRabbit = { randomX, randomY, 50, 50 };
    SDL_RenderCopy(renderer, rabbit, NULL, &screenRectForRabbit);

    DisplayRenderer();

}

void Display::DisplayRenderer() {

    SDL_RenderPresent(renderer);

    Quit();
}

void Display::Quit() {
    bool quit = false;
    SDL_Event event;

    while (!quit) {

        SDL_WaitEvent(&event);

        switch (event.type)
        {
        case SDL_QUIT:
            quit = true;
            break;
        }

    }

    SDL_DestroyTexture(grass);
    SDL_DestroyTexture(rabbit);

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);

    SDL_FreeSurface(surfaceRabbit);
}

Display.h文件

#include <iostream>
#include <SDL.h>   
#include <SDL_image.h>
#include <time.h>
#include <stdlib.h>

using namespace std;

class Display{

private:
    SDL_Window * window;
    SDL_Renderer * renderer;

    SDL_Surface * surfaceGrass;
    SDL_Surface * surfaceRabbit;

    SDL_Texture * rabbit;
    SDL_Texture * grass;

private:
    int screenW;
    int screenH;

public:
    Display();
    ~Display();

    void MakeRabbit();
    void World();

    void DisplayRenderer();
    void Quit();
};

和Main.cpp

#include "Display.h"


int main(int argc, char ** argv){

    srand(time(NULL));
    SDL_Init(SDL_INIT_EVERYTHING);
    IMG_Init(IMG_INIT_JPG);

    Display Main;
    Main.World();

    SDL_Quit();
    IMG_Quit();

    return 0;
}

1 个答案:

答案 0 :(得分:2)

每次分配时,您都在重新定义几个变量。

而不是

SDL_Texture * rabbit = ...

使用

rabbit = ...

这将使用您已在类中定义的SDL_Texture * rabbit变量。你这样做会产生两个不同的指针,都叫做rabbit,但是在不同的范围内。