2014-02-03 3 views
3

Как создать эффект 2D пульсации воды с помощью спрайт-комплект.Создайте эффект 2d пульсации с комплектом спрайтов

Как я есть сцена, которые включают в себя 2D еще воды и при постукивании по этому, маленьким кругам появляются масштаб и исчезают говорят 5-6 кругов масштабирование параллельно давая ощущение ряби Не actualy делать ничего воду просто создавая на нем изображения.

Мне было интересно, что может быть лучшим способом решить эту проблему. Как я могу добиться чего-то подобного. Есть идеи?

+2

Просто добавьте круги и увеличьте их, когда они исчезнут, это должно сделать трюк. Нерестительные круги в одном и том же месте с некоторым промежутком времени между ними должны делать трюк. –

ответ

3

В узле, в котором вы хотите создать пульсации просто сделать что-то вроде этого

NSTimeInterval singleRippleDuration = 1.0f; 
    CGFloat ripleEndScale = 3.0f; 
    NSTimeInterval timeBetweenRipples = 0.3f; 
    NSUInteger numberOfRipples = 5; 
    SKAction* scaleUpAction = [SKAction scaleTo:ripleEndScale duration:singleRippleDuration]; 
    SKAction* fadeOutAction = [SKAction fadeOutWithDuration:singleRippleDuration]; 

    SKAction* rippleAction = [SKAction group:@[scaleUpAction,fadeOutAction]]; 

    SKAction* createRipple = [SKAction runBlock:^{ 
     //Create your ripple node somehow (SKShapeNode or SKSprite will do) 
     //set it to a desired position 
     [rippleNode setPosition:desiredPosition]; 
     //Set scale to 0 so it scales from point 
     [rippleNode setScale:0.0f]; 
     [rippleNode runAction:createRipple]; 
     [self addChild:rippleNode]; 
    }]; 

    SKAction* wait = [SKAction waitForDuration:timeBetweenRipples]; 

    [self runAction:[SKAction repeatAction:[SKAction sequence:@[createRipple,wait]] count:numberOfRipples]]; 
+0

Спасибо, что много повторил действие сделал трюк :) – Hassy

+0

Привет, ваш образец кода выглядит хорошо, но я не могу заставить его работать. Я использовал этот код, чтобы создать круг (не заполненный), чтобы нарисовать эффект пульсации. '+ (SKShapeNode *) dibujarCircunferencia: (NSInteger) радио { \t CGRect box = CGRectMake (0.0f, 0.0f, радио, радио); \t CGMutablePathRef path = CGPathCreateMutable(); \t CGPathAddEllipseInRect (путь, NULL, поле); \t \t SKShapeNode * circle = [узел SKShapeNode]; \t circle.path = путь; \t CGPathRelease (путь); \t circle.alpha = 0.5f; \t circle.lineWidth = 1.0f; \t круг.тактныйColor = [SKColor orangeColor]; \t \t Обратный круг; } ' –

+0

А вот НОД block.'runBlock:^{ \t \t // Создать свой мультипликационный узел каким-то образом (SKShapeNode или SKSprite будет делать) \t \t SKShapeNode * rippleNode; \t \t SKSpriteNode * rn; \t \t rippleNode = [punto dibujarCircunferencia: 150]; \t \t // установите его в нужное положение \t \t rippleNode.position = CGPointMake (0.0f, 0.0f); \t \t // Установите масштаб на 0, чтобы он масштабировался с точки \t \t rippleNode.scale = 0.0f; \t \t рябьюNode.lineWidth = 0.5f; \t \t rn = rippleNode; \t \t rn.zPosition = 1.0f; \t \t \t \t [rippleNode runAction: createRipple]; \t \t [self.player addChild: rn]; \t}]; 'Я не знаю, что я делаю неправильно. –

1

Существует опечатка в методе «CreateRipple», она работает сама в кодоблок, а не «rippleAction», как он должен , скорректированный метод:

SKAction* createRipple = [SKAction runBlock:^{ 
    //Create your ripple node somehow (SKShapeNode or SKSprite will do) 
    //set it to a desired position 
    [rippleNode setPosition:desiredPosition]; 
    //Set scale to 0 so it scales from point 
    [rippleNode setScale:0.0f]; 
    [rippleNode runAction:rippleAction]; 
    [self addChild:rippleNode]; 
}]; 

Надеюсь, что это поможет!

+0

снова - что такое 'self' и что такое' rippleNode'? –

+0

Я просто исправлял ответ выше, у меня не было опыта, чтобы комментировать его, поэтому просто ударил его в другом ответе (извините, если это неправильный способ сделать это), см. Выше для остальной информации – steve

+0

Код будет внутри любого метода на контроллере представления, например, прикосновении. Сам узел мог просто быть кругом/овальным спрайтом, поскольку он растет больше и исчезает, как рябь – steve

0

Вот полный очень простой пример кода @ Dobroćudni Tapir. Если вы разрабатываете iOS, вы можете попробовать в touchsBegan вместо mouseDown.

import SpriteKit 

class GameScene: SKScene { 
    override func mouseDown(theEvent: NSEvent) { 
     /* Called when a mouse click occurs */ 
     let location = theEvent.locationInNode(self) 
     let singleRippleDuration = 1.0 
     let ripleEndScale = CGFloat(3.0) 
     let timeBetweenRipples = 0.3 
     let numberOfRipples = 3 
     let scaleUpAction = SKAction.scaleTo(ripleEndScale, duration: singleRippleDuration) 
     let fadeOutAction = SKAction.fadeOutWithDuration(singleRippleDuration) 
     let rippleAction = SKAction.group([scaleUpAction, fadeOutAction]) 

     let createRipple = SKAction.runBlock({ 
      let rippleNode = SKShapeNode(circleOfRadius: 200) 
      rippleNode.position = location 
      rippleNode.setScale(0) 
      rippleNode.runAction(rippleAction) 
      self.addChild(rippleNode) 
     }) 

     let wait = SKAction.waitForDuration(timeBetweenRipples) 
     runAction(SKAction.repeatAction(SKAction.sequence([createRipple, wait]), count: numberOfRipples)) 
    } 
} 
Смежные вопросы