SDL2 изображение не обновляется без использования средств управления

Рейтинг: 0Ответов: 0Опубликовано: 23.04.2023

Скриншот игры

Вот такая проблема: написал по видеоурокам одного программиста с ютуба этот простенький код на С++ и SDL2, все работает, но изображения и передвижение обновляется, только когда используются элементы управления (т.е движение курсора, любые клавиши клавиатуры и мыши). Уже несколько дней вожусь с этой проблемой сам и с GPT - ничего дельного я не нашел, поэтому решил обратиться сюда. Заранее извиняюсь за использования не относительных путей к файлам, были проблемы с их использованием. Если надо будет приложить какие-то другие файлы этого проекта, дайте знать.

Пробовал переносить участки кода связанные с рендерингом и задержкой, также менять их код по предложениям ChatGpt - это ни к чему не привело. Еще стоит упомянуть, что, когда писал игру на SFML, была такая же проблема.

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

Буду неимоверно благодарен, если кто-то сможет помочь.

#include <SDL.h>
#include <cstdlib>
#include <vector>

#include "RenderWindow.h"
#include "Entity.h"
#include "Utils.h"
#include "Ball.h"
int main(int argc, char* args[])
{
    if (SDL_Init(SDL_INIT_VIDEO) > 0)
    {
        std::stringstream ss;
        ss << "HEY... SDL_Init has failed. SDL_ERROR : " << SDL_GetError() << "\n";
        OutputDebugString(ss.str().c_str());
    }

    if (!(IMG_Init(IMG_INIT_PNG)))
    {
        std::stringstream ss;
        ss << "HEY... IMG_Init has failed. SDL_ERROR : " << SDL_GetError() << "\n";
        OutputDebugString(ss.str().c_str());
    }
    
    RenderWindow window("Project Grey", 600, 800 );

    SDL_Texture* backGroundTexture = window.loadTexture("E:\\Visual studio projects\\SDL2 Project1\\SDL2 Project1\\res\\gfx\\golf_grass.png");
    SDL_Texture* ballTexture = window.loadTexture("E:\\Visual studio projects\\SDL2 Project1\\SDL2 Project1\\res\\gfx\\GolfBall.png");
    SDL_Texture* wallTexture = window.loadTexture("E:\\Visual studio projects\\SDL2 Project1\\SDL2 Project1\\res\\gfx\\block_ver2.png"); // Declare textures

    vector<Entity>Entities {Entity(Vector2f(200, 200), wallTexture, Vector2fSize(200, 100)) }; // Declare entities
    Ball ball(Vector2f(100, 200), ballTexture, Vector2fSize(20, 20));
    bool quit = false;
    SDL_Event event;
    const float timeStep = 0.01f;
    float accumulator = 0.0f;
    float currentTime = utils::hireTimeInSeconds();
    while (!quit)
    {
        int startTicks = SDL_GetTicks();
        float newTime = utils::hireTimeInSeconds();
        float frameTime = newTime - currentTime;
        currentTime = newTime;
        accumulator += frameTime;
        while (accumulator >= timeStep) 
        {
            while (SDL_PollEvent(&event)) // All events here
            {
                switch (event.type)
                {
                    case SDL_QUIT:
                    {
                        quit = true;
                        break;
                    }
                    case SDL_KEYDOWN:
                    {
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                        {
                            quit = true;
                        break;
                        }
                        if (event.key.keysym.sym == SDLK_1)
                        {
                            ball.moving();
                        }
                    }

                    default:
                        break;
                }
                ball.checkBallStatus();
            }
            accumulator -= timeStep;
        }

        window.clear();
        window.render(backGroundTexture); //Render background
        for (Entity& e : Entities) //Render entities
        {
            window.render(e);
        } 
        window.render(ball);
        window.display();
        int frameTicks = SDL_GetTicks() - startTicks;
        if (frameTicks < SDL_RENDERER_PRESENTVSYNC) // Making a little delay in rendereing
        {
            SDL_Delay(SDL_RENDERER_PRESENTVSYNC - frameTicks);
        }
    }

    SDL_DestroyTexture(ballTexture);
    SDL_DestroyTexture(backGroundTexture);
    SDL_DestroyTexture(wallTexture);
    window.cleanUp();
    return 0;
}

Ответы

Ответов пока нет.