2014-05-21 22 views
0

pygame新手在这里,我试图做一个Flappy鸟克隆。我想设置控件,以便按住跳跃键不会让鸟儿跳跃。玩家将不得不继续跳跃以保持小鸟漂浮,就像原始游戏一样。我试图使用pygame.key.set_repeat()来关闭键重复,但它似乎并没有工作。从查看关于同一主题的其他帖子,我开始认为这可能是我的事件循环中的一个问题。pygame事件循环的麻烦

感谢您的帮助!

我的代码:

import pygame 

class Bird(pygame.sprite.Sprite): 
    def __init__(self): 
     #load pic of bird 
     self.image = pygame.image.load('ball.png') 
     #sets bird pic as a rectangle object and moves position to centre 
     self.rect = pygame.rect.Rect((320, 240), self.image.get_size()) 

     #default value for gravity 
     self.dy = 0 #how much to add to current player position 

    def update(self, dt, game): 
     pygame.key.set_repeat() 
     key = pygame.key.get_pressed() 
     if key[pygame.K_UP]: 
      print "jump!!!" 
      self.dy = -400 

     #apply gravity 
     self.dy = min(400, self.dy + 40) 
     self.rect.y += self.dy * dt 

     #collision detection 
     if(self.rect.top <= 0): #top 
      self.rect.y = 0 
      self.dy = -4 
     elif(self.rect.bottom >= 480): #ground 
      self.rect.y = (480-self.rect.width) 

     #blit image to screen 
     screen.blit(self.image, (320, self.rect.y)) 
     pygame.display.flip() 

     print self.rect.center 
     print self.dy 

class Ground(pygame.sprite.Sprite): 
    def __init__(self): 
     self.image = pygame.image.load('ground.png') 
     self.rect = pygame.rect.Rect((0, 480-self.image.get_width()), self.image.get_size()) 



class Game(object): 
    def main(self, screen): 
     clock = pygame.time.Clock() 

     #create background and player object 
     background = pygame.image.load('background.png') 
     #instantiate bird object 
     self.bird = Bird() 
     self.ground = Ground() 

     while 1: 

      dt = clock.tick(30) 

      for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        return 
       if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
        return 

      screen.blit(background, (0, 0)) 
      pygame.display.flip() 
      self.bird.update(dt/1000., self) #for some reason, update must go last 


if __name__ == '__main__': 
    pygame.init() 
    screen = pygame.display.set_mode((640, 480)) 
    Game().main(screen) 
    pygame.quit() 

回答

2

pygame.key.set_repeat()不会改变任何东西在这里,因为键重复默认情况下禁用。

而你的错误相当简单:在你的程序将检查“更新()”方法,如果K_UP是目前压 - 但你应该只检查活动,因为按下按钮由事件截获。

简而言之:事件告诉你是否按下了键,“get_pressed()”告诉你是否按下了键

因此,您必须编写类似“jump()”的方法,并在按下K_UP的情况下接收事件时执行它,而不是在“update()”方法内检查关键状态。不要忘记从“update()”方法删除跳转代码!

class Bird(pygame.sprite.Sprite): 

    def jump(self): 
     print "jump!!!" 
     self.dy = -400 

(...)

for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
     return 
    if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
     return 
    if event.type == pygame.KEYDOWN and event.key == pygame.K_UP: 
     self.bird.jump() 
+0

这完美地工作,仍然是什么使检查 “事件” 不同的有点糊涂了。谢谢您的帮助! – whodareswins