Я пытаюсь научиться создавать игру (я новичок в c ++), и я застрял в этой проблеме:
У меня есть 2 потока, один для рендеринга (я не задерживаю там, поэтому он будетрендеринг кадров так быстро, как может компьютер), и другой поток для обновления и обработки событий, таких как нажатие клавиш и т. д. (и я сохраняю задержку в течение 8 миллисекунд, чтобы она исправляла обновление, чтобы она не имела значения для fps компьютера),на данный момент этот поток перемещает игрока на 1 пиксель вправо в каждом обновлении.
Код:
#include <iostream>
#include "SDL.h"
#include "GameM.h"
#include <thread>
#undef main
GameM *game = nullptr;
void rendering() {
while (game->running()) {
game->render();
}
}
void updating() {
while (game->running()) {
game->handleEvents();
game->update();
SDL_Delay(8);
}
}
int main()
{
game = new GameM();
game->init("Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640,400,SDL_WINDOW_SHOWN|SDL_WINDOW_BORDERLESS);
//thread initialize
std::thread rendering(rendering);
std::thread updating(updating);
//Makes main thread to wait to the threads to finish
rendering.join();
updating.join();
//cleans
game->clean();
return 0;
}
Хотя, когда я запускаю программу:
- , иногда игрок просто застревает на секунду, а затем продолжает нормально двигаться.
- когда я запускаю программу, мышь переходит к значку ожидания, и иногда программа просто падает, говоря, что программа не отвечает.
Нужна ваша помощь умных людей :)
EDIT3:
GameM *game = nullptr;
const float FPS = 60.0;
const float desFPS = 1000.0 / 60.0;
Uint32 firstframe;
float delta;
void updating() {
while (game->running()) {
firstframe = SDL_GetTicks();
game->handleEvents();
game->update();
delta = SDL_GetTicks() - firstframe;
if (desFPS > delta) {
SDL_Delay(desFPS - delta);
}
}
}
int main()
{
game = new GameM();
game->init("Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640,400,SDL_WINDOW_SHOWN|SDL_WINDOW_BORDERLESS);
std::thread updating(updating);
while (game->running()) {
game->render();
}
updating.join();
game->clean();
return 0;
}
void GameM::handleEvents() {
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
isRunning = false;
std::cout << "STOP" << std::endl;
break;
}
}
}
void GameM::update(){
dstR.x += 1;
}
void GameM::render() {
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, tex, NULL, &dstR); // render asset to window
SDL_RenderPresent(renderer);
}