2014-02-14 6 views
0

Я сейчас работаю над римейком «Flappy Bird» в Pygame, используя Python 3.2. Я думал, что это будет хорошо для практики, и относительно просто. Однако это сложно. В настоящее время у меня возникает проблема при рисовании прямоугольника с разной высотой, но сохраняя прямоугольник на высоте, на которую он установлен.Python - Pygame случайные проблемы с препятствиями

Вот мой 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) 

My While Loop выглядит следующим образом:

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? Помните, что вы воссоздаете эту трубу каждый кадр.

Вы пробовали рисовать трубу так же, как и с птицей?

Edit: предложение для Вас цикл:

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

Ive получил немного дальше, переместив создание из цикла while. Теперь все, что мне нужно сделать, это выяснить, как цикл, когда Pipe1 x = 0 ... – Harvey

0

Вы создаете новый Pipe на каждом цикле, но никогда не держитесь за старый (-ы), чтобы каждый раз получать новую случайную высоту. Переместить строку:

Pipe1 = Pipe(scrollx) 

вне цикла while. Еще лучше, у вас есть список трубок, в которые вы можете добавить новые и легко обновить их все. Вы никогда не устанавливали self.drawn = False в пределах Pipe.

Кроме того, вы перезагружаем movey для каждого события, попробуйте:

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