我怎样才能让我的圆圈自然移动而不是在它们碰撞时不受重力影响?
How can I make my circles move naturally instead of not receiving gravity when they collide?
我正在尝试做一个简单的物理模拟,但是圆圈失去了所有引力,一旦与另一个圆圈碰撞就会粘在一起,这使得平衡它们变得非常容易,但它看起来很不自然,让你能够做违反物理定律的结构,比如 this 一个。
代码:
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)
我不知道 Python,但似乎在 collision()
中你明确指出如果圆 1 和圆 2 碰撞(或重叠),那么 重力是为圆圈 2 汇款。 自然这会导致圆圈像雪花一样粘在一起。如果你想让它们互相滚动,你必须改变这个功能。
我建议你从一个更简单的问题开始:一个圆和一个斜面。您似乎已经假设下落的圆应该具有恒定的速度,就像鹅卵石在水中下沉一样;将其扩展到在倾斜平面上滑动的一种简单方法是让圆圈以随角度的正弦变化的速度滑动。
有些捷径是可能的,但如果最后一段对您没有意义,那么您必须复习三角学和基础物理学。 如果不了解一些基本物理知识,您将无法使该程序运行。
我正在尝试做一个简单的物理模拟,但是圆圈失去了所有引力,一旦与另一个圆圈碰撞就会粘在一起,这使得平衡它们变得非常容易,但它看起来很不自然,让你能够做违反物理定律的结构,比如 this 一个。
代码:
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)
我不知道 Python,但似乎在 collision()
中你明确指出如果圆 1 和圆 2 碰撞(或重叠),那么 重力是为圆圈 2 汇款。 自然这会导致圆圈像雪花一样粘在一起。如果你想让它们互相滚动,你必须改变这个功能。
我建议你从一个更简单的问题开始:一个圆和一个斜面。您似乎已经假设下落的圆应该具有恒定的速度,就像鹅卵石在水中下沉一样;将其扩展到在倾斜平面上滑动的一种简单方法是让圆圈以随角度的正弦变化的速度滑动。
有些捷径是可能的,但如果最后一段对您没有意义,那么您必须复习三角学和基础物理学。 如果不了解一些基本物理知识,您将无法使该程序运行。