|
发表于 2023-7-27 13:31:54
|
显示全部楼层
您好,我看了一下代码,问题出在move()函数中:
- def move(t):
- ...
- for sprite1 in sprites:
- ...
- x, y = (
- x1 + vx1 * t + 0.5 * ax1 * (t**2),
- y1 + vy1 * t + 0.5 * ay1 * (t**2)
- )
-
- # 这里是关键
- tempx, tempy = sprite1.x, sprite1.y
- if not sprite1.locked:
- sprite1.x, sprite1.y = x, y
- ...
复制代码
move()函数会遍历所有天体sprite,并根据公式计算出它的新位置x,y。
然后如果该天体不处于locked锁定状态,就会将它的位置更新为计算出的新位置。
问题就是,即使太阳sprite被锁定了,但其他天体的位置计算还是会受到太阳的影响(通过计算引力ax,ay)。这样当太阳位置不变,其他天体也就会停止移动。
解决方案是,在计算其他天体的引力时,需要判断是否与锁定的太阳发生作用,如果是就跳过不计算它对其他天体的引力影响。
例如可以这么修改:
- def move(t):
- for sprite1 in sprites:
-
- if sprite1.locked:
- continue
-
- ax1, ay1 = 0, 0
- for sprite2 in sprites:
- if sprite2.locked:
- continue
-
- # 其他天体间计算引力
-
- ...
复制代码
这就跳过了与锁定天体的引力计算,使其他天体可以继续运动。
半人工,求最佳 |
|