Как создать градиент в Spritekit?

Есть ли способ создать поле с градиентной заливкой в ​​SpriteKit? Я попытался заполнить этим узел формы, но он отмечает, что с skshapenode работают только сплошные цвета.


person AwDogsGo2Heaven    schedule 08.10.2013    source источник
comment
Я вернулся... и нашел это: gist.github.com/Tantas/7fc01803d6b559da48d6   -  person Jonny    schedule 25.01.2016
comment
Обратитесь к этому stackoverflow.com/questions/18894493/   -  person Suresh    schedule 05.10.2016


Ответы (4)


Я не думаю, что это возможно с текущим SKShapeNode, который в настоящее время едва справляется со своими основными функциями. Хорошим подходом, если вы не хотите использовать уже существующие градиентные изображения спрайтов, было бы создать SKTexture из применения CIFilter (например, CILinearGradient в данном случае) к основному изображению блока, а затем создать SKSpriteNode из этого SKTexture.

person Matt    schedule 08.10.2013

Вот решение. (Обратите внимание, я использую Rubymotion, привязку ruby ​​для Objective C/iOS, однако логика точно такая же. Если кто-то хочет отредактировать это и поставить эквивалент Objective C, вперед

  size = CGSizeMake(50,50)
  scale = options[:scale] || UIScreen.mainScreen.scale
  opaque = options.fetch(:opaque, false)

  UIGraphicsBeginImageContextWithOptions(size, opaque, scale)
  context = UIGraphicsGetCurrentContext()

  gradient = CAGradientLayer.layer
  gradient.frame = CGRectMake(0,0,50,50)
  gradient.colors = [SKColor.blackColor.CGColor,SKColor.whiteColor.CGColor]
  gradient.renderInContext(context)

  image = UIGraphicsGetImageFromCurrentImageContext()
  UIGraphicsEndImageContext()

  texture = SKTexture.textureWithCGImage(image.CGImage)
  node = SKSpriteNode.alloc.initWithTexture(texture)
person AwDogsGo2Heaven    schedule 13.10.2013
comment
Спасибо, но это не сработает для OSX:Sprite Kit. Он ограничен iOS. - person Jonny; 15.10.2013
comment
UIGraphicsBeginImageContextWithOptions не существует. - person Jonny; 16.10.2013
comment
Я использую Rubymotion и хотел бы увидеть рубиновую версию этого кода. - person BananaNeil; 26.11.2016

Хорошо, вот что я использую сейчас. Я взял за основу решение AwDogsGo2Heaven, но адаптированное для Mac. Было бы сладко с одним полностью совместимым решением. Я далеко не уверен, как создавать контексты. Но вроде работает. Также я не уверен в масштабе. Работает на Mac с сетчаткой и Mac без Retina и не видит никаких проблем, но контекст создается с использованием масштаба 2, поэтому может быть излишним для Mac без Retina. Я поместил это в категорию на SKTexture.

Чтобы использовать его, просто позвоните +(SKTexture*)gradientWithSize:(const CGSize)SIZE colors:(NSArray*)colors.

Изменить: Обновленный код и дополнительные обсуждения здесь: Текстура градиента имеет неправильный масштаб на Retina Mac

person Jonny    schedule 21.10.2013

Ответ Мэтта правильный, но я пока не могу добавить градиент. Это моя текущая попытка, если кто-то знает, как заставить ее работать, пожалуйста, обновите для темы.

Вот Ссылка на основное изображение

CIFilter *gradientFilter = [CIFilter filterWithName:@"CILinearGradient"];
//[gradientFilter setDefaults];
CIColor *startColor = [CIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
CIColor *endColor = [CIColor colorWithRed:0 green:0 blue:0 alpha:1.0];
CIVector *startVector = [CIVector vectorWithX:0 Y:0];
CIVector *endVector = [CIVector vectorWithX:0.21 Y:0.31];
[gradientFilter setValue:startVector forKey:@"inputPoint0"];
[gradientFilter setValue:endVector forKey:@"inputPoint1"];
[gradientFilter setValue:startColor forKey:@"inputColor0"];
[gradientFilter setValue:endColor forKey:@"inputColor1"];

SKEffectNode *effectNode = [SKEffectNode node];
effectNode.filter = gradientFilter;
effectNode.shouldEnableEffects = YES;

[self addChild:effectNode];
//effectNode.position = CGPointMake(200, 200);

Еще один хороший способ протестировать свои фильтры — загрузить демонстрационное приложение CIFunHouse с WWDC 2013.

person DogCoffee    schedule 08.10.2013
comment
Я смог создать градиент с помощью CAGradientLayer и создать контекст UIImage, визуализировать этот слой в контексте и создать текстуру из полученного UIImage, это было быстро, и я не заметил никакого замедления (но мне нужно было только чтобы создать один для кнопки). - person AwDogsGo2Heaven; 11.10.2013
comment
Я добавил ответ выше. - person AwDogsGo2Heaven; 13.10.2013
comment
Тем не менее, это работает только для iOS, и этот вопрос не ограничивается iOS. - person Jonny; 18.10.2013
comment
Также вылетает на первой строке с tvOS. Приложение завершает работу из-за необработанного исключения «NSUnknownKeyException», причина: «[‹CILinearGradient 0x15ddc03a0› setValue:forUndefinedKey:]: этот класс не соответствует кодированию значения ключа для ключа inputImage». - person Jonny; 22.10.2015
comment
Ок попробую поработать. Использование не правильное. - person Jonny; 22.10.2015
comment
Сейчас. произошел сбой с сообщением об ошибке inputImage неопределенным ключом и т. д. и т. д. на iOS 14. - person user3069232; 09.07.2021