首页 > 解决方案 > 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()

标签: pythonpython-3.xpygame

解决方案


有一些错误。第一个错误是笔误。它必须是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()

请注意,您可以使用move_ip()而不是move

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

推荐阅读