Я создаю последовательность действий при воспроизведении записанных жестов. Если я только панорамирую последовательность, она воспроизводится на полной скорости. Если я только вращаюсь, он играет на полной скорости. Если бы я только масштабировал, он играет на полной скорости. Если, однако, я поворачиваюсь, а затем поворачиваюсь, вращение воспроизводит примерно половину скорости. Если я поверну, то панорамирование, панорамирование работает примерно на половине скорости. Вот функция воспроизведения. RecordData - это просто объект с информацией о времени, положении, повороте и масштабе.
-(void) Play
{
int count = [m_MoveTos count];
if (count < 2)
{
return;
}
[m_Actor stopAllActions];
[m_Actions removeAllObjects];
RecordData* start = [m_MoveTos objectAtIndex:0];
m_Actor.position = start.Pos;
m_Actor.rotation = start.Rotate;
m_Actor.scale = start.Scale;
NSLog(@"Starting with %d nodes.", [m_MoveTos count]);
NSLog(@"Actor Start Position:%f, %f Rotation:%f, Scale:%f", m_Actor.position.x, m_Actor.position.y, m_Actor.rotation, m_Actor.scale);
float lastTime = 0;
RecordData* lastData = start;
//Skip start
for(int i = 1; i < count; ++i)
{
bool delay = true;
RecordData* rData = [m_MoveTos objectAtIndex:i];
float delta = rData.Time - lastTime;
if(rData.Pos.x != lastData.Pos.x || rData.Pos.y != lastData.Pos.y)
{
CCAction* moveAction = [CCMoveTo actionWithDuration:delta position:rData.Pos];
[m_Actions addObject:moveAction];
delay = false;
}
if (rData.Rotate != lastData.Rotate)
{
// Put this in Record data
float degrees = rData.Rotate;
int sign = degrees/ABS(degrees);
degrees = ABS(degrees);
while (degrees > 360)
{
degrees -= 360;
}
degrees *= sign;
NSLog(@"Rotation %f", degrees);
CCAction* rotAction = [CCRotateTo actionWithDuration:delta angle:degrees];
[m_Actions addObject:rotAction];
delay = false;
}
if (rData.Scale != lastData.Scale)
{
CCAction* scaleAction = [CCScaleTo actionWithDuration:delta scale:rData.Scale];
[m_Actions addObject:scaleAction];
delay = false;
}
if(delay)
{
CCActionInterval* delayTime = [CCDelayTime actionWithDuration:delta];
[m_Actions addObject:delayTime];
}
delay = true;
lastTime = rData.Time;
}
if([m_Actions count] < 2)
{
return;
}
CCAction* seq = [CCSequence actionsWithArray:[m_Actions getNSArray]];
[m_Actor runAction:seq];
}
Есть что-то, что я пропускаю?
Спасибо,
Jim