我注意到我的 SDLD2/C++ 应用程序无法正常工作,或者我没有进行任何更改。所以我尝试在 Ubuntu 22.04 VM 上执行它并且它有效。经过几次测试后,我注意到如果我从 std::tread Tread 函数中取出渲染函数,它就会重新工作。但是我的程序现在在“程序”功能未完成时卡住了。
这是我的代码(在注释之前的线程实现中):
#include <SDL2/SDL.h>
#include <array>
#include <cstdlib>
#include <time.h>
#include <thread>
#include "const.hpp"
#include "maze_crea.hpp"
#include "maze_solver.hpp"
void program(SDL_Window* pWindow, SDL_Renderer* pRenderer){
std::array<int, MAZE_SIZE<int>> maze;
std::array<SDL_Rect, MAZE_SIZE<int>> squares;
for (int i = 0; i < MAZE_SIZE<int>; i++){
squares[i] = { (i % SIDE_SIZE<int>) * (WIDTHSCREEN<int> / SIDE_SIZE<int>), (i / SIDE_SIZE<int>) * (HEIGHTSCREEN<int> / SIDE_SIZE<int>), WIDTHSCREEN<int> / SIDE_SIZE<int>, HEIGHTSCREEN<int> / SIDE_SIZE<int> };
if (((i % SIDE_SIZE<int>) % 2 == 0) || ((i / SIDE_SIZE<int>) % 2 == 0)){
maze[i] = 0;
} else {
maze[i] = i;
}
}
SDL_SetWindowTitle(pWindow, "Maze Solver (creation)");
mazeCrea(pRenderer, maze, squares);
SDL_SetWindowTitle(pWindow, "Maze Solver (solution)");
mazeSolver(pRenderer, maze, squares);
}
int main(int argc, char* argv[])
{
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "[DEBUG] > %s", SDL_GetError());
return EXIT_FAILURE;
}
SDL_Window* pWindow{ nullptr };
SDL_Renderer* pRenderer{ nullptr };
if (SDL_CreateWindowAndRenderer(WIDTHSCREEN<unsigned int>, HEIGHTSCREEN<unsigned int>, SDL_WINDOW_SHOWN, &pWindow, &pRenderer) < 0)
{
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "[DEBUG] > %s", SDL_GetError());
SDL_Quit();
return EXIT_FAILURE;
}
srand(time(NULL));
//std::thread Thread(program, pWindow, pRenderer);
program(pWindow, pRenderer);
SDL_Event events;
while (true)
{
while (SDL_PollEvent(&events))
{
switch (events.type)
{
case SDL_QUIT:
SDL_DestroyRenderer(pRenderer);
SDL_DestroyWindow(pWindow);
SDL_Quit();
return EXIT_SUCCESS;
break;
}
}
}
//Thread.join();
SDL_DestroyRenderer(pRenderer);
SDL_DestroyWindow(pWindow);
SDL_Quit();
return EXIT_SUCCESS;
}
如何正确处理我的“程序”功能需要时间但我希望能够随时退出应用程序的情况,因此我的事件循环也需要可访问。
您需要将生成和求解代码与渲染分开。 最简单的方法就是将程序切成两半,在它们之间使用单个共享变量来传达状态。
在这种情况下,状态真的只是
maze
。
在主循环中,提前生成
squares
。然后,对于游戏循环的每次迭代,从 maze
读取状态并更新 squares
以匹配。maze
或辅助共享数据结构。