SDL2 изображение не обновляется без использования средств управления
Вот такая проблема: написал по видеоурокам одного программиста с ютуба этот простенький код на С++ и 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;
}