【问题标题】:Images not updating pygame图片不更新pygame
【发布时间】:2019-03-20 20:43:18
【问题描述】:

我正在尝试更新箭头键,使其看起来好像被按下了一样。但是,无论何时单击它们似乎都不会更新,而是屏幕闪烁,但实际上没有任何变化。我对使用 Pygame 在 python 中编程比较陌生,不知道如何解决这个问题。 这是我检查它是否被点击的功能:

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

任何帮助或方法/建议来简化这将不胜感激!

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    声明

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

    在方法moveEvent的范围内设置局部变量leftArrow
    使用global 语句将变量解释为全局变量。

    进一步说明,所有

    pygame.display.update()
    

    moveEvent 中的声明是多余的,此时更新会导致闪烁。
    主循环末尾的单个pygame.display.flip() 语句就足够了。从方法moveEvent 中删除所有pygame.display.update() 调用。

    例如

    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
    
                 # [...]
    

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 1970-01-01
      • 2022-11-05
      • 2021-11-14
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      相关资源
      最近更新 更多