[英]Pygame shape rotation
我正在做一个小游戏,按下键时无法旋转一种形状。 我设法旋转了形状,但是当按下键时它会继续旋转(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))
据我所知,您实际上是在每帧调用一次更新。
pygame.keys.get_pressed()如果确实按下了“ d”,则每帧返回“ d”。 更好地使用pygame.KEYDOWN和KEYUP事件的事件检查。 仅在按下键并释放后才触发它们。
我建议将键盘映射添加到主程序类的构造函数(
def __init__(self):
部分)。
我现在仅将d键添加到我的示例中,您可以自己添加其他键。
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,并且在按下键时不会在每一帧都返回True。 它将主类中的变量设置为True,您可以在其他类中使用该变量。
释放密钥时,也仅一次触发KEYUP。 它将键映射中的变量重置为False,因此程序已准备好处理该键的下一个KEYDOWN事件。
检查播放器的update方法中的变量:
if Main.keymap[K_d] == True:
self.image = pygame.transform.rotate(self.image, 90)
这对您有用吗?
// edit:再次说明这一点,并希望指出代码中的问题所在:
pygame.keys.get_pressed
如果仍然按下该键,则每帧返回True,因此在按住该键的同时在每一帧中进行旋转。
pygame.KEYDOWN
和
pygame.KEYUP
仅在按下或释放键时才触发一次,因此即使您一直按下该键也不会再次返回True。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.