【发布时间】: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