python - Pygame精灵按下键时不移动
问题描述
我正在开发一个圣诞节 pygame 游戏,当我按下向左或向右箭头键时,我试图让包移动并继续移动。没有错误,但是当我按下键时没有任何反应。知道我做错了什么吗?这是代码谢谢!:
import pygame
import sys
width = 1024
height = 768
left = (-1, 0)
right = (1, 0)
sprite1 = pygame.image.load("Firstpygamegame/santabag2.png")
icon1 = pygame.image.load("Firstpygamegame/santa-claus.png")
pygame.display.set_icon(icon1)
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Gift Catcher")
background_image = pygame.image.load("Firstpygamegame/wintervillage.png")
running = True
while running:
screen.blit(background_image, (0, 0))
screen.blit(sprite1, (0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if pygame.key == pygame.K_RIGHT:
rect = sprite1.get_rect()
rect = rect.move((1, 0))
screen.blit(sprite1, rect)
elif pygame.key == pygame.K_LEFT:
rect = sprite1.get_rect()
rect = rect.move((-1, 0))
screen.blit(sprite1, rect)
pygame.display.flip()
解决方案
有一些错误。第一个错误是笔误。它必须是event.key
而不是pygame.key
。
此外,您必须blit
将应用程序循环中的精灵,而不是事件循环中的精灵存储在rect
. rect
在循环之前获取矩形 ( )。将事件循环中的矩形和blit
每一帧中的精灵移动到rect
:
rect = sprite1.get_rect()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
rect = rect.move(1, 0)
elif event.key == pygame.K_LEFT:
rect = rect.move(-1, 0)
screen.blit(background_image, (0, 0))
screen.blit(sprite1, rect)
pygame.display.flip()
pygame.quit()
exit()
rect = rect.move((-1, 0))
rect.move_ip(-1, 0)
但是,pygame.key.get_pressed()
用于连续运动:
rect = sprite1.get_rect()
speed = 1
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * speed
rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * speed
screen.blit(background_image, (0, 0))
screen.blit(sprite1, rect)
pygame.display.flip()
pygame.quit()
exit()
键盘事件(参见pygame.event模块)仅在按键状态更改时发生一次。KEYDOWN
每次按下某个键时,该事件发生一次。KEYUP
每次释放键时发生一次。将键盘事件用于单个操作或逐步移动。
pygame.key.get_pressed()
返回一个包含每个键状态的列表。如果按住某个键,则该键的状态为True
,否则为False
。用于pygame.key.get_pressed()
评估按钮的当前状态并获得连续移动。
完整示例:
import pygame
icon1 = pygame.image.load("Firstpygamegame/santa-claus.png")
pygame.display.set_icon(icon1)
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Gift Catcher")
clock = pygame.time.Clock()
background_image = pygame.image.load("Firstpygamegame/wintervillage.png")
sprite1 = pygame.image.load("Firstpygamegame/santabag2.png")
rect = sprite1.get_rect()
speed = 1
running = True
while running:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * speed
rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * speed
screen.blit(background_image, (0, 0))
screen.blit(sprite1, rect)
pygame.display.flip()
pygame.quit()
exit()
推荐阅读
- php - 如何从 VS Code 终端在浏览器中运行此代码?
- php - PHP Ajax 发布数据表
- createjs - EaselJS:有没有办法将形状导出到图像文件?
- xml - 从不在同一个数组中但始终如下的已解析 XML 文件中提取信息
- r - 使用两个 actionButton 填充数据框
- python - 如何处理在包或函数调用的低级别引发的异常?
- python - Pagination on DjangO - No Values
- c++ - 循环单链表的复制构造函数
- javascript - 将对象数组转换为两个数组的对象 - 打字稿
- mysql - Node.js MySQL ERR_HTTP_HEADERS_SENT