Можно ли в Pygame реализовать постепенное передвижение объекта к заданным координатам?

Можно ли в Pygame реализовать постепенное передвижение объекта к заданным координатам?

x[0] = 10
y[0]=10
x[1] = 40
y[1]=40
width=10
height=10
pygame.draw.rect(win,(0,0,255),(x[1],y[1],width,height))
pygame.draw.rect(win,(0,0,255),(x[0],y[0],width,height))

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

Автор решения: PythonGODS

Я нашёл этот вопрос и ужаснулся что он так долго пролежал без ответа.

Я решил написать нужный код под Pygame и Python3 и math. Эта функция принимает координаты объекта и скорость с которой он будет двигаться (желательно брать 2 и больше). Двигаться он будет к координатам 300, 300 и это можно изменить в "cen". Возвращать функция будет следующие координаты объекта при движении в cen от x,y. Объяснять долго математику я не хочу, поэтому вот код:

import math,pygame
def movement(x, y, s):
    cen = [300, 300]
    g = ((x-cen[0])2 + (y-cen[1])2)*0.5
    if g==0:
        return 
    u = math.asin((y-cen[1])/g)
    res = [int(round(abs(s*math.cos(u)))), int(round(abs(s*math.cos(math.pi/2-u))))]
    if x < cen[0]:
        res[0] = x + res[0]
    else:
        res[0] = x - res[0] 
    if y < cen[1]:
        res[1] = y + res[1]
    else:
        res[1] = y - res[1]
    return res
→ Ссылка
Автор решения: GaMisych

Вот еще вариант, который я сделал для себя и поделился. В этом варианте передвижение реализовано через класс.

class Name_class(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load(r'assets\images\image.png') #путь к изображению
        self.rect = self.image.get_rect()
        self.rect.center = 300, 300 #координаты на которых появится изображение

    def draw(self, surface):
        surface.blit(self.image, self.rect) # отображение картинки на экране

    def move(self, cen, s): # функция передвижения
        x = self.rect.center[0]
        y = self.rect.center[1]
        g = ((x - cen[0]) * 2 + (y-cen[1]) * 2) * 0.5
        if g == 0:
            return
        u = math.asin((y - cen[1]) / g)
        res = [int(round(abs(s * math.cos(u)))), int(round(abs(s * math.cos(math.pi / 2 - u))))]
        if x < cen[0]:
            res[0] = x + res[0]
        else:
            res[0] = x - res[0]
        if y < cen[1]:
            res[1] = y + res[1]
        else:
            res[1] = y - res[1]
        self.rect.center = res

А в главном файле(если у вас код в разных файлах) импартируйте ваш класс и пишите

class = Name_class()
class.draw(screen) # screen = pygame.display.set_mode((WIDTH, HEIGHT))
boss_hand.move((400, 300), 2) # координаты на которые перемещается картинка и скорость
→ Ссылка