Pygame как сделать движение плавным

import pygame as pg

pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
rect1 = pg.Rect(100, 100, 161, 100)

done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True
        if event.type == pg.MOUSEMOTION:
            if event.buttons[0]:  # Left mouse button is down.
                # Move the rect.
                rect1.x += event.rel[0]
                rect1.y += event.rel[1]

    screen.fill((30, 30, 30))
    pg.draw.rect(screen, (0, 100, 250), rect1)
    pg.display.flip()
    clock.tick(30)

Код выше рисует Rect и его можно перемещать, что происходит достаточно плавно (предполагаю, что это может происходить из за того что он рисуется (draw) на каждой итерации.

Но код ниже не обладает такими же характеристиками - Rect перемещается резко. Из за чего невозможно его двигать быстро. Мне интересно как можно исправить код чтобы все работало как с первой программой, учитывая что Rect'ов должно быть два и один из них должен быть зафиксирован.

import pygame as pg
import sys

pg.init()

sc = pg.display.set_mode((600, 500))
sc.fill((200, 255, 200))

font1 = pg.font.SysFont('arial', 90)
text1 = font1.render('fixed', True, (0, 255, 0))
place1 = text1.get_rect(center=(200, 150))
# rect1 = text1.get_rect()

font2 = pg.font.SysFont('arial', 40)
text2 = font2.render('moving', True, (0, 0, 255))
place2 = text2.get_rect(bottomright=(600, 500))

while True:
    for i in pg.event.get():
        if i.type == pg.QUIT:
            sys.exit()
        elif i.type == pg.MOUSEMOTION:
            if i.buttons[0]:
                if place2.collidepoint(i.pos):
                    place2.x += i.rel[0]
                    place2.y += i.rel[1]

    sc.fill((200, 255, 200))
    pg.draw.aalines(sc, (0, 0, 0), True, [place1.topleft, place1.topright, place1.bottomright, place1.bottomleft])
    pg.draw.aalines(sc, (0, 0, 0), True, [place2.topleft, place2.topright, place2.bottomright, place2.bottomleft])
    sc.blit(text1, place1)
    sc.blit(text2, place2)

    pg.display.update()

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

Автор решения: Smart Beetle

Надо понимать то, что в pygame анимация и все движения происходит покадрово. Поэтому желательно перед новым кадром делать задержку .И команда задержки это: clock.tick(FPS). Тогда задержка между кадрами равна 60(1 секунда) / FPS.Я вам советую добавить вначале программы clock = pg.time.Clock() и в конце цикла clock.tick(FPS).А с Rect-ами можно создать классы(если этот проект масштабный) или можно менять координаты только одного ректа, а второй рект просто перерисовывать на экране

→ Ссылка
Автор решения: S. Nick

Попробуйте так:

import sys
import pygame as pg
from pygame.locals import *

pg.init()

sc = pg.display.set_mode((600, 500))
sc.fill((200, 255, 200))
clock = pg.time.Clock()
font1 = pg.font.SysFont('arial', 90)
text1 = font1.render('fixed', True, (0, 255, 0))
place1 = text1.get_rect(center=(200, 150))

font2 = pg.font.SysFont('arial', 40)
text2 = font2.render('moving', True, (0, 0, 255))
place2 = text2.get_rect(bottomright=(600, 500))

flag = None                                                     # +++

while True:
    for i in pg.event.get():
        if i.type == pg.QUIT:
            sys.exit()

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        if i.type == pg.MOUSEBUTTONDOWN:
            if place2.collidepoint(i.pos):
                flag = True
            else: 
                flag = None 

        if i.type == MOUSEMOTION:
            if i.buttons[0]:
                rel = i.rel
                if flag:
                    place2.x += rel[0]
                    place2.y += rel[1]
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    sc.fill((200, 255, 200))
    pg.draw.aalines(sc, (0, 0, 0), True, [place1.topleft, place1.topright, place1.bottomright, place1.bottomleft])
    pg.draw.aalines(sc, (0, 0, 0), True, [place2.topleft, place2.topright, place2.bottomright, place2.bottomleft])
    sc.blit(text1, place1)
    sc.blit(text2, place2)

    pg.display.update()
    pg.display.flip()
    clock.tick(60)

введите сюда описание изображения

→ Ссылка