为什么渲染的正方形重复?

时间:2019-05-07 14:46:06

标签: c++ sdl sdl-2

我的问题是,当我运行programm时,它将正常运行10-20秒左右,然后出现故障。您可以进一步了解视频中发生的情况。

https://youtu.be/YOlhjQFTzZc

这个错误困扰着我一个多月,首先,我认为这是在缩短渲染功能方面的一个错误。但不是。 您可以在这里看到它。

void Render(char * image_place, int object_x, int object_y)
{
    SDL_Surface * object_image = IMG_Load(image_place);
    SDL_Rect object_position;
    object_position.x=object_x;
    object_position.y=object_y;
    SDL_BlitSurface(object_image, NULL, ekran, &object_position);

}

但是当我开始对此主题进行更多“研究”时,我发现即使不使用此功能,它也会发生!

这是视频中的代码:

#include <iostream>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_mixer.h>
#include <SDL2/SDL_ttf.h>
#include <windows.h>
#include <time.h>

using namespace std;

//SDL
SDL_Window * okno;
SDL_Surface * ekran;
SDL_Rect pozycja_obramowki;
SDL_Event zdarzenie;
SDL_Rect tlo_pos;

//zmienne
int x_obraz=0;
int y_obraz=0;

int main(int argc, char*args[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    okno = SDL_CreateWindow("LevelEditor",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED, 1280, 720, NULL);
    ekran = SDL_GetWindowSurface(okno);

    while(true)
    {
        {//render
            SDL_Surface * tlo = IMG_Load("biel.png");
            tlo_pos.x=0;
            tlo_pos.y=0;
            SDL_BlitSurface(tlo,NULL, ekran, &tlo_pos);

            SDL_Surface * obramowka = IMG_Load("obramowka.png");
            pozycja_obramowki.x=x_obraz;
            pozycja_obramowki.y=y_obraz;
            SDL_BlitSurface(obramowka,NULL, ekran, &pozycja_obramowki);
        }
        {//zdarzenia
            if(SDL_PollEvent(&zdarzenie))
            {
                if(zdarzenie.type==SDL_QUIT)
                {
                    return 0;
                }
            }


        }
        {//sterowanie
            if(GetAsyncKeyState(VK_RIGHT)) {x_obraz=x_obraz+5;}
            if(GetAsyncKeyState(VK_LEFT)) {x_obraz=x_obraz-5;}
            if(GetAsyncKeyState(VK_UP)) {y_obraz=y_obraz-5;}
            if(GetAsyncKeyState(VK_DOWN)) {y_obraz=y_obraz+5;}

        }
        {//fps end & odswiezanie ekranu
            SDL_UpdateWindowSurface(okno);

        }
    }

}

如果我写错了什么或解释错了什么,请随时评论此帖子。谢谢您的帮助。 )

1 个答案:

答案 0 :(得分:2)

您不应重复致电IMG_Load。 (我怀疑您很快就会耗尽内存。)

在启动时加载所有图像,并将指针存储到生成的表面。

// Moved out of the loop
SDL_Surface * tlo = IMG_Load("biel.png");
SDL_Surface * obramowka = IMG_Load("obramowka.png");

while(true)
{
    // As before, but without declaring the variables mentioned above.
}