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