首页 > 解决方案 > 无法在 Pygame 中跨屏幕移动图像

问题描述

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

标签: pythonpygame

解决方案


在您的功能中:

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是为了控制帧速率。

rect- 你不能像在屏幕上那样在屏幕上进行blit ,posicaoquadrado(quadradoPos)这会导致TypeError. 你只能blit Surface

希望这能回答你的问题。


推荐阅读