pygame屏幕在翻转时被清除,但只有一次



所以我正在尝试在Pygame中重新捕捉扫雷器。由于当玩家单击时,我只在当前屏幕上绘制一个图像,因此我没有框架。问题是,当播放器首次点击时,我绘制一个图像翻转显示器。我第一次这样做,它清除了背景。之后,它无法清除先前的图像。如果我尝试将Flip打电话给第一件事,什么也不会发生。我试图在每个图像(只是尝试事物)之后翻转,没有任何改变。

代码:

    import pygame, random, os, sys, math
pygame.init()
font = pygame.font.SysFont('Sans Serif 7', 15)
screenX = 1240
screenY = 720
sprites = pygame.image.load(os.path.dirname(os.path.abspath(__file__)) + "\Minesweeper\ImageSheet.png")
spriteList = []
#tiles = 16px, icons = 26px
class Minefield():
    def __init__(self, width, height, mines, surface):
        self.width = width
        self.height = height
        self.mine = sprites.subsurface(80, 49, 16, 16)
        self.rows = []
        self.surface = surface
        for i in range(0, width):
            self.rows.append([])
            for i2 in range(0, height):
                self.rows[i].append(-2)
        for i in range(0, mines):
            print(len(self.rows))
            print(len(self.rows[1]))
            x = random.randint(0, width-1)
            y = random.randint(0, height-1)
            print(x)
            print(y)
            self.rows[x][y]
        self.render()
    def clicked(self, rawPos):
        pos = (math.floor(rawPos[0]/16), math.floor(rawPos[1]/16))
        val = self.rows[pos[0]][pos[1]]
        if val == -2:
            mines = 1
            if not pos[0] == 0 and not pos[1] == 0 and self.rows[pos[0]-1][pos[1]-1] == -1:
                mines += 1
            if not pos[0] == 0 and self.rows[pos[0]-1][pos[1]] == -1:
                mines += 1
            if not pos[0] == 0 and not pos[1] == self.height and self.rows[pos[0]-1][pos[1]+1] == -1:
                mines += 1
            if not pos[1] == 0 and self.rows[pos[0]][pos[1]-1] == -1:
                mines += 1
            if not pos[1] == self.height and self.rows[pos[0]][pos[1]+1] == -1:
                mines += 1
            if not pos[1] == 0 and not pos[0] == self.width and self.rows[pos[0]+1][pos[1]-1] == -1:
                mines += 1
            if not pos[0] == self.width and self.rows[pos[0]+1][pos[1]] == -1:
                mines += 1
            if not pos[1] == self.height and not pos[0] == self.width and self.rows[pos[0]+1][pos[1]+1] == -1:
                mines += 1
            print(mines)
            self.surface.blit(spriteList[mines], (pos[0]*16, pos[1]*16))
            pygame.display.flip()
        elif val == -1:
            playing = False
            return
    def render(self):
        for i in range(0, self.width):
            for i2 in range(0, self.height):
                self.surface.blit(spriteList[0], (i*16, i2*16))
        pygame.display.flip()
class Main():        
    def __init__(self):
        self.screen = pygame.display.set_mode((screenX, screenY), pygame.RESIZABLE)
        spriteList.append(sprites.subsurface(16, 49, 16, 16))
        for i in range(0, 8):
            print(i*16)
            spriteList.append(sprites.subsurface(i*16, 65, 16, 16))
        self.field = Minefield(50, 30, 30, self.screen)
    def gameloop(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.VIDEORESIZE:
                    screenX = event.w
                    screenY = event.h
                    self.screen = pygame.display.set_mode((event.w, event.h), pygame.RESIZABLE)
                if event.type == pygame.QUIT:
                    return
                if event.type == pygame.MOUSEBUTTONUP:
                    pos = pygame.mouse.get_pos()
                    self.field.clicked(pos)
    def stop(self):
        pygame.display.quit()
        pygame.quit()
        sys.exit("Window Closed")
main = Main()
main.gameloop()
main.stop()

我想要的:在播放器上单击唯一的更改是单元格上出现一个1,而是通过黑色绘制背景。

pygame.display.set_mode()创建一个新的窗口表面。在调整大小事件中重新创建窗口表面后,您可以渲染背景。初始化窗口时,请立即进行1个调整大小事件。

def gameloop(self):
    while True:
        for event in pygame.event.get():
            if event.type == pygame.VIDEORESIZE:
                screenX = event.w
                screenY = event.h
                self.screen = pygame.display.set_mode((event.w, event.h), pygame.RESIZABLE)
                self.field.render() # <-------------

注意,重大窗口并重新创建窗口表面时,必须重新绘制整个场景。
如果窗口无法解析,则可能只有您的游戏才能起作用。调整窗口大小时,会发生新事件。重新创建表面并重新绘制背景,但"点击"字段丢失了。因此,它们也必须重新绘制。

最新更新