2014-05-16 28 views
0

我正在做一个小游戏,并且在按下某个键时我无法旋转其中一个形状。我设法旋转形状,但是当按下按键时,它会继续旋转(90度),而不是停留在新的位置。我有一种感觉,它是在某种类型的循环,但我似乎无法摆脱循环。希望有人能帮忙。相关的代码位于从底部第六行了(ELIF键[K_D])Pygame形状旋转

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

为什么不添加打印在那里,看看它是否仍然认为D被按下......你可能不得不按下另一个键或清除键缓冲区或... –

+0

90没有指定多远旋转? – user3286261

+0

第二个参数是一个指定的角度,所以移动90度并不奇怪。 –

回答

0

据我看到它时,你实际上调用更新每一帧。

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仅在您释放密钥时才会触发。它将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第二次,即使你保持按下键。