Python – PyGame – Учебные векторы / анимация

Итак, я не очень разбираюсь в математике и надеялся получить очень необходимую обратную связь. Моя цель для начинающих – просто заставить изображение преследовать мою мышь. Есть несколько вещей, которые я не ожидал, что я хотел бы получить отзывы.

1) Чейз очень жесткий и следует за мышью очень … «угловым» способом, меняет направление только на то, что кажется установленным на экране (средняя ось x, средняя ось y и диагонали).

2) Я хочу, чтобы скорость была постоянной, но изображение движется быстрее, когда оно приближается к мыши.

3) Когда изображение доходит до мыши, «рогатки» передают мышь, создавая размытое безумие, а не достигая положения мыши и останавливаясь.

Это мои основные заботы, но если вы увидите что-то, что я, возможно, не понимаю. ПОЖАЛУЙСТА, скажите мне. Я умираю, чтобы понять всю эту векторную / тригонометрию (чтобы скоро войти в физику).

def follow (self): mouse_pos = pygame.mouse.get_pos() diff = (self.xPos-mouse_pos[0], self.yPos-mouse_pos[1]) vector = math.sqrt(diff[0]**2 + diff[1]**2) distance = (self.xPos/vector, self.yPos/vector) if (self.xPos, self.yPos) == mouse_pos: return if mouse_pos[0] >= self.xPos: self.xPos += distance[0] else: self.xPos -= distance[0] if mouse_pos[1] >= self.yPos: self.yPos += distance[1] else: self.yPos -= distance[1] 

(Вся программа можно увидеть здесь http://ideone.com/6OxWLi )

Заранее благодарю за любую помощь!

    Я не знаю, что вы имели в виду с вашим vector переменных и distance , но ИМО их имена должны быть заменены. В вашем коде vector представляет собой длину вектора diff , который вычисляется с использованием теоремы Пифагора:

     d^2 = dx^2 + dy^2 d = sqrt(dx^2 + dy^2) 

    В вашем коде есть переменная distance , которая является вектором положения, только нормированная (деленная на свою длину). Вот почему я предпочитаю обменять их имена. Кроме того, более интересным будет вектор diff в нормированной форме. Так что сделайте следующее:

     distance = math.sqrt(diff[0]**2, diff[1]**2) # instead of `vector = ...` diff_norm = (diff[0] / distance, diff[1] / distance) # instead of `distance = ...` 

    С этого момента, каждый раз, когда я пишу distance , я предполагаю, что вы поменяли имена и обозначили значение расстояния, а не нормализованный вектор. То же самое с vector , с которого я буду теперь называть diff_norm (нормализованный вектор разности).

    Теперь, к вашим проблемам:

    1) и 2) должно быть лучше, если вы используете вектор diff_norm (нормализованный вектор разности вместо нормализованного вектора положения, который действительно не имеет смысла: P).

    3) Очень маловероятно, что позиция вашего изображения (self.xPos, self.yPos) будет в точности точкой мыши в любой точке. Поскольку вы используете числа с плавающей запятой для своей позиции (python делает это для вас), они, вероятно, никогда не будут точно на пикселе. Таким образом, ваше изображение никогда не будет точно в позиции мыши. Поэтому вместо написания (self.xPos, self.yPos) == mouse_pos вы должны проверить, действительно ли расстояние вашего изображения до мыши близко, например, менее 1 или двух пикселей:

     if distance <= 2: return 

    Кроме того, вам не нужно все if / else в конце – вектор diff_norm может иметь отрицательные значения, поэтому вам не нужно проверять, являются ли они отрицательными – просто вычтите вектор diff_norm из вектора позиции так:

     self.xPos -= diff[0] self.yPos -= diff[1]