绘制同一矩形的多个实例,而不是移动它

Drawing multiple instances of the same rect instead of moving it

本文关键字:移动 实例 绘制      更新时间:2023-10-16
class Pong {
public:
    Pong(int speed) {
        gSpeed = speed;
        gPongBG = SDL_LoadBMP("pongBG.bmp");
        gPongBGSurf = gPongBG;
        gPongRect.w = 800;
        gPongRect.h = 460;
        gPongRect.x = 700;
        gPongRect.y = 220;
        gPongPlayer = SDL_LoadBMP("pongPlayer.bmp");
        gPongPlayerRect.h = 50;
        gPongPlayerRect.w = 10;
        gPongPlayerRect.x = 50;
        gPongPlayerRect.y = 0;

    }
    ~Pong() {

    }
    void drawPong() {
        gPongBGSurf = gPongBG;
        SDL_BlitSurface(gPongBGSurf, NULL, gScreenSurface, &gPongRect);
        SDL_BlitSurface(gPongPlayer, NULL, gPongBGSurf, &gPongPlayerRect);
    }
    void movePlayer() {
        gPongPlayerRect.y++;
    }

下面的代码使gPongPlayerRect制作自己的多个副本,而不是按照我的计划移动它。在代码的后面,我更新了名为 gWindow 的主窗口,主窗口的表面是 wScreenSurface。如果我将播放器直接放在窗口表面上,它会移动,所以我想问题是旧的 gPongBGSurf 表面即使在更新后也会保持。我最终如何解决这个问题?谢谢!

我的猜测是你忘了擦除Pong Surface:

Uint32 black= SDL_MapRGBA(gPongBGSurf->format,0,0,0,255);
SDL_FillRect(gPongBGSurf, NULL, black);
SDL_BlitSurface(gPongPlayer, NULL, gPongBGSurf, &gPongPlayerRect);
SDL_BlitSurface(gPongBGSurf, NULL, gScreenSurface, &gPongRect);

有关 SDL2 游戏的完整示例,其中多个表面相互重叠,然后到屏幕表面上,您可以阅读 Rock Dodger CE 的小源代码,它只是一个文件。