Экран Pygame очищается при переворачивании, но только один раз - PullRequest
1 голос
/ 15 марта 2019

Итак, я пытаюсь воссоздать тральщика в пигме.Поскольку я нажимаю только одно изображение поверх моего текущего экрана, когда игрок нажимает, у меня нет рамок.Проблема в том, что когда игрок впервые щелкает, а я рисую одно изображение, переворачиваем дисплей.В первый раз, когда я делаю это, он очищает фон.После этого он не очищает предыдущие изображения.Если я попробую сначала назвать 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 появляется над ячейкой, но вместо этого фон закрашивается черным.

1 Ответ

0 голосов
/ 15 марта 2019

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

Обратите внимание: если размер окна был изменен, а поверхность окна была воссоздана, то необходимо перерисовать всю сцену.
Вероятно, ваша игра будет работать только в том случае, если размер окна не изменяется. При изменении размера окна происходит новое событие. Поверхность воссоздается, а фон перерисовывается, но «нажатые» поля теряются. Поэтому их тоже придется перерисовывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...