【问题标题】:Can't move an image across screen in Pygame无法在 Pygame 中跨屏幕移动图像
【发布时间】:2020-05-27 13:05:05
【问题描述】:

我是 Python 的初学者,我正在尝试想出一个函数来在 Pygame 的帮助下绘制一个在屏幕上水平和垂直移动的正方形。当我们单击键盘上的箭头时,正方形应该会移动。

我的问题:虽然正方形显示在屏幕上,但它根本不动,但 Python 没有显示任何类型的错误。

有人知道缺少什么吗?提前致谢!

这是我目前所写的:

import pygame

altura_tela = 600
largura_tela = 800
tela = pygame.display.set_mode((largura_tela, altura_tela))

vermelho = (255, 0, 0)

altura_quadrado = 100
largura_quadrado = 100

def desenhaQuadrado(quadrado):
    pygame.draw.rect(tela, vermelho, (350,250,largura_quadrado, altura_quadrado))

def posicaoquadrado(quadradoPos):
    tela.blit(quadrado, (quadradoPos[0],quadradoPos[1]))

def moveQuadrado(teclas, quadradoPos):
    if teclas[0] and quadradoPos[1] > 0:
        quadradoPos[1] -= 20
    elif teclas[2] and quadradoPos[1] < 420:
        quadradoPos[1] += 20
    if teclas[1] and quadradoPos[0] > 0:
        quadradoPos[0] -= 20
    elif teclas[3]and quadradoPos[0] < 570:
        quadradoPos[0] += 20
    return quadradoPos

def main():
    pygame.init()
    teclas = [False, False, False, False]
    quadradoPos = [350,250]

    pygame.display.set_caption('Movimentação do Quadrado')

    terminou = False
    while not terminou:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:
                terminou = True

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    teclas[0] = True
                elif event.key == pygame.K_DOWN:
                    teclas[1] = True
                elif event.key == pygame.K_LEFT:
                    teclas[2] = True
                elif event.key == pygame.K_RIGHT:
                    teclas[3] = True

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP:
                    teclas[0] = False
                elif event.key == pygame.K_DOWN:
                    teclas[1] = False
                elif event.key == pygame.K_LEFT:
                    teclas[2] = False
                elif event.key == pygame.K_RIGHT:
                    teclas[3] = False

            quadradoPos = moveQuadrado(teclas, quadradoPos)
            desenhaQuadrado(quadradoPos)

            pygame.display.update()


    pygame.display.quit()

    pygame.quit()

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    在你的函数中:

    def desenhaQuadrado(quadrado):
        pygame.draw.rect(tela, vermelho, (350,250,largura_quadrado, altura_quadrado))
    

    您正在传递一个参数quadrado,但您从未使用它。此外,您的坐标永远不会更新350, 250。所以这个函数基本上一遍又一遍地绘制相同的矩形。

    我修改了你的代码:

    import pygame
    
    clock = pygame.time.Clock()
    
    altura_tela = 600
    largura_tela = 800
    tela = pygame.display.set_mode((largura_tela, altura_tela))
    
    FPS = 30
    
    vermelho = (255, 0, 0)
    
    altura_quadrado = 100
    largura_quadrado = 100
    
    
    def redraw(quadradoPos):
        tela.fill(pygame.Color("white"))
        pygame.draw.rect(tela, vermelho, (quadradoPos[0], quadradoPos[1], largura_quadrado, altura_quadrado))
        pygame.display.update()
    
    
    def main():
        pygame.init()
        quadradoPos = [300,250]
        pygame.display.set_caption('Movimentação do Quadrado')
    
        terminou = False
        while not terminou:
    
            clock.tick(FPS)
    
            for event in pygame.event.get():
    
                if event.type == pygame.QUIT:
                    terminou = True
    
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_UP and quadradoPos[1] > 0:
                        quadradoPos[1] -= 50
                    elif event.key == pygame.K_DOWN and quadradoPos[1] <= altura_tela - altura_quadrado:
                        quadradoPos[1] += 50
                    elif event.key == pygame.K_LEFT and quadradoPos[0] >= 0:
                        quadradoPos[0] -= 50
                    elif event.key == pygame.K_RIGHT and quadradoPos[0] <= largura_tela - largura_quadrado:
                        quadradoPos[0] += 50
    
                redraw(quadradoPos)
    
        pygame.quit()
    
    if __name__ == '__main__':
        main()
    

    注意:

    -不要忘记tela.fill(pygame.Color("white")),否则你会得到屏幕上绘制的所有矩形的“痕迹”。

    -我添加clock是为了控制帧率。

    -您不能像在posicaoquadrado(quadradoPos) 中那样在屏幕上闪烁rect,这将导致TypeError。您只能对 Surface 进行 blit。

    希望这能回答你的问题。

    【讨论】:

    • 您帮了很多忙,非常感谢!我很难理解为什么它不会移动,因为我是一般软件开发的新手,额外的注释真的很有帮助
    • 很高兴我能提供帮助。继续前进
    【解决方案2】:

    desenhaQuadrado 函数内部有一些静态值

    def desenhaQuadrado(quadrado):
        pygame.draw.rect(tela, vermelho, (350,250,largura_quadrado, altura_quadrado))
    

    把它改成下面的代码,它就会移动。

    def desenhaQuadrado(quadrado):
        pygame.draw.rect(tela, vermelho, (quadrado[0],quadrado[1],largura_quadrado, altura_quadrado))
    

    尽管您将看到其他一些问题需要解决。 我创建了一个基本上是您想要的脚本,如果您需要帮助,请检查它 https://github.com/eng-robsonsampaio/pygame_move_square.git

    import pygame
    from pygame.locals import *
    
    UP = 0
    DOWN = 1
    LEFT = 2
    RIGHT = 3
    GAME_ON = True
    SPEED = 20
    
    screen = pygame.display.set_mode((400, 400))
    clock = pygame.time.Clock()
    
    square = pygame.Surface((50,50))
    square.fill((255,0,0))
    POS = [(200,200)]
    
    def move_square(direction):
        if UP == direction:
            POS.append((POS[0][0], POS[0][1] - 20))
        elif direction == DOWN:
            POS.append((POS[0][0], POS[0][1] + 20))
        elif direction == LEFT:
            POS.append((POS[0][0] - 20, POS[0][1]))
        else:
            POS.append((POS[0][0] + 20, POS[0][1]))
        POS.pop(0)
    
    
    while GAME_ON:
    
        for event in pygame.event.get():
            if event.type == QUIT:
                GAME_ON = False
            if event.type == KEYDOWN:
                if event.key==K_UP:
                    print("UP")
                    move_square(UP)                
                elif event.key==K_LEFT:
                    print("LEFT")
                    move_square(LEFT)               
                elif event.key==K_DOWN:
                    print("DOWN")
                    move_square(DOWN)                
                elif event.key==K_RIGHT:
                    print("RIGHT")
                    move_square(RIGHT)
    
        screen.fill((0,0,0))
        screen.blit(square, POS[0])
        pygame.display.update()
    
    pygame.quit()
    

    我还有一个中号蛇游戏教程: https://medium.com/@robsonsampaio90/snake-game-in-python-with-pygame-291f5206a35e

    您可能会在此链接中找到一些帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 2020-09-23
      相关资源
      最近更新 更多