Cocos2d, как сделать один спрайт после другого спрайта? - PullRequest
4 голосов
/ 22 ноября 2011

У меня есть игра-лабиринт, использующая cocos2d У меня есть один основной спрайт, который может сохранить "друг" спрайт Как только «друг» спрайт сталкивается с основным спрайтом, «друг» спрайт будет следовать за основным спрайтом везде. Теперь я не знаю, как заставить «друга» спрайта следовать за основным спрайтом со статическим расстоянием и плавным движением. Я имею в виду, если основной спрайт идет вверх, «друг» будет позади основного спрайта. Если основной спрайт ушел влево, «дружественный» спрайт будет справа от основного спрайта. Пожалуйста, помогите мне и поделитесь со мной кодом ...

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

Вы можете реализовать следующее поведение, используя позицию своего основного спрайта в качестве цели для дружественного спрайта. Это может включать в себя разделение (поддержание минимального расстояния), сцепление (поддержание максимального расстояния) и ослабление (чтобы сделать движение плавным).

Точные алгоритмы (и некоторые другие) подробно описаны в замечательной анимационной работе Крейга Рейнольдса . Есть также видео с отдельными функциями и пример исходного кода (на C ++).

Алгоритм, который вам нужен (это комбинация нескольких более простых): Лидер после

РЕДАКТИРОВАТЬ : Я нашел две простые реализации упомянутых в статье алгоритмов с видимым исходным кодом здесь и здесь . Вам нужно будет немного рекомбинировать их от скопления (которое в основном следует за центроидом) до следования за одним лидером. Язык - это Processing, напоминающий java-подобный псевдокод, поэтому я надеюсь, что с пониманием не должно возникнуть никаких проблем. Исходный код C ++ , о котором я упоминал ранее, также можно загрузить, но в нем нет явного описания лидера.
Я не знаю ни о каких реализациях cocos2d там.

1 голос
/ 03 мая 2012

У меня есть простое решение, работающее нормально.Следуйте документу cocos2d, начало работы, урок 2, Ваша первая игра .После реализации сенсорного события.Используйте следующий код, чтобы настроить seeker1 для следования cocosGuy:

- (void) nextFrame:(ccTime)dt {

    float dx = cocosGuy.position.x - seeker1.position.x;
    float dy = cocosGuy.position.y - seeker1.position.y;
    float d = sqrt(dx*dx + dy*dy);
    float v = 100;

    if (d >  1) {
        seeker1.position = ccp( seeker1.position.x + dx/d * v *dt, 
                           seeker1.position.y + dy/d * v *dt);
    } else {
        seeker1.position = ccp(cocosGuy.position.x, cocosGuy.position.y);
    }
   }

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

...