我正在做一个小游戏,当按下一个键时我无法旋转其中一个形状。我已设法旋转形状但是当按下键时它继续旋转(90度)而不是保持在新的位置。我有一种感觉,它是在某种类型的循环,但我似乎无法让它摆脱循环。希望有人能提供帮助。相关代码位于从底部向上的第六行(elif键[K_d])
class Player(pygame.sprite.Sprite):
def __init__(self, screen):
self.screen = screen
self.image = pygame.image.load(os.path.join('shape.png'))
self.rect = self.image.get_rect()
self.rect.x = 10
self.rect.y = 540
#You don't need to define self.width because it is now self.rect.width
#Same with self.height
self.speed = 10
def update(self):
keys = pygame.key.get_pressed()
if keys[K_LEFT]:
self.rect.left -= self.speed
if self.rect.left < 0: #The left edge
self.rect.left = 0
elif keys[K_RIGHT]:
self.rect.right += self.speed
if self.rect.right > WINDOW_WIDTH:
self.rect.right = WINDOW_WIDTH
elif keys[K_UP]:
self.rect.top -= self.speed
if self.rect.top < 0:
self.rect.top = 0
elif keys[K_DOWN]:
self.rect.bottom += self.speed
if self.rect.bottom > WINDOW_HEIGHT:
self.rect.bottom = WINDOW_HEIGHT
***#THE CODE BELOW IS THE SHAPES ROTATION***.
elif keys[K_d]:
self.image = pygame.transform.rotate(self.image, 90)
def draw(self, screen=None):
if screen is None:
screen = self.screen
screen.blit(self.image, (self.rect.x, self.rect.y))
答案 0 :(得分:0)
据我所知,你实际上每帧调用更新。
pygame.keys.get_pressed()如果真的按下了“d”,则每帧按下“d”。更好地处理pygame.KEYDOWN和KEYUP事件的事件检查。只有在按下按键并释放按键后才会触发它们。
我建议在主程序类的构造函数中添加一个键映射(
def __init__(self):
的部分)。
我现在只将d-key添加到我的示例中,其他人可以自行添加。
self.keymap = {pygame.K_d: False}
然后在主循环中检查事件:
while running:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key in self.keymap:
self.keymap[event.key] = True
if event.type == pygame.KEYUP:
if event.key in self.keymap:
self.keymap[event.key] = False
当按下该键时,KEYDOWN仅触发ONCE,并且在按住该键时每帧都不返回True。它将主类中的变量设置为True,然后您可以在其他类中使用它。
当你释放一个键时,KEYUP也只会被触发。它将keymap中的变量重置为False,因此程序已准备好处理该键的下一个KEYDOWN事件。
检查播放器更新方法中的变量:
if Main.keymap[K_d] == True:
self.image = pygame.transform.rotate(self.image, 90)
这对你有用吗?
//编辑: 为了使这一点再次清晰,并希望指出代码中的问题所在:
pygame.keys.get_pressed
如果仍按下按键,每帧返回True,因此在按住按键的同时在每一帧中执行旋转。
pygame.KEYDOWN
和
pygame.KEYUP
仅在按下或释放按键时触发一次,因此即使您一直按下按键,它们也不会再次返回True。