SDL, как я могу заставить фоновое изображение отображаться?

#c #background #rendering #sdl #sdl-2

#c #фон #рендеринг #sdl #sdl-2

Вопрос:

У меня была проблема с рендерингом, но я это исправил. Проблема в том, что изображение на самом деле не отображается. Я знаю, что изображение загружается, потому что у меня есть обработчик ошибок, если оно не загружено. Я знаю, что код грязный, но мне просто нужно, чтобы изображение отображалось.

 #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);
    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);
    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);
    }

    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; //Don't worry about this camera, I need this after i get the background working.
    camera.y = 0;
    camera.w = 800;
    camera.h = 600;
    bool b[2] = {0,0};
    Uint32 start;

    bool running = true;
    while (running)
    {
        start = SDL_GetTicks();
        SDL_Event event;

        while(SDL_PollEvent(amp;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;
}
 

Комментарии:

1. В вашем вопросе много противоречий. Как вы можете узнать, что рендеринг корректен, если изображение не отображается? Если обработчик ошибок сообщает, что оно не загружено, как он сообщает вам, что оно загружено?

2. Обработчик ошибок говорит, что ничего не говорит, вот как я узнаю, что он загружен, это выдаст мне ошибку.

3. @bigshooter вы инициализировали b[1] 0 , вы пробовали использовать обработчик событий (т.Е. SDLK_LEFT)?

Ответ №1:

Вы инициализировали b[1] 0 , и текстура отображается только тогда, когда b[1] 1 она такая, как в вашем коде.
Вы должны либо поместить строки:

 SDL_RenderCopy(renderer, texture, NULL, NULL);
 SDL_RenderPresent(renderer);
 

перед циклом
или нажмите левую клавишу на клавиатуре (т. Е. SDLK_LEFT )
, Чтобы отобразить и представить изображение на экране.

Это работает в моей системе, поэтому оно должно работать и в вашей.

Комментарии:

1. Спасибо за это, я не обратил внимания на свой собственный код. Эти две строки были неуместны. Теперь у меня это работает.

2. Сначала посмотрите на свой код так, как вы бы смотрели на код других, если вы все еще не видите проблемы, тогда опубликуйте ее на SO. Мы будем рады помочь здесь. 🙂