Вращение спрайта по кривой Безье в cocos2d - PullRequest
3 голосов
/ 03 апреля 2012

Я пытаюсь заставить спрайт следовать кривой Безье. Я нашел несколько сообщений на форуме на сайте cocos2d и следовал инструкциям, но я все еще не могу заставить спрайт вращаться правильно. Может ли кто-нибудь помочь.

Код, который я добавил в метод обновления функции BezierBy, выглядит следующим образом

float qx = (powf(1-t,2)*xa + 2*(1-t)*t*xb+powf(t,2)*xc);
float qy = (powf(1-t,2)*ya + 2*(1-t)*t*yb+powf(t,2)*yc);

double deltaX = x-qx;
double deltaY = y-qy;

double degrees = (-180/M_PI)*ccpToAngle(CGPointMake(deltaX,deltaY));

[target_ setRotation:degrees];

Оригинал статьи можно найти здесь

Любая помощь будет великолепна в тот момент, когда вращение кажется довольно неустойчивым

Ответы [ 2 ]

4 голосов
/ 12 апреля 2013

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

CGPoint vector = ccpSub(sprite.position, lastPosition);
sprite.rotation = atan2(vector.x, vector.y) * 180 / M_PI;
lastPosition = sprite.position;

Вам, конечно, нужно поместить этот код в цикл обновления с lastPosition в качестве глобальной переменной.

4 голосов
/ 03 апреля 2012

Всякий раз, когда мне нужен спрайт, чтобы следовать по определенному пути Безье и вращаться соответственно. Я создаю путь Безье, используя CCBezier. И используйте метод CCRotateTo для поворота спрайта на определенный угол. Длительность поворота равна продолжительности действия Безье, а угол поворота можно рассчитать вручную. Как и в вашей картинке угол составляет от -45 до 45. Таким образом, код может выглядеть следующим образом ..

ccBezierConfig bezier;
bezier.controlPoint_1 = ccp(0, s.height/2);
bezier.controlPoint_2 = ccp(300, -s.height/2);
bezier.endPosition = ccp(300,100);

id bezierForward = [CCBezierBy actionWithDuration:10 bezier:bezier];
[sprite runAction:bezierForward];

[sprite setRotation:-45];
[sprite runAction:[CCRotateTo actionWithDuration:10 angle:45]];

Заполнить значения соответственно .. Это всего лишь фрагмент кода ..:)

...