Изображения не обновляют Pygame - PullRequest
3 голосов
/ 20 марта 2019

Я пытаюсь обновить клавиши со стрелками, чтобы они выглядели так, как будто они нажаты. Тем не менее, они, кажется, не обновляются при каждом нажатии, и вместо этого экран мерцает, но на самом деле ничего не меняется. Я относительно новичок в программировании на Python с Pygame и не знаю, как решить проблему. Это функция, которую я имею для проверки, если она нажата:

import pygame

class Button():
    def __init__(self, x, y, xSize, ySize):
        self.x = x
        self.y = y
        self.xSize = xSize
        self.ySize = ySize

    def checkClicked(self):
        if pygame.mouse.get_pressed()[0]:
            x, y = pygame.mouse.get_pos()
            if y > self.y and y < self.y + self.ySize and x > self.x and x < 
self.x + self.xSize:
                print('Clicked')
                return True
        return False

Это объекты, представляющие кнопки, которые вы можете щелкнуть, чтобы изменить изображения и переместить проигрыватель:

leftObject = Button(765, 800, 68, 78)
rightObject = Button(910, 800, 70, 81)
upObject = Button(835, 725, 70, 80)
downObject = Button(835, 800, 70, 82)

leftArrow = pygame.transform.scale(pygame.image.load('leftarrow.png'), (68, 
78))
rightArrow = pygame.transform.scale(pygame.image.load('rightarrow.png'), (70, 
81))
upArrow = pygame.transform.scale(pygame.image.load('uparrow.png'), (70, 80))
downArrow = pygame.transform.scale(pygame.image.load('downarrow.png'), (70, 
82))

Это объект, который перемещается на основе ввода с клавиатуры пользователя или нажатия кнопок на экране:

class Player(object):
    def __init__(self, x, y, filename, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.image = pygame.transform.scale(pygame.image.load(filename), 
(self.width, self.height))

Это событие, которое проверяет, нажал ли пользователь на них или нажал клавиши со стрелками, чтобы вызвать изменение изображения:

    def moveEvent(self, event):
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                if leftObject.checkClicked():
                    leftArrow = 
pygame.transform.scale(pygame.image.load('leftarrowdown.png'), (68, 78))
                    pygame.display.update()
                    self.x -= 25

                if rightObject.checkClicked():
                    rightArrow = 
pygame.transform.scale(pygame.image.load('rightarrowdown.png'), (70, 81))
                    pygame.display.update()
                    self.x += 25

                if upObject.checkClicked():
                    upArrow = 
pygame.transform.scale(pygame.image.load('uparrowdown.png'), (70, 80))
                    pygame.display.update()
                    self.y -= 25

                if downObject.checkClicked():
                    downArrow = 
pygame.transform.scale(pygame.image.load('downarrowdown.png'), (70, 82))
                    pygame.display.update()
                    self.y += 25

        elif event.type == pygame.MOUSEBUTTONUP:
            if event.button == 1:
                # Left
                leftArrow = 
pygame.transform.scale(pygame.image.load('leftarrow.png'), (68, 78))
                pygame.display.update()
                # Right
                rightArrow = 
pygame.transform.scale(pygame.image.load('rightarrow.png'), (70, 81))
                pygame.display.update()
                # Up
                upArrow = 
pygame.transform.scale(pygame.image.load('uparrow.png'), (70, 80))
                pygame.display.update()
                # Down
                downArrow = 
pygame.transform.scale(pygame.image.load('downarrow.png'), (70, 82))
                pygame.display.update()

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
            leftArrow = 
pygame.transform.scale(pygame.image.load('leftarrowdown.png'), (68, 78))
                self.x -= 25

            if event.key == pygame.K_RIGHT:
                rightArrow = 
pygame.transform.scale(pygame.image.load('rightarrowdown.png'), (70, 81))
                self.x += 25

            if event.key == pygame.K_UP:
                upArrow = 
pygame.transform.scale(pygame.image.load('uparrowdown.png'), (70, 80))
                self.y -= 25

            if event.key == pygame.K_DOWN:
                downArrow = 
pygame.transform.scale(pygame.image.load('downarrowdown.png'), (70, 82))
                self.y += 25

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                leftArrow = 
pygame.transform.scale(pygame.image.load('leftarrow.png'), (68, 78))
                pygame.display.update()

            if event.key == pygame.K_RIGHT:
                rightArrow = 
pygame.transform.scale(pygame.image.load('rightarrow.png'), (70, 81))
                pygame.display.update()

            if event.key == pygame.K_UP:
                upArrow = 
pygame.transform.scale(pygame.image.load('uparrow.png'), (70, 80))
                pygame.display.update()

            if event.key == pygame.K_DOWN:
                downArrow = 
pygame.transform.scale(pygame.image.load('downarrow.png'), (70, 82))
                pygame.display.update()

    def draw(self, screen):
        screen.blit(self.image, (self.x, self.y))

Изображения изначально перетаскиваются на экран в части Game / Run самой игры:

class Game(object):
    def __init__(self):
        self.screensize = [1000, 1000]
        self.white = [255, 255, 255]
        self.black = [0, 0, 0]
        self.screen = pygame.display.set_mode(self.screensize)
        #self.bunny = pygame.transform.scale(pygame.image.load('bunny.png'), 
(150, 200))
        self.clock = pygame.time.Clock()
        self.player = Player(50, 350, 'bunny.png', 150, 200)

    def Run(self):
        run = True
        while run:
            self.clock.tick(60)
            self.screen.fill(self.white)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
                    pygame.quit()
                    exit()
                elif event.type == pygame.K_ESCAPE:
                    run = False
                    pygame.quit()
                    exit()
                # - Objects Event Handle - 
                self.player.moveEvent(event)

            # - Draws - 
            self.player.draw(self.screen)
            self.screen.blit(leftArrow, (765, 800))
            self.screen.blit(rightArrow, (910, 800))
            self.screen.blit(upArrow, (835, 725))
            self.screen.blit(downArrow, (835, 800))
            pygame.display.flip()


game = Game()
game.Run()

Любая помощь или способ / совет, чтобы упростить это будет высоко ценится!

1 Ответ

1 голос
/ 21 марта 2019

Устав

leftArrow = pygame.transform.scale(pygame.image.load('leftarrowdown.png'), (68, 78))

устанавливает локальную переменную leftArrow в области действия метода moveEvent.
Использование global оператор для интерпретации переменных как глобальных.

Далее обратите внимание, что все операторы

pygame.display.update()

в moveEvent излишни, это время обновления вызывает мерцание.
Достаточно одного оператора pygame.display.flip() в конце основного цикла.Удалите все pygame.display.update() звонки из метода moveEvent.

например

def moveEvent(self, event):

    global leftArrow, rightArrow, upArrow, downArrow # <----- add

    if event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == 1:
            if leftObject.checkClicked():
                leftArrow = pygame.transform.scale(pygame.image.load('leftarrowdown.png'), (68, 78))

                # pygame.display.update() <----- remove

                self.x -= 25

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