Cocos2d - переместить спрайт из точки A в точку B в синусоидальном движении
Каков был бы лучший способ сделать это? Я вижу действие CCEaseSineInOut, но, похоже, его нельзя использовать для этого.
Мне нужно перейти с одной стороны экрана на другую. Спрайт должен двигаться по синусоидальному закону по экрану.
1 ответ
Мне всегда нравится иметь полный контроль над CCNode
движение. Я использую только CCAction
чтобы делать очень простые вещи. Хотя ваш случай звучит достаточно просто, чтобы, возможно, сделать с CCAction
с, я покажу вам, как двигаться CCNode
согласно любой функции с течением времени. Вы также можете изменить масштаб, цвет, непрозрачность, вращение и даже точку привязки с помощью той же техники.
@interface SomeLayer : CCLayer
{
CCNode *nodeToMove;
float t; // time elapsed
}
@end
@implementation SomeLayer
// Assumes nodeToMove has been created somewhere else
-(void)startAction
{
t = 0;
// updateNodeProperties: gets called at the framerate
// The exact time between calls is passed to the selector
[self schedule:@selector(updateNodeProperties:)];
}
-(void)updateNodeProperties:(ccTime)dt
{
t += dt;
// Option 1: Update properties "differentially"
CGPoint velocity = ccp( Vx(t), Vy(t) ); // You have to provide Vx(t), and Vy(t)
nodeToMove.position = ccpAdd(nodeToMove.position, ccpMult(velocity, dt));
nodeToMove.rotation = ...
nodeToMove.scale = ...
...
// Option 2: Update properties non-differentially
nodeToMove.position = ccp( x(t), y(t) ); // You have to provide x(t) and y(t)
nodeToMove.rotation = ...
nodeToMove.scale = ...
...
// In either case, you may want to stop the action if some condition is met
// i.e.)
if(nodeToMove.position.x > [[CCDirector sharedDirector] winSize].width){
[self unschedule:@selector(updateNodeProperties:)];
// Perhaps you also want to call some other method now
[self callToSomeMethod];
}
}
@end
Для вашей конкретной проблемы, вы можете использовать вариант 2 с x(t) = k * t + c
, а также y(t) = A * sin(w * t) + d
,
Математическая записка № 1: x(t)
а также y(t)
называются параметризацией положения. Vx(t)
а также Vy(t)
являются параметризацией скорости.
Примечание № 2: Если вы изучали исчисление, станет очевидным, что вариант 2 предотвращает накопление позиционных ошибок во времени (особенно для низких частот кадров). По возможности используйте вариант 2. Однако часто проще использовать вариант 1, когда точность не имеет значения или когда пользовательский ввод активно изменяет параметризацию.
Есть много преимуществ использования CCAction
s. Они обрабатывают вызов других функций в определенное время для вас. Они отслеживаются, так что вы можете легко приостановить их и перезапустить или считать их.
Но когда вам действительно нужно управлять узлами в целом, это способ сделать это. Например, для сложных или сложных формул для положения гораздо проще изменить параметризацию, чем выяснить, как реализовать эту параметризацию в CCAction
s.