Pygame形状旋转

时间:2014-05-16 23:33:41

标签: python python-3.x rotation pygame

我正在做一个小游戏,当按下一个键时我无法旋转其中一个形状。我已设法旋转形状但是当按下键时它继续旋转(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))

1 个答案:

答案 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。