我正在研究Space Invaders模拟器,为了显示输出,我正在使用SDL2。
问题是自仿真开始以来,在输出窗口中我看到了所有帧!
基本上重要的代码是这样的:
Intel8080 mainObject; // My Intel 8080 CPU emulator
mainObject.loadROM();
//Main loop flag
bool quit = false;
//Event handler
SDL_Event e;
//While application is running
while (!quit)
{
//Handle events on queue
while (SDL_PollEvent(&e) != 0)
{
//User requests quit
if (e.type == SDL_QUIT)
{
quit = true;
}
}
if (mainObject.frameReady)
{
mainObject.frameReady = false;
gHelloWorld = SDL_CreateRGBSurfaceFrom(&mainObject.frameBuffer32, 256, 224, 32, 4 * 256, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);
//Apply the image
SDL_BlitSurface(gHelloWorld, NULL, gScreenSurface, NULL);
//Update the surface
SDL_UpdateWindowSurface(gWindow);
}
mainObject.executeROM();
}
其中Intel8080是我的CPU仿真器代码,mainObject.frameBuffer32是“太空侵略者”的视频RAM,为了使用SDL_CreateRGBSurfaceFrom函数,我将其从1bpp转换为32bpp。
仿真工作正常,但是我看到了自模拟器启动以来生成的所有帧!
我试图在每个RGBA像素的4个字节中更改Alpha值,但没有任何变化
答案 0 :(得分:0)
之所以发生这种情况,是因为看起来您在渲染游戏时没有先清除窗口。基本上,您应该用一种颜色填充整个窗口,然后不断在其上进行渲染。这个想法是,在渲染窗口之前用特定的颜色填充窗口等同于擦除前一帧(大多数现代计算机都具有足够的能力来处理此问题)。
您可能想阅读SDL的SDL_FillRect函数,它可以让您用特定的颜色填充整个屏幕。
渲染伪代码:
while(someCondition)
{
[...]
// Note, I'm not sure if "gScreenSurface" is the proper variable to use here.
// I got it from reading your code.
SDL_FillRect(gScreenSurface, NULL, SDL_MapRGB(gScreenSurface->format, 0, 0, 0));
SDL_BlitSurface(gHelloWorld, NULL, gScreenSurface, NULL);
SDL_UpdateWindowSurface(gWindow);
[...]
}