Хранить эти положения отдельными переменными (где они будут float), и только потом присваивать их самим rect.x/y
Тут для примера я завел отдельные (rx/ry), но можно использовать и уже заведенные x/y только с учетом, что это предполагалось как центр объекта.
..
class Bullet(pygame.sprite.Sprite):
def __init__(self, screen, speed_x):
pygame.sprite.Sprite.__init__(self)
self.x, self.y = 550.0, 450.0
self.screen = screen
self.image = pygame.image.load("img/bullet.png").convert()
self.rect = self.image.get_rect(center=(self.x, self.y))
# для хранения наших координат
self.rx, self.ry = self.rect.x, self.rect.y
self.speed_x = speed_x
self.speed_y = 0.1
def update(self):
if self.ry > 0:
self.ry -= self.speed_y
self.rx += self.speed_x
# и вот теперь уже присваиваем значения
self.rect.x, self.rect.y = self.rx, self.ry
else:
self.kill()
Можно и напрямую присваивать x/y (без этих rx/ry) только работать с rect.centerx:
..
def update(self):
if self.y > 0:
self.y -= self.speed_y
self.x += self.speed_x
self.rect.centerx, self.rect.centery = self.x, self.y
else:
self.kill()