Как создать несколько объектов одного класса с бесконечным циклом внутри каждого - PullRequest
1 голос
/ 29 октября 2019

Я пытался порождать шары, используя onkey (spawn, "space"), и все было в порядке. Но как породить их, используя цикл? Кажется, что цикл «while True» внутри метода класса не позволяет делать итерации цикла «for» снаружи.

from turtle import *
from random import randint

w = 100
h = 100
BallList = []

sc = Screen()
sc.tracer(0)

class Ball(Turtle):
  def __init__(self, x, y, s, c):
    Turtle.__init__(self)
    self.x = x
    self.y = y
    self.s = s
    self.c = c
    self.color(self.c)
    self.shape("circle")
    self.penup()
    self.speed(0)
    self.setheading(self.towards(randint(-100, 100), randint(-100, 100)))

  def move(self):
    self.forward(self.s)

  def bounce(self):
    if self.xcor() > w:
      self.setheading(self.towards(-w, randint(-100, 100)))
    if self.xcor() < -w:
      self.setheading(self.towards(w, randint(-100, 100)))
    if self.ycor() > h:
      self.setheading(self.towards(randint(-100, 100), -h))
    if self.ycor() < -h:
      self.setheading(self.towards(randint(-100, 100), h))

  def loop(self):
    while True:
      self.move()
      self.bounce()
      sc.update()

for i in range(10):
  BallList.append(Ball(0, 0, 10, (0, 100, 0)))
  BallList[i].loop()

1 Ответ

2 голосов
/ 29 октября 2019
  1. Удалите бесконечный цикл в вашем loop методе класса Ball, чтобы он выглядел следующим образом:
  def loop(self):
    self.move()
    self.bounce()
    sc.update()
Сначала создайте свои шары, но пока не пытайтесь их обработать:
for i in range(10):
  BallList.append(Ball(0, 0, 10, (0, 100, 0)))
Выполняйте бесконечный цикл для обновления шаров:
while True:
  for i in range(10):
    BallList[i].loop()

  • Я думаю, что имеет смысл переименовать loop метод класса Ball вчто-то вроде update, так как он больше не будет зацикливаться
  • BallList - это не класс, я думаю, что было бы лучше переименовать его в balls (обратите внимание на строчную букву, чтобыне путайтесь с классами)

Редактировать: Я думаю, что вызов sc.update() внутри Ball-s loop метод, вероятно, избыточен. Вероятно, достаточно один раз назвать это sc.update(), после того как все шары были пересчитаны, например:

while True:
  for i in range(10):
    BallList[i].loop()
  sc.update()
...