Как заставить врага следовать за игроком в pygame?

Я делаю шутер с видом сверху и хочу, чтобы мой зомби следовал за моим персонажем, а моя программа использует основной цикл. Положение моего персонажа - x и y, и он управляется клавишами со стрелками. У меня есть зомби, который на данный момент случайным образом появляется на левом краю экрана, когда в него стреляют. Как я могу заставить зомби следовать за моей позицией с того места, где он появляется?

Это зомби-функция:

def makezombie():
    global zom
    zom = Rect (0,randint(0, height-40), 49, 38)
    return zom

Я установил zombie = makezombie ()

В моем основном цикле у меня есть следующее:

for shot in shots:
    if zombie.collidepoint(shot[X],shot[Y]):
        zombie=makezombie()
        points+=1000
        impact.play()
        blood.play()

person Andre    schedule 10.06.2012    source источник


Ответы (2)


Я не уверен, что полностью понимаю вопрос, но, по сути, вы можете взять координаты игроков (x, y) и координаты зомби (x, y). Предполагая, что (xp, yp) - координаты игроков, а (xz, yz) - зомби, вы можете использовать следующий алгоритм, чтобы найти направление от зомби к игроку:

import math
(dx, dy) = ((xp - xz)/math.sqrt((xp - xz) ** 2 + (yp - yz) ** 2), 
            (yp - yz)/math.sqrt((xp - xz) ** 2 + (yp - yz) ** 2))

Затем в основном цикле вы хотите обновить координаты положения зомби x и y, выполнив newCoord = (xp + dx * spped, yp + dy * speed), где скорость - это некоторое количество пикселей, которое вы хотите, чтобы зомби перемещался за цикл. Затем перерисуйте зомби в этой новой позиции.

Надеюсь, это поможет! Если нет, то уточните вопрос.

person user1413793    schedule 10.06.2012
comment
Почему бы не использовать math.sqrt вместо ** 0.5? - person sloth; 11.06.2012
comment
Любой из них работает, но я предпочитаю не импортировать слишком много модулей, если мне это не нужно. Я действительно не уверен, что один лучше другого, хотя я признаю, что math.sqrt, вероятно, более понятен для тех, кто читает код. - person user1413793; 11.06.2012
comment
На моем ноутбуке (Python 2.7 под Ubuntu) использование math.sqrt в два раза быстрее при измерении с помощью функции timeit.timeit(). math.sqrt занимает около 631 нс на расчет (в среднем более 1 миллиона), а x**0.5 - около 1260 нс. Небольшая разница по отдельности, но если вы выполняете большое количество вычислений в цикле, скажем, при обновлении позиций большого количества персонажей в игре, это может иметь большое значение ... - person Blair; 11.06.2012
comment
Для измерения ** маршрута: import timeit; timeit.timeit('y = x**0.5', 'x=101398', number=1000000). Чтобы измерить метод math.sqrt (): import timeit; timeit.timeit('y = sqrt(x)', 'from math import sqrt; x=101398', number=1000000). - person Blair; 11.06.2012
comment
Ах, не понимал, что math.sqrt быстрее. Что ж, это будет повод начать использовать это. Спасибо! - person user1413793; 11.06.2012

Если вы знаете о векторной математике (например, евклид), вы можете использовать векторное вычитание.

zombie_speed = 50 # pixels / an update
player = Vector2(player.rect.x, player.rect.y)
zombie = Vector2(zombie.rect.x, zombie.rect.y)
movement = player - zombie
movement.normalize()
movement *= zombie_speed

Затем добавьте значения x, y движения в Rect () зомби.

person ninMonkey    schedule 10.06.2012
comment
примечание: эквивалентны ли мои последние две строки использованию точечного произведения? - person ninMonkey; 11.06.2012