@stepuasha

Как двигать обьект по вектору?

Итак, начал изучать модуль socket, и чтобы вылезти из скучной консоли, решил набросать клон агарио с мультиплеером.

так вот, у меня есть клиент, который отправляет вектор своего двжиения на сервер в формате ,

на сервере специальная функция, обрабатывает эту форму, и возвращает список формата (X, Y)
def find(s):
    otkr = None
    for i in range(len(s)):
        if s[i] == '<':
            otkr=i
        if s[i] == '>' and otkr != None:
            zakr = i
            res = s[otkr+1:zakr]
            res = list(map(int, res.split(',')))
            return res


далее с помощью метода класса Player, созданного мной для хранения данных о подключенных пользователей, я заставляю шарик двигаться по нормализованному вектору (этот термин я узнал буквально недавно, но подумал, что стоит об этом рассказать)
def change_speed(self, v):
        if (v[0] == 0) and (v[1] == 0):
            self.speed.x = 0
            self.speed.y = 0
        else:
            lenv = (v[0]**2 + v[1]**2) ** 0.5
            v = (v[0]/lenv, v[1]/lenv)
            v = (v[0]*self.abs_speed, v[1]*self.abs_speed)
            self.speed_x, self.speed_y = v[0], v[1]


и всё двигается, но вот проблема в том, что двигается не бесконечно по вектору, а только до курсора мыши (а мне нужно чтобы шарик летел бесконечно по направленной)

код класса Player:
class Player:
 
    def __init__(self, conn, addr, x, y, r, colour): 
        self.conn = conn
        self.addr = addr
        self.x = x
        self.y = y
        self.r = r
        self.colour = colour
        self.errors = 0
 
        self.speed_x = 0
        self.speed_y = 0
        self.abs_speed = 10
    
    def update(self):
        self.x += self.speed_x
        self.y += self.speed_y
 
    def change_speed(self, v):
        if (v[0] == 0) and (v[1] == 0):
            self.speed.x = 0
            self.speed.y = 0
        else:
            lenv = (v[0]**2 + v[1]**2) ** 0.5
            v = (v[0]/lenv, v[1]/lenv)
            v = (v[0]*self.abs_speed, v[1]*self.abs_speed)
            self.speed_x, self.speed_y = v[0], v[1]
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ну для начала, тебе стоит помнить, что у тебя ДВЕ координатных системы.
1. Координаты окна. Они используются при рисовании шарика в окне и при получении позиции мыши.
2. Координаты мира. Они определяют позицию объектов в мире и используются при определении коллизий шарика с другими шариками и "едой".
Ты можешь принять решение, что эти координатные системы совпадают, и я подозреваю что ты так и сделал. Но это будет иметь последствия.

С положительной стороны, тебе не надо преобразовывать координаты из одной системы в другую, и в частности не надо реализовывать скроллинг мира. Но тогда положение мыши относительно шарика меняется, даже если пользователь ничего не делает. Потому что шарик будет "догонять" мышь, вместо того чтобы скроллить мир в этом направлении.

А шарик перестанет двигаться, достигнув позиции мыши - потому что у него уже не будет направления на мышь, так как их позиции совпадают. Если точнее, шарик будет легонько колебаться вокруг позиции мыши.

Так что либо смирись с тем, что шарик может "догнать" мышь, либо реализуй полноценное преобразование координат. Тогда отрисовываться у тебя будет не весь мир, а только "окно", центрированное на позиции игрока.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы