python - 图片不更新pygame

标签 python pygame

我正在尝试更新箭头键,使其看起来就像被按下一样。但是,它们似乎不会在单击时更新,而是屏幕闪烁但实际上没有任何变化。我对使用 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))

图像最初是在游戏本身的游戏/运行部分中 blits 到屏幕上的:

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

任何帮助或简化此过程的方法/建议将不胜感激!

最佳答案

声明

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

             # [...]

关于python - 图片不更新pygame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55269849/

相关文章:

python - 在 Django 模板中显示抓取的结果

python - 如何在opengl和pygame中用键盘按键移动立方体?

python - 为什么球的行为方式是这样的?

python - For 循环中列表索引超出范围

python - 如何向窗口添加第二个弹跳球?

python - 如何将鼠标按钮选择存储在列表中?

python - Tkinter 窗口稍微偏离中心

python - python 2 和 3 中的 __float__ 和 __round__

python - Pytesseract : Error opening data file\\Program Files (x86)\\Tesseract-OCR\\en. 训练数据

python - Jupyter 中的 "No Module Named"错误