Часть проблемы - это субпиксельные расстояния.Я думаю, что ваша главная проблема - ваше y
движение.Посмотрите на это уравнение для self.y +=
, половину времени оно приведет к расстоянию в пиксель только в один пиксель.Когда это добавлено к self.rect, округление (или усечение) приведет к исчезновению величин менее 1 пикселя.Например, сгенерированное случайное целое число равно 99, затем разделенное на 100, равно 0,99 пикселя.В питоне int(0.99)
это ноль.Таким образом, примерно в половине случаев движение равно нулю, а в другой половине - только 1 пиксель, начиная с int(150/100)
=> 1
.(Один из каждых ~ 190 моментов будет 2 пикселя.)
def update(self):
if self.is_falling:
"""Move the ball down."""
self.y += random.randint(10, 200) / 100
self.rect.y = self.y
Также, как указывает @ 6502, это даст резкое случайное движение.Было бы лучше генерировать скорость в пикселях на обновление в классе __init__
и придерживаться этого.
def __init__( self, ... ):
...
self.fall_speed = random.randint(10, 200) # pixels per update
def update(self):
if self.is_falling:
"""Move the ball down."""
self.y += self.fall_speed
self.rect.y = self.y
Мне нравится заставлять вещи двигаться на основе расчетов в реальном времени.Это требует скорости объекта и временных интервалов между кадрами, чтобы определить, насколько объект переместился.Мне это нравится, потому что, если вы хотите добавить гравитацию (или что-то еще) в программу, легко вычислить новую позицию.
class FallingSprite( pygame.sprite.Sprite ):
""" A falling sprite. Falls at a constant velocity in real-time """
def __init__( self, image ):
pygame.sprite.Sprite.__init__( self )
self.image = image
self.rect = self.image.get_rect()
self.fall_speed = random.randint(10, 200) # pixels / second
self.last_update = int( time.time() * 1000.0 )
self.rect.center = ( random.randrange( 0, WINDOW_WIDTH ), 0 )
def update( self ):
# There may have been movement since the last update
# so calculate the new position (if any)
if ( self.fall_speed > 0 ):
time_now = int( time.time() * 1000.0 )
time_change = time_now - self.last_update # How long since last update?
if ( time_change > 0 ):
distance_moved = time_change * self.fall_speed / 1000
now_x, now_y = self.rect.center # Where am I, right now
updated_y = now_y + distance_moved
# Did we fall off the bottom of the screen?
if ( updated_y > WINDOW_HEIGHT ):
# sprite disappears
self.kill()
else:
self.rect.center = ( now_x, updated_y )
self.last_update = time_now