<blockquote>
<p><strong>Question</strong>: How do i change these two balls into many of them?</p>
</blockquote>
<p>为每个球或球对创建一个<code>class object</code>。<br/>
这将导致所有球使用相同的规则。你知道吗</p>
<blockquote>
<p><strong>Note</strong>: I show <strong>only one</strong> Ball per <code>class object</code>, <strong>not</strong> a pair of Balls and <strong>without collision detection</strong>!</p>
</blockquote>
<p><a href="https://i.stack.imgur.com/1CvcK.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/1CvcK.gif" alt="enter image description here"/></a></p>
<pre><code>class Ball:
R = 15
def __init__(self, parent=None, color=None):
self.parent = parent
# Define shortcuts
radius = self.R
# Random bbox Ellipse coordinates of the ball.
x = random.randrange(50 + radius, 550 - radius)
y = random.randrange(50 + radius, 350 - radius)
coord1 = (x - radius, y - radius, x + radius, y + radius)
# Random direction
x = random.randrange(1, 10)
y = random.randrange(1, 10)
self.direction = (x, y)
# Save the bbox coordinate of the ball
self.coord1 = self.bbox(coord1, self.direction)
def bbox(self, coord1=None, direction=None):
# Return if NO move
if coord1 is None:
return self.coord1
return (coord1[0] + direction[0],
coord1[1] + direction[1],
coord1[2] + direction[0],
coord1[3] + direction[1]
)
def vector_rule(self):
# Get the estimated new bbox coordinate of the Ball
coord1 = self.bbox(self.coord1, self.direction)
# Define shortcuts
R = self.R
x1 = coord1[0]
y1 = coord1[1]
vx1 = self.direction[0]
vy1 = self.direction[1]
# Boundary check
if (x1 > 530 - R):
vx1 = -vx1
if (x1 < 35 + R):
vx1 = -vx1
if (y1 > 330 - R) or (y1 < 35 + R):
vy1 = -vy1
# Save the new direction - could be the same as before
self.direction = (vx1, vy1)
# Save the new bbox coordinate of the Ball
self.coord1 = self.bbox(self.coord1, self.direction)
# Return the move offsets
return self.direction
</code></pre>
<blockquote>
<p><strong>Usage</strong>: </p>
</blockquote>
<p>在<code>.create_balls(...</code>循环中创建<code>class BallCanvas</code>,以创建<code>class Ball</code>对象和<code>Canvas create_oval(...</code>对象。<br/>
在<code>list</code>中累加,根据<code>Ball.vector_rules(...</code>的结果,使用<code>canvas.move(...</code>循环这个<code>list</code>来移动球。你知道吗</p>
<pre><code>class BallCanvas(tk.Canvas):
def __init__(self, parent, width, height):
self.parent = parent
super().__init__(parent, width=width, height=height)
self.create_rectangle(50, 50, 550, 350)
self.grid(row=1)
self.balls = []
self.create_balls()
def create_balls(self):
for n in range(5):
for color in ['red', 'blue']:
ball = Ball()
self.balls.append((self.create_oval(ball.bbox(), fill=color, tags='ball'), ball))
def move_balls(self):
for id, ball in self.balls:
new_x, new_y = ball.vector_rule()
self.move(id, new_x, new_y)
</code></pre>
<blockquote>
<p><strong>Main Application</strong>: </p>
</blockquote>
<p>使用Tkinter <code>.after(150, ...</code>移动<code>Ball objects</code>。<br/>
这意味着。所有<code>Ball objects</code>每150ms移动一次</p>
<pre><code>class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry("610x430+650+280")
self.canvas = BallCanvas(self, width=600, height=400)
self.count = 200
self.after(500, self.move)
def move(self):
self.count -= 1
self.canvas.move_balls()
if self.count > 0:
self.after(150, self.move)
if __name__ == "__main__":
App().mainloop()
</code></pre>
<p>用Python:3.5测试</p>