Pygame плавное движение - PullRequest
       23

Pygame плавное движение

1 голос
/ 29 февраля 2020

Как я могу заставить прямоугольник пигмея двигаться плавно? Например, если я обновлю позицию x на 2, она будет выглядеть гладко, но если я обновлю ее на большее число, например, 25, она телепортируется в позицию. Также, если возможно, может ли это работать и для десятичных дробей?

Визуальное представление

import pygame
import math

GREEN = (20, 255, 140)
GREY = (210, 210 ,210)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
PURPLE = (255, 0, 255)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)

class Dot(pygame.sprite.Sprite):
    # This class represents a car. It derives from the "Sprite" class in Pygame.
    def __init__(self, color, width, height):

        # Call the parent class (Sprite) constructor
        super().__init__()

        # Pass in the color of the car, and its x and y position, width and height.
        # Set the background color and set it to be transparent
        self.image = pygame.Surface([width, height])
        self.image.fill(WHITE)
        self.image.set_colorkey(WHITE)
        self.color = color
        self.width = width
        self.height = height
        pygame.draw.rect(self.image, self.color, [0, 0, self.width, self.height])
        self.rect = self.image.get_rect()

1 Ответ

0 голосов
/ 29 февраля 2020

Как я могу заставить прямоугольник пигмея двигаться плавно?

Если ваш прямоугольник должен перемещаться на 25 пикселей на кадр, то нет смысла рисовать прямоугольники в позициях в между. Дисплей обновляется один раз за кадр, и нет никакого смысла рисовать прямоугольник в позициях между ними.
Возможно, вам нужно меньше кадров в секунду. В этом случае вам нужно увеличить частоту кадров и вы можете уменьшить движение. Обратите внимание, человеческий глаз может просто обрабатывать определенное количество изображений в секунду. Хитрость в том, что вы генерируете достаточно кадров, чтобы движение было плавным для человеческого глаза.

pygame.Rect может хранить только целые значения. Если вы хотите работать с очень высокой частотой кадров и точностью с плавающей точкой, то вам необходимо сохранить положение объекта в отдельных атрибутах с плавающей запятой. Синхронизируйте округленную позицию с атрибутом прямоугольника. Обратите внимание, что вы не можете нарисовать «половину» пикселя окна (по крайней мере, в Pygame).

например:

class Dot(pygame.sprite.Sprite):
    # This class represents a car. It derives from the "Sprite" class in Pygame.
    def __init__(self, color, x, y, width, height):

        # Call the parent class (Sprite) constructor
        super().__init__()

        # Pass in the color of the car, and its x and y position, width and height.
        # Set the background color and set it to be transparent
        self.x = x
        self.y = y
        self.image = pygame.Surface([width, height])
        self.image.fill(self.color)
        self.rect = self.image.get_rect(center = (round(x), round(y)))

    def update(self):
        # update position of object (change `self.x`,  ``self.y``)
        # [...]

        # synchronize position to `.rect`
        self.rect.center = (round(x), round(y))
...