【问题标题】:Pygame screen gets cleared on flip, but only oncePygame屏幕在翻转时被清除,但只有一次
【发布时间】:2019-03-15 19:42:55
【问题描述】:

所以我试图在 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,但背景被涂成黑色。

【问题讨论】:

  • 您将需要使用update() 而不是flip() 来仅更改游戏窗口的一小部分(即在您单击的单元格上)。这个问题似乎详细回答了你的问题:stackoverflow.com/questions/29314987/…

标签: python-3.x pygame


【解决方案1】:

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() # <-------------

注意,当调整窗口大小并重新创建窗口表面时,必须重新绘制整个场景。
可能只有在窗口不可调整大小的情况下,您的游戏才能工作。当您调整窗口大小时,会发生一个新事件。重新创建表面并重新绘制背景,但“单击”字段丢失。所以它们也必须重新绘制。

【讨论】:

  • 谢谢,不知道它有一个未决的调整大小事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多