Python 我怎样才能使我的圆圈自然移动,而不是在它们碰撞时不受重力的影响?

Python 我怎样才能使我的圆圈自然移动,而不是在它们碰撞时不受重力的影响?,python,pygame,game-physics,physics,Python,Pygame,Game Physics,Physics,我试着做一个简单的物理模拟,但是这些圆失去了所有的重力,一旦它们与另一个圆碰撞,就会粘在一起,这使得平衡它们非常容易,但这使得它看起来非常不自然,让你能够做一些违反物理定律的结构 代码: 从pygame.locals导入* 导入pygame 导入系统 pygame.init() 绿色=(0,255,0) 圆圈=[] 重力=1 def input(): 对于pygame.event.get()中的事件: 如果event.type==pygame.QUIT: pygame.quit() sys.ex

我试着做一个简单的物理模拟,但是这些圆失去了所有的重力,一旦它们与另一个圆碰撞,就会粘在一起,这使得平衡它们非常容易,但这使得它看起来非常不自然,让你能够做一些违反物理定律的结构

代码:

从pygame.locals导入*
导入pygame
导入系统
pygame.init()
绿色=(0,255,0)
圆圈=[]
重力=1
def input():
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
sys.exit()
如果event.type==pygame.MOUSEBUTTONDOWN:
圆。追加(列表(event.pos))
定义边界():
对于圆形中的圆形位置:
如果圆圈位置[1]>495:
边界=圆圈位置[1]-495
圆圈位置[1]-=边界
如果圆圈位置[0]<5:
边界2=圆形位置[0]
圆位置[0]+=边界2
如果圆圈位置[0]>995:
边界3=圆形位置[0]-995
圆圈位置[0]-=边界3
def collision():
对于i,在枚举中圈出位置1(圈):
对于圆[i+1:]中的圆[u pos_2]:
dx=圆位置2[0]-圆位置1[0]#圆位置2=y值
dy=圆位置2[1]-圆位置1[1]
如果dx*dx+dy*dy<10*10:
圆圈位置2[1]=重力
对于圆形中的圆形位置:
pygame.draw.circle(屏幕,绿色,圆圈位置,5)
def wind():
对于圆形中的圆形位置:
风=0
对于范围(2)中的i:
风+=0.01
圆圈位置[0]-=风
clock=pygame.time.clock()
screen=pygame.display.set_模式((1000500))
尽管如此:
屏幕填充((15,15,15))
输入()
mouse\u pos=pygame.mouse.get\u pos()
对于圆形中的圆形位置:
圆圈位置[1]+=重力
边界()
碰撞()
pygame.display.update()
时钟滴答(120)

我不懂Python,但在
collision()
中,您明确指出,如果圆1和圆2发生碰撞(或重叠),则圆2的重力将被释放。这自然会导致圆圈像雪花一样粘住。如果您想让它们彼此滚动,则必须更改此函数

我建议你从一个更简单的问题开始:一个圆和一个斜面。你似乎已经假设了一个下降的圆应该有恒定的速度,就像一块卵石在水中下沉一样;一种简单的方法可以将其扩展到斜面上的滑动,即使圆以一个随角度正弦变化的速度滑动


有些捷径是可能的,但如果最后一段对你没有意义,那么你必须复习三角学和基础物理学如果你不了解一些基本的物理知识,你就没有机会让这个程序运行。

这到底会发生什么变化?
from pygame.locals import *
import pygame
import sys

pygame.init()

green = (0, 255, 0)
circles = []
gravity = 1

def input():
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            circles.append(list(event.pos))

def boundaries():
    for circle_pos in circles:
        if circle_pos[1] > 495:
            boundaries = circle_pos[1] - 495
            circle_pos[1] -= boundaries
        if circle_pos[0] < 5:
            boundaries2 = circle_pos[0]
            circle_pos[0] += boundaries2
        if circle_pos[0] > 995:
            boundaries3 = circle_pos[0] - 995
            circle_pos[0] -= boundaries3


def collision():
    for i, circle_pos_1 in enumerate(circles):
        for circle_pos_2 in circles[i + 1:]:
            dx = circle_pos_2[0] - circle_pos_1[0]  # circle_pos_2 = y val
            dy = circle_pos_2[1] - circle_pos_1[1]
            if dx * dx + dy * dy < 10 * 10:
                circle_pos_2[1] -= gravity
    for circle_pos in circles:
        pygame.draw.circle(screen, green, circle_pos, 5)


def wind():
    for circle_pos in circles:
        wind = 0
        for i in range(2):
            wind += 0.01
            circle_pos[0] -= wind


clock = pygame.time.Clock()
screen = pygame.display.set_mode((1000, 500))
while True:
    screen.fill((15, 15, 15))

    input()
    mouse_pos = pygame.mouse.get_pos()

    for circle_pos in circles:
        circle_pos[1] += gravity
    boundaries()

    collision()

    pygame.display.update()
    clock.tick(120)