现在,您正在执行以下操作(大大简化您的代码)...
while True:
if the mouse was clicked:
draw a circle on the screen where the mouse was clicked
让我们让事情变得更容易一些,并逐渐建立起来。
从圆圈开始,无需用户点击
为简单起见,让我们在屏幕左上角附近画一个圆圈,这样我们总是可以假设会有一个圆圈(使一些逻辑更容易)
circle_x, circle_y = 10,10
while True:
draw the circle at circle_x, circle_y
pygame.display.update()
为圆圈设置动画
在过多地讨论“随机方向”之前,让我们让它变得简单并朝着一个方向前进(比如说,总是向下和向右)。
circle_x, circle_y = 0,0
while True:
# Update
circle_x += 0.1
circle_y += 0.1
# Draw
draw the circle at circle_x, circle_y
update the display
现在,每次通过循环,圆的中心都会移动一点,然后将它绘制到新的位置。请注意,您可能需要减少添加到 circle_x 和 y 的值(在我的代码中为 0.1),以防圆移动得太快。
但是,您会注意到您的屏幕现在被圆圈填满了!而不是一个“移动”的圆圈,你只是画了很多次圆圈!为了解决这个问题,我们将在每次绘制之前“清除”屏幕......
screen = ....
BLACK = (0,0,0) # Defines the "black" color
circle_x, circle_y = 0,0
while True:
# Update
circle_x += 0.1
circle_y += 0.1
# Draw
screen.fill(BLACK)
draw the circle at circle_x, circle_y
update the display
请注意,在我们绘制圆圈之前,我们通过将整个事物涂成黑色来“清除”屏幕。
现在,您可以开始将您想要的其余内容重新放入代码中。
跟踪多个圈子
您可以通过使用圆圈列表而不是两个圆圈变量来做到这一点
circles = [...list of circle positions...]
while True:
# Update
for circle in circles:
... Update the circle position...
# Draw
screen.fill(BLACK)
for circle in circles:
draw the circle at circle position # This will occur once for each circle
update the display
需要注意的一件事是,如果您跟踪元组中的圆圈位置,您将无法更改它们的值。如果您熟悉面向对象编程,您可以创建一个 Circle 类,并使用它来跟踪与您的圈子相关的数据。否则,您可以在每个循环中为每个圆创建一个更新坐标列表。
用户点击时添加圈子
circles = []
while True:
# event handling
for event in pygame.event.get():
if event.type == MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
circles.append( pos ) # Add a new circle to the list
# Update all the circles
# ....
# Draw
clear the screen
for circle_position in circles:
draw the circle at circle_position # This will occur once for each circle
update the display
让圆圈沿随机方向移动
这就是数学的良好帮助发挥作用的地方。基本上,您需要一种方法来确定每个循环更新圆的 x 和 y 坐标的方法。请记住,完全有可能只说您希望它在每个轴(X,y)的 -1 和 1 之间移动,但这不一定是正确的。您可能使 X 和 Y 都为零,在这种情况下,圆根本不会移动!下一个圆圈可能是 1 和 1,这将比其他圆圈更快。
我不确定您的数学背景是什么,因此您可能需要学习一些知识才能了解如何在程序中存储“方向”(有时称为“向量”)背后的一些数学知识。您可以尝试 Preet 的回答,看看是否有帮助。有几何学和三角学背景的人更容易真正理解(尽管如果你找到了一个好的资源,你可能没有它也能过得去)。
其他一些想法
您需要记住的其他一些事项:
现在,我们正在使用“取决于帧速率”的代码。也就是说,圆圈在屏幕上移动的速度完全取决于计算机的运行速度;较慢的计算机会看到圆圈像蜗牛一样移动,而较快的计算机在圆圈飞出屏幕之前几乎看不到圆圈!有一些方法可以解决这个问题,您可以自行查找(在您最喜欢的搜索引擎中搜索“帧速率依赖”或其他术语)。
现在,你有 screen.lock() 和 screen.unlock()。你不需要这些。如果表面需要(某些表面不需要)并且您要手动访问像素数据,您只需要锁定/解锁屏幕表面。做一些事情,比如在屏幕上画圆圈,pygame 会自动为你锁定/解锁表面。简而言之,您现在不需要处理锁定/解锁。