微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 pygame 中按键不能正确移动精灵,奇怪的行为

如何解决在 pygame 中按键不能正确移动精灵,奇怪的行为

所以我一直在用 pygame 进行实验,我可以绘制我的精灵,但是当我按下 WASD 时,我必须多次按下它们,而精灵所做的只是向下和左右移动,没有真正的控制

我更新了精灵类中的 self.rect,当你按下一个键时,它会清除屏幕,并且应该使用不同的 x y 位置重新绘制精灵。

代码如下:

import pygame
pygame.init()

screen = pygame.display.set_mode((750,750))

BLACK = (0,0)
WHITE = (255,255,255)
RED = (255,0)

class Sprite(pygame.sprite.Sprite):
    def __init__(self,pos):
        super(Sprite,self).__init__()
        self.image = demon
        self.rect = self.image.get_rect(center = pos)
    
    def update(self,moveX,moveY):
        self.rect.x += moveX
        self.rect.y += moveY
        
        

        
        
all_sprites_list = pygame.sprite.Group()

demon = pygame.image.load("C:/programming/doomman/cacodemon.png").convert_alpha()

x = 300
y = 300

my_sprite = Sprite((x,y))
all_sprites_list.add(my_sprite)
clock = pygame.time.Clock()
pygame.display.set_caption("Demon Dance")
carryOn = True
        
while carryOn == True:
    keys = pygame.key.get_pressed()
    
    for event in pygame.event.get():
            if event.type==pygame.QUIT:
                carryOn=False
            elif event.type == pygame.KEYDOWN:
                screen.fill(BLACK)
                if keys[pygame.K_w]:
                    my_sprite.update(50,0)
                if keys[pygame.K_s]:
                    my_sprite.update(-50,0)
                if keys[pygame.K_d]:
                    my_sprite.update(0,50)
                if keys[pygame.K_a]:
                    my_sprite.update(0,50)
    
    
    pygame.display.flip()
    clock.tick(60)
    all_sprites_list.draw(screen)

解决方法

pygame.key.get_pressed() 返回一个包含所有键盘按钮状态的列表。这不是为了获取键盘事件的键。按下的键可以从 pygame.event.Event 对象的 key 属性获取:

while carryOn == True:
    # [...]
    
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            carryOn=False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                my_sprite.update(50,0)
            if event.key == pygame.K_s:
                my_sprite.update(-50,0)
            if event.key == pygame.K_d:
                my_sprite.update(0,50)
            if event.key == pygame.K_a:
                my_sprite.update(0,50)

    # [...]

键盘事件(参见 pygame.event 模块)仅在键的状态改变时发生一次。 KEYDOWN 事件在每次按下键时发生一次。 KEYUP 每次释放键时出现一次。将键盘事件用于单个操作或逐步移动。

pygame.key.get_pressed() 返回一个包含所有键盘按钮状态的列表。这不是为了获取键盘事件的键。按下的键可以从 pygame.event.Event 对象的 key 属性中获取。

但是,您必须在应用程序循环而不是事件循环中评估键:

while carryOn == True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            carryOn=False
            
    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]:
        my_sprite.update(50,0)
    if keys[pygame.K_s]:
        my_sprite.update(-50,0)
    if keys[pygame.K_d]:
        my_sprite.update(0,50)
    if keys[pygame.K_a]:
        my_sprite.update(0,50)

    # [...]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。