Pygame.Как реализовать неравномерное перемещение?

Я хочу написать небольшой физический движок на Pygame, где взаимодействуют различные геометрические примитивы. Суть в том,что мой объект при перемещении двигается рывками и застревает в границах.Я полагаю,это происходит из-за того что объект имеет скорость,например,5 пикселей за итерацию цикла,таким образом перемещение выглядит разорванным,а объекты могут застревать в границах.Но и сделать скорость 1 пиксель в итерацию я тоже не могу,иначе в чем вообще смысл движка.Есть ли способы реализовать такое перемещение?Спасибо! Красный прямоугольник застрял в черной рамке

class Border(pygame.sprite.Sprite):
    def __init__(self, x1, y1, x2, y2):
        super().__init__(all_sprites)
        if x1 == x2:
            self.add(vertical_borders)
            self.image = pygame.Surface([1, y2 - y1])
            self.rect = pygame.Rect(x1, y1, 1, y2 - y1)
        else:
            self.add(horizontal_borders)
            self.image = pygame.Surface([x2 - x1, 1])
            self.rect = pygame.Rect(x1, y1, x2 - x1, 1)


class PhysRect(pygame.sprite.Sprite):
    def __init__(self, x, y, mass=2, width=30, height=20):
        super().__init__(all_sprites)
        self.image = pygame.Surface((width, height), pygame.SRCALPHA, 32)
        self.rect = pygame.Rect(x, y, width, height)
        self.x = x
        self.y = y
        self.mass = mass
        self.width = width
        self.height = height
        self.vectors = {}
        pygame.draw.rect(self.image, pygame.Color("red"), (0, 0, width, height))

    def phys_counts(self):
        self.vectors['F_GRAV'] = [0, GRAVITY * self.mass]

    def update(self, *args):
        self.phys_counts()
        for i in self.vectors.keys():
            if not pygame.sprite.spritecollideany(self, horizontal_borders):
                self.rect.x += self.vectors[i][0]
            if not pygame.sprite.spritecollideany(self, horizontal_borders):
                self.rect.y += self.vectors[i][1]


Border(5, 5, WIDTH_SCREEN - 5, 5)
Border(5, HEIGHT_SCREEN - 5, WIDTH_SCREEN - 5, HEIGHT_SCREEN)
Border(5, 5, 5, HEIGHT_SCREEN - 5)
Border(WIDTH_SCREEN - 5, 5, WIDTH_SCREEN - 5, HEIGHT_SCREEN - 5)
while running:
    screen.fill(pygame.Color('white'))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            # if check_position(*event.pos, 60, 60):
            PhysRect(*event.pos)
    all_sprites.draw(screen)
    all_sprites.update()
    pygame.display.flip()
    clock.tick(fps)
pygame.quit()


Ответы (0 шт):