2014-01-25 5 views
6

Ищете помощь по созданию пользовательского SKAction (набора спрайтов), который выполняет отскок?SpriteKit Custom SKAction = Bounce?

В принципе, нужно отбросить спрайт с верхнего экрана на нижний (ось Y) и выполнить его быстрое отскок (вверх и вниз по оси Y).

Примечание: Не хотите использовать физический движок.

Я посмотрел несколько примеров твинов в Интернете (на C), но математика заставляет мои глазные яблоки заглядывать и загружаться, но не совсем ясно, как бы я интегрировал эти функции в любом случае. Я также экспериментировал с секвенированием SKAction, используя moveTo и moveBy, но эффект не настолько плавный.

ответ

5

Вы можете комбинировать несколько SKActions для достижения эффекта.

CGFloat bounceFactor = 0.2f; 
SKAction* dropAction = [SKAction moveByX:0 y:-dropHeight duration:0.3f]; 
SKAction* bounce = [SKAction sequence:@[[SKAction moveByX:0 y:dropHeight*bounceFactor duration:0.1f], 
             [SKAction moveByX:0 y:-dropHeigh*bounceFactor duration:0.1f], 
             [SKAction moveByX:0 y:dropHeight*bounceFactor/2 duration:0.1f], 
             [SKAction moveByX:0 y:-dropHeight*bounceFactor/2 duration:0.1f]]]; 

[node runAction:[SKAction group:@[dropAction,bounce]]]; 

Также вы можете играть около SKActionTimingMode, чтобы сделать отскок реалистичным.

2

Я хотел бы сделать простой расчет скорости:

В вашем @ интерфейс/заголовок (чтобы Ивар глобальный):

CGFloat velocity; // velocity 
CGFloat gravity; // force of gravity 
CGFloat ballY; // the ball location 
CGFloat floorY; // the floor location 
CGFloat dampening; // a float 0 to 1, where 0 will mean no bounce 

В вашем методе настройки (начальные скорости и Ys):

velocity = <some number here>; 
gravity = <another number>; 
ballY = <another number>; 
floorY = <another number>; 
dampening = <another number>; 

В -update сцены: метод (это ускоряет мяч и отскакивает его на дно):

velocity += gravity; // increases velocity with gravity 
ballY += velocity; // update position 

if (ballY > floorY) { 
    ballY = floorY; // don't let the ball past floor 
    velocity *= dampening; // dampens velocity on the bounce 
    velocity *= -1; // change direction 
} 

sprite.position = CGPointMake(0, ballY); 
1

Мне нужно было сделать то же самое недавно. Я был удивлен, увидев, что Apple не поддерживает весенние анимации в SpriteKit, учитывая, что они добавили их в UIKit два года назад.

Я видел, что они добавили свойство timingFunction на SKAction в iOS 8, но это не решает проблему, так как вам нужно выйти за пределы вашей цели, если вы подпрыгиваете.

Сначала я только что объединил несколько под-действий с помощью SKAction.sequence, изменив значения и режимы синхронизации на глаз, но результат был довольно хромым.

Я закончил работу над математикой и сделал набор расширений, чтобы иметь возможность выполнять большинство SKActions с эффектом бодрящего эффекта. Он работает точно так же, как и UIView, вы просто добавляете демпфирование и начальную скорость к своим обычным SKActions, и все готово. Библиотека реплицирует большинство заводских методов SKAction, но вы также можете использовать методы низкого уровня для анимации любого свойства CGFloat на ваших SKNodes.

Код на GitHub, не стесняйтесь использовать его: https://github.com/ataugeron/SpriteKit-Spring

Смежные вопросы