python - 无法在 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()
解决方案
在您的功能中:
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
。
希望这能回答你的问题。
推荐阅读
- thingsboard - 无法从命令行使用 HTTP 发布遥测数据
- python - 尝试重命名列时出现 AttributeError
- sql - Oracle SQL 向列添加统一随机数
- spring - 设置基本的 Spring AOP 配置
- python - 在 Windows 中使用 win32com.shell pidl 引用复制文件 - 从 iPhone 复制图片文件
- r - 在散点图中使用变量定位文本
- python - 里克小波的相移
- html - Cookie 在每个请求中发送?
- azure - Azure SQL 数据库 ARM - 参数“maxSizeBytes”必须是“int”类型
- c++ - POCO::PostgreSQL 缓存