Python - Pygame随机障碍高度问题

时间:2014-02-14 17:57:57

标签: python pygame python-3.2 flappy-bird-clone

我目前正在使用Python 3.2在Pygame中制作'Flappy Bird'重拍。我认为这对练习有好处,而且相对简单。然而,事实证明这很难。目前,我在绘制不同高度的矩形时遇到问题,但将矩形保持在设置的高度。

这是我的 Pipe

class Pipe:
    def __init__(self,x):
        self.drawn = True
        self.randh = random.randint(30,350)
        self.rect = Rect((x,0),(30,self.randh))

    def update(self):
        self.rect.move_ip(-2,0)

    def draw(self,screen):
        self.drawn = True
        pygame.draw.rect(screen,(0,130,30),self.rect)

我的循环如下:

while True:
    for event in pygame.event.get():
        movey = +0.8
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_SPACE:
                movey = -2


    x += movex
    y += movey


    screen.blit(background,(0,0))
    screen.blit(bird,(x,y))

    Pipe1 = Pipe(scrollx)

    if Pipe1.drawn == True:
        Pipe1.update()
    else:
        Pipe1 = Pipe(scrollx)
        Pipe1.draw(screen)

    scrollx -= 0.3

    pygame.display.update()

我已经和这段代码搏斗了一个多星期了,我非常感谢你能给予的任何帮助。

2 个答案:

答案 0 :(得分:1)

我没有遵循这一部分的逻辑:

Pipe1 = Pipe(scrollx)

if Pipe1.drawn == True:
    Pipe1.update()
else:
    Pipe1 = Pipe(scrollx)
    Pipe1.draw(screen)

drawn属性在构造函数中设置为True,那么您何时期望触发else条件?请记住,您正在重建此管道每一帧

你是否尝试过用与鸟类相同的方式绘制管道?

编辑:建议你循环:

PIPE_TIME_INTERVAL = 2

pipes = []    # Keep the pipes in a list.
next_pipe_time = 0

while True:
    [... existing code to handle events and draw the bird ...]

    for pipe in pipes:
        pipe.move(10)     # You'll have to write this `move` function.
        if pipe.x < 0:    # If the pipe has moved out of the screen...
            pipes.pop(0)  # Remove it from the list.

    if current_time >= next_pipe_time:   # Find a way to get the current time/frame.
        pipes.append(Pipe())  # Create new pipe.
        next_pipe_time += PIPE_TIME_INTERVAL  # Schedule next pipe creation.

答案 1 :(得分:0)

您正在每个循环上创建一个新的Pipe,但永远不会挂在旧循环上,因此每次都会获得一个新的随机高度。移动这一行:

Pipe1 = Pipe(scrollx)

while循环之外。更好的是,有一个管道列表,您可以添加新管道并轻松更新它们。您从未在self.drawn = False内设置Pipe

此外,您正在为每个活动重置movey,请尝试:

movey = 0.8 # no need for plus 
for event in pygame.event.get():