2017-01-19 12 views
0

Целью является наложение скоплений прямоугольников [пузырьков], движущихся вверх по экрану с различными скоростями. Я попал в блокпост, когда речь заходит о создании движущихся прямоугольников.Анимация Pygame Rects для перемещения вверх по экрану

способ, которым я дошел до этого, состоит в том, чтобы заполнить список экземплярами класса моего класса Bubble. оттуда я повторил список экземпляров и назвал их методом blow_bubble, эффективно рисуя каждый пузырь в другом месте на экране и инициализируя каждый свой собственный показатель скорости движения. эти пузыри затем присоединяются к отдельному списку, озаглавленному «нарисован», чтобы обозначить, что они действительно были нарисованы (хотя и не отображены).

Следующая часть, где она становится неровной.

У меня есть цикл while, который принимает длину вытянутого списка, больше нуля, в качестве условия для работы. согласно форме в этой статье: http://programarcadegames.com/index.php?chapter=introduction_to_animation поверхность экрана задана для заполнения в начале цикла, и в конце ее я обновил поверхность экрана с помощью pygame.display.flip(). в середине цикла while я повторяю через экземпляры классов в отрисованном списке и уменьшая атрибут, представляющий их значение y, с учетом скорости движения экземпляра.

как-то это не работает.

Я проверил, чтобы значение y фактически уменьшалось; в заявлении печати вывод будет тем, что можно было бы ожидать: значение y опускается в отрицательные числа. но прямые остаются неподвижными.

как всегда, любые идеи очень ценятся.

#colors, screen, clock, etc defined above but omitted 
pygame.init() 

class Bubble(): 
    def __init__(self, screenheight, screenwidth): 
     self.w = self.h = 0 
     self.x, self.y = 0, 0 
     self.moverate = 0 

    def reset_bubble(self): 
     self.w = self.h = random.randrange(2, int(screenwidth*1/4)) 
     self.x = random.randrange(0, (screenwidth-self.w)) 
     self.y = screenheight-self.w 
     self.moverate = 1 

    def blow_bubble(self): 
     self.reset_bubble() 
     pygame.draw.rect(screen, WHITE, (self.x, self.y, self.w, self.h), 10) 

bubbles = [] 
drawn = [] 
i = 0 

for i in range(10):   #creates list of bubble objects 
     bubble = Bubble(screenheight, screenwidth) 
     bubbles.append(bubble) 

for i in range(len(bubbles)):  #draws bubbles without rendering them 
    bubbles[i].blow_bubble() 
    drawn.append(bubbles[i])  #appends objects to a new list (drawn) 

while len(drawn) > 0: 
    screen.fill((BLACK)) 
    drawn[i].y -= drawn[i].moverate  #moves the bubble up the screen 
    pygame.display.flip()    #updates the screen 

    if i >= 0: #counts up til len(drawn) then counts down [then up again] 
     i+=1 #to make sure we move every bubble a little each iteration 
    if i ==len(drawn): 
     i-= 1 
clock.tick(FPS) 
pygame.quit() 

ответ

0

Если я не очень ошибаюсь в отношении того, как работает pygame, вы неправильно поняли, как это работает. Для работы oygamr необходим «цикл рендеринга», цикл кода, в котором вы многократно перемещаете объект, рисуете его с помощью чего-то вроде pygame.draw.rect, а затем переворачиваете отображение с помощью pygame.display.flip. Вы продолжаете делать это, пока не закончите анимацию.

Итак, вам нужно сделать кучу изменений.

  • ваша функция «удар пузырь» должна не сбросить положение пузырька, только увеличивает свою позицию и вызвать pygame.draw.rect
  • вам не нужен список «рассвета», только первым пузырьковый список. Внутри цикла while вам нужно перебирать список пузырьков, называя каждый из них «пузырьком удара».
  • вам нужно переместить 'pygame.display.flip' внутри цикла while, но после того, как все пузырьки были взорваны.

Ошибка вашего индекса за пределами допустимой погрешности заключается в том, что я не магически сбрасываю после выхода из цикла for, он оставляет меня как бы то ни было, когда цикл for завершен.

+0

Нет проблем! Надеюсь, ваш следующий код будет лучше! – ashbygeek