【问题标题】:Python 3 : When I keep a key pressed down and press then release another, pygame don't take new eventsPython 3:当我按住一个键并按下然后释放另一个键时,pygame 不会接受新事件
【发布时间】:2020-09-27 12:21:45
【问题描述】:

我有一个脚本可以让“角色”在地图上移动,但是当我按住一个方向,然后按下(按下然后释放)另一个键时,'for event in pygame.event_get()' 循环不会不再工作我确实有一个'pygame.key.set_repeat()'并且我试图在每次释放键时更改'event'的值,但我不知道该怎么做。这是脚本:

import math
import numpy as np
import random as rdm
import pygame
from pygame.locals import *

#functions :

def printScreen():
    global delta
    global Map
    global player
    
    x = (w-player.w)//2
    xMap = x - player.x


    
    y = (h-player.w)//2
    yMap = player.w + y - Map.h + player.y


    fenetre.fill((0, 0, 0))
    fenetre.blit(Map.layer1, (xMap, yMap))
    fenetre.blit(player.image, (x, y))
    pygame.display.flip()

#variables :

h, w = 600, 700
delta = 1 #size of a pixel
run = True
moving = False

#constants :

zeros = tuple([0 for i in range(323)])
directions = ['up', 'down', 'right', 'left']

#pygame initialisation :


pygame.init()
clock = pygame.time.Clock()
fenetre = pygame.display.set_mode((w*delta, h*delta))
pygame.key.set_repeat(40, 40)

#classes :

class player :
    def __init__(self, save) :
        File = open(save + '\savedata.txt')
        Text = File.read()
        File.close
        noLine = 1
        nbCharacters = 0
        lineStart = 0
        for i in range(len(Text)) :
            if Text[i] == '\n' :
                line = Text[lineStart:i]
                lineStart = i+1
                if noLine == 1 :
                    nickName = line
                if noLine == 2 :
                    x = int(line)
                if noLine == 3 :
                    y = int(line)
                noLine += 1
        self.image = pygame.image.load(save + '\player.png')
        self.w = self.image.get_width()
        self.h = self.image.get_height()
        self.nickName = nickName
        self.x = x
        self.y = y
        self.direction = 'down'

player = player("data\player\save01")

class backGround :
    def __init__(self, directory) :
        self.layer1 = pygame.image.load(directory)
        self.w = self.layer1.get_width()
        self.h = self.layer1.get_height()

Map = backGround("data"+"\\"+"town.png")

#images :

#main pygame loop :
        
while run :
    clock.tick(120)
    for event in pygame.event.get() :
        if event.type == QUIT :
            run = False

        if event.type == KEYUP :
            event = 0
            
        keys = pygame.key.get_pressed()
        arrows = keys[273 : 277]
        for i in range(4) :
            if player.direction == directions[i] and arrows[i] == 0 :
                moving = False
            

        if keys == zeros :
            moving = False
            
        if keys[pygame.K_UP] :
            player.y += player.w
            if not moving :
                player.direction = 'up'
            moving = True

        if keys[pygame.K_DOWN] :
            player.y -= player.w
            if not moving :
                player.direction = 'down'
            moving = True

        if keys[pygame.K_RIGHT] :
            player.x += player.w
            if not moving :
                player.direction = 'right'
            moving = True

        if keys[pygame.K_LEFT] :
            player.x -= player.w
            if not moving :
                player.direction = 'left'
            moving = True

        print(player.direction, keys[273 : 277])
    printScreen()
    
pygame.quit()

arrows = keys[273 : 277] 指 pygame.key.get_pressed() 中包含箭头键的部分。

【问题讨论】:

  • if event.type == KEYUP : event = 0。为什么将事件设置为 0 ?
  • 不要在zerors 列表中添加这么多零并将该列表与keys 进行比较以检查是否没有按下任何键,您可以简单地执行以下操作:if not keys:
  • 为什么在事件循环而不是应用循环中获取键的状态(pygame.key.get_pressed())?
  • @hippozhipos 对于event = 0,我只是尝试了一些不起作用并且之后没有删除它的东西。感谢if not keys:,我刚刚改了。
  • @Rabbid76 如果我在主循环中获得键状态,角色的速度仅取决于帧速率,它会变得太快。如果我在每次按键后添加延迟,它可能会干扰基于clock.tick() 设置的帧速率的背景/NPC 动画,但如果我没有找到任何其他解决方案,我会这样做。跨度>

标签: python-3.x pygame keypress


【解决方案1】:

问题是您只在发生新事件时才检查键数组。您想在每个循环中检查键数组。您只需要调整缩进即可。

这是更新后的代码:

while run :
    clock.tick(10)
    for event in pygame.event.get() :  # check for new event
        if event.type == QUIT :
            run = False

        if event.type == KEYUP :
            event = 0
            
    keys = pygame.key.get_pressed()  # always check this
    arrows = keys[273 : 277]
    for i in range(4) :
        if player.direction == directions[i] and arrows[i] == 0 :
            moving = False
        
    if keys[pygame.K_SPACE] : print('--------------------- space')

    if keys == zeros :
        moving = False
        
    .............
    
pygame.quit()

【讨论】:

  • 正如我对 Rabbid76 所说,如果我使用这个解决方案,角色的速度将仅取决于帧率,如果我在每次按键后添加延迟,它可能会干扰背景的未来动画以及取决于帧率的 NPC。如果无法让 pygame 获取事件,我将使用此解决方案,但我应该在帖子描述中说我已经尝试取消缩进整个 keys 部分。但无论如何感谢您的解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-10-23
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
相关资源
最近更新 更多