Sprite Kit - Тень на нескольких движущихся объектах, на которые воздействуют импульс и гравитация

Основываясь на моем первом вопросе здесь, на который ответил Theis Egeberg (Решение было объяснено Theis в комментарии и работало как по волшебству) Мне также нужно было бы знать следующее :

(У этого может быть простой ответ, но я оставлю его Theis или любому, кто может понять это.)

Что, если у меня есть другой объект, отскакивающий от уже движущегося мяча по оси Y с другой скоростью? как изменить альфу его тени на шаре.

Чтобы объяснить это понятнее и сделать более запутанным, предположим, что у нас есть ракетка для пинг-понга, которая движется вверх и вниз, и мячик для пинг-понга, который отскакивает от нее. С помощью формулы, которую ранее предоставил Theis, мы теперь знаем, как анимировать альфа-канал ракетки для пинг-понга (ранее мяч) на земле, но как насчет тени от мячика для пинг-понга на ракетке? как мы можем изменить его непрозрачность на ракетке? Будет ли это так же просто, как использовать одну и ту же формулу для обеих ракет и шаров :)? Можно ли использовать его как класс и использовать несколько раз здесь и там, и как бы вы написали и использовали его в таких местах, как обновление?

Вот код, который я реализовал, используя формулу Тайса Эгеберга.

- (void)update:(CFTimeInterval)currentTime
{

[self enumerateChildNodesWithName:@"shadowOnTheGround" usingBlock:^(SKNode *node, BOOL *stop) {

        SKSpriteNode* racket = (SKSpriteNode*)[self childNodeWithName:@"racket"];

        node.position = CGPointMake(60,217);

        float racketY = racket.position.y;
        float theisFormula = (430.0- recketY)/430;
        node.alpha = theisFormula;
      //NSLog(@"%f", theisFormula);

}]; 
}

person adimona    schedule 29.04.2014    source источник
comment
Вы реализовали что-нибудь на основе ответа Тиса Эгеберга? Пожалуйста, опубликуйте этот код, чтобы люди могли иметь более четкое представление.   -  person ZeMoon    schedule 29.04.2014
comment
Конечно, для справки я добавил код в описание. Спасибо   -  person adimona    schedule 29.04.2014
comment
проверьте ответ, который я разместил   -  person ZeMoon    schedule 29.04.2014


Ответы (1)


Вы можете связать каждый теневой узел с его конкретным генератором теней, используя свойство userData.

shadowNode.name = @"shadowOnTheGround" //as you have set

NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObject:racketNode forKey:@"caster"];
//racketnode refers to the caster object

shadowNode.userData = dic;

Теперь в методе -update:

- (void)update:(CFTimeInterval)currentTime
{

    [self enumerateChildNodesWithName:@"shadowOnTheGround" usingBlock:^(SKNode *node, BOOL *stop) {

        SKSpriteNode* caster = (SKSpriteNode*)[node.userData objectForKey:@"caster"];

//You have your shadow node and it's caster, apply generic code for transforming shadow.

        node.position = CGPointMake(60,217); //Is this needed?

        float casterY = caster.position.y;
        float theisFormula = (430.0- casterY)/430;  //Make this generic
        node.alpha = theisFormula;
      //NSLog(@"%f", theisFormula);

}]; 
}

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

person ZeMoon    schedule 29.04.2014
comment
Привет, спасибо. где и как использовать кастер? Я вижу, вы убрали ссылку на ракетный узел из обновления и заменили его заклинателем, но как бы вы использовали заклинатель? будет ли это похоже на caster.postion.y ? - person adimona; 29.04.2014
comment
Кастер — это просто имя узла, который «отбрасывает» тень. Таким образом, заклинателем может быть что угодно, мяч, ракетка или что-то еще. - person ZeMoon; 29.04.2014
comment
И да, вы правы насчет caster.postion.y. Я отредактировал ответ. - person ZeMoon; 29.04.2014