Python pygame事件循环的问题

Python pygame事件循环的问题,python,pygame,Python,Pygame,我是Pygame的新手,我想做一个Flappy Bird克隆人。我想设置控制键,这样按下跳跃键就不会让鸟一直跳跃。玩家必须像最初的游戏一样,不断敲击跳跃以保持鸟漂浮。我尝试使用pygame.key.set_repeat()关闭key repeat,但它似乎不起作用。通过回顾关于同一主题的其他帖子,我开始认为这可能是我事件循环中的一个问题 谢谢你的帮助 我的代码: import pygame class Bird(pygame.sprite.Sprite): def __init__(s

我是Pygame的新手,我想做一个Flappy Bird克隆人。我想设置控制键,这样按下跳跃键就不会让鸟一直跳跃。玩家必须像最初的游戏一样,不断敲击跳跃以保持鸟漂浮。我尝试使用pygame.key.set_repeat()关闭key repeat,但它似乎不起作用。通过回顾关于同一主题的其他帖子,我开始认为这可能是我事件循环中的一个问题

谢谢你的帮助

我的代码:

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()
导入pygame
类鸟(pygame.sprite.sprite):
定义初始化(自):
#装载鸟的图片
self.image=pygame.image.load('ball.png')
#将bird pic设置为矩形对象,并将位置移动到中心
self.rect=pygame.rect.rect((320240),self.image.get_size())
#重力的默认值
self.dy=0#在当前玩家位置上增加多少
def更新(自我、dt、游戏):
pygame.key.set_repeat()
key=pygame.key.get_pressed()
如果键[pygame.K_UP]:
打印“跳转!!!”
self.dy=-400
#施加重力
self.dy=min(400,self.dy+40)
self.rect.y+=self.dy*dt
#碰撞检测
如果(self.rect.top=480):#接地
self.rect.y=(480 self.rect.width)
#光点图像到屏幕
屏幕blit(self.image,(320,self.rect.y))
pygame.display.flip()
打印自校正中心
打印self.dy
班级场地(pygame.sprite.sprite):
定义初始化(自):
self.image=pygame.image.load('ground.png')
self.rect=pygame.rect.rect((0480 self.image.get_width()),self.image.get_size())
班级游戏(对象):
def主(自身,屏幕):
clock=pygame.time.clock()
#创建背景和播放器对象
background=pygame.image.load('background.png')
#实例化bird对象
self.bird=bird()
self.ground=ground()
而1:
dt=时钟滴答声(30)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
返回
如果event.type==pygame.KEYDOWN和event.key==pygame.K_转义:
返回
屏幕光点(背景,(0,0))
pygame.display.flip()
self.bird.update(dt/1000,self)#由于某些原因,更新必须最后进行
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
pygame.init()
screen=pygame.display.set_模式((640480))
游戏()主(屏幕)
pygame.quit()
pygame.key.set\u repeat()在此处不会更改任何内容,因为默认情况下禁用了密钥重复

您的错误相当简单:如果当前按下K_UP,您的程序将签入“update()”方法,但您应该只检查事件,因为按下按钮会被事件截获

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

所以,您必须编写类似“jump()”的方法,并在收到按下K_的事件时执行它,而不是检查“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()