Pygame屏幕一经翻转即可清除,但只有一次

时间:2019-03-15 19:42:56

标签: python-3.x pygame

所以我试图在pygame中重新创建Minesweeper。由于当播放器单击时我仅在当前屏幕上绘制单个图像,因此我没有框架。问题是,当播放器第一次单击时,我翻转显示器绘制了一张图像。我第一次这样做是为了清除背景。之后,它不会清除以前的图像。如果我尝试呼叫第一件事,则什么也不会发生。我试图翻转每张图片(只是尝试尝试),但没有任何改变。

代码:

    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,但是背景被黑色覆盖。

1 个答案:

答案 0 :(得分:0)

pygame.display.set_mode()创建一个新的窗口表面。您需要在resize事件中重新创建窗口表面后渲染背景。初始化窗口后,立即有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() # <-------------

请注意,当调整窗口大小并重新创建窗口表面时,必须重新绘制整个场景。
如果窗口无法调整大小,则您的游戏可能仅能正常工作。调整窗口大小时,将发生一个新事件。重新创建了表面并重新绘制了背景,但是“单击”字段丢失了。因此,它们也必须重新绘制。