Вот это видео, сделанное 3b1b: https://www.youtube.com/watch?v=jsYwFizhncE. И я подумал, что не будет слишком сложно выучить python / pygame, вычислив пи таким образом (сталкивающийся блок с массой * 10 ^ n, скорость 1 смасса блока 1, сама сталкивается со стеной).Не могу заставить это работать.Совет был бы высоко оценен.
эластичная функция (должна обновлять скорости соответствующих объектов при столкновении):
def elastic(Sspeedx, Bspeedx):
Bspeedx = ((Bbox.mass - Sbox.mass) * Bbox.speedx + 2 * Sbox.mass * Sbox.speedx)/(Bbox.mass + Sbox.mass)
Sspeedx = (2 * Bbox.mass * Bbox.speedx - (Bbox.mass - Sbox.mass)* Sbox.speedx)/(Bbox.mass + Sbox.mass)
Bbox.speedx = Bspeedx
Sbox.speedx = Sspeedx
оба блока одинаково определены в разных классах (помимо массы и скорости)ofc)
class Bbox(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((250, 250))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.bottom = HEIGHT - 50
self.rect.right = WIDTH - 300
self.speedx = 1.0
self.mass = 10.0
def update(self):
self.rect.x -= self.speedx
Столкновение проверено в игровом цикле:
running = True
while running:
clock.tick(FPS)
collide = pygame.sprite.groupcollide(bigboi, smallboi, False, False)
if collide:
elastic(Sbox.speedx, Bbox.speedx)
print(Bbox.speedx)
print(Sbox.speedx)
col = col + 1
print(col)
if Sbox.rect.left <=0:
Sbox.speedx = -Sbox.speedx
col = col + 1
print(col)
вызов функций обновления, рисование спрайтов и т. д. ... операторы печати предназначены для устранения неполадок
дляудобство: Bbox или bigbox - это b, а Sbox или smallbox - это s, когда b (масса = 1, скорость = 1) и s (масса = 1, скорость = 0): после столкновения vb = 0 vs = 1 кажется нормальнымно такое поведение происходит для всех целых масс b (масса = 1,2,3, ..., 10 ..., 150000, ...).: (
НО !!
Когда b (масса = 10,0, скорость = 1) и s (то же самое), то VB 0,81818 ... и VS = 1,818181. Что является правильным УРА!и так будут следующие выводы, пока s не застрянет на стене. :( Все первые тесты, которые я протестировал в N.0, работают, пока s не застрянет на стене или другом блоке.
Это делаетя думаю, что проблема связана с числами с плавающей запятой. Должен ли я думать об этом?
Чтобы блоки не прилипали друг к другу, я добавил:
Bbox.rect.left = Sbox.rect.right +10
вфункция упругости, но после того, что обычно происходит от 80 до 100 столкновений, они перестают двигаться, хотя скорости s и b нигде не близки к 0.
Это почти весь сценарий, но я понятия не имел, где такое поведениеЯ благодарен, если кто-нибудь может дать мне возможность учиться <3. </p>