pygame - 1D упругие столкновения дают странное поведение. подозреваю, что проблема может быть связана с числами фп - PullRequest
0 голосов
/ 25 марта 2019

Вот это видео, сделанное 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>

...