2014-02-14 158 views
0

我目前正在使用Python 3.2在Pygame上进行'Flappy Bird'重拍。我认为这对实践很好,而且相对简单。然而,事实证明这很难。目前,我在绘制不同高度的矩形时遇到问题,但将矩形保持在设置的高度。Python - Pygame随机障碍物高度问题

这是我

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循环如下:

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() 

我已经被这个代码在一个星期摔跤,我真的很感谢所有帮助你可以给。

+0

到底是什么问题? – Alvaro

回答

1

我没有跟随这部分的逻辑:

Pipe1 = Pipe(scrollx) 

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

drawn属性的设置为True构造函数,所以你什么时候可以触发else条件?请记住,您正在重新创建此管道,每帧

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

编辑:建议你for循环:

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. 
+0

我想要发生的是将绘制的变量设置为False,此时将绘制管道,然后如果为True,则将移动未绘制的线条 – Harvey

+0

并且之前创建的管道将停止移动?我认为你应该使用计时器,而不是Pipe的属性。 – BoppreH

+0

我现在通过移动while循环的创建时间稍微进一步了。现在,我所要做的就是解决Pipe1的x = 0时如何循环... – Harvey

0

您正在每个循环创建一个新的Pipe,但从未挂在旧的(s)上,所以每次都会得到一个新的随机高度。移动此行:

Pipe1 = Pipe(scrollx) 

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

此外,要为每一个事件复位movey,尝试:

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