cocos2d-x v3 c Отбрасывает тень cocos2d :: Sprite

#c #cocos2d-x #shadow

#c #cocos2d-x #тень

Вопрос:

Насколько я выяснил, cocos не предлагает простой обработки фильтров, как, например, AS3.

Моя ситуация: я хочу добавить тень в реальном времени к cocos2d :: Sprite.

Например, я хотел бы сделать что-то подобное (аналогично AS3):

 auto mySprite = Sprite::createWithSpriteFrameName("myCharacter.png");

DropShadowFilter* dropShadow = new DropShadowFilter();
dropShadow->distance = 0;
dropShadow->angle = 45;
dropShadow->color = 0x333333;
dropShadow->alpha = 1;
dropShadow->blurX = 10;
dropShadow->blurY = 10;
dropShadow->strength = 1;
dropShadow->quality = 15;

mySprite->addFilter(dropShadow);
  

Это должно добавить тень к моему спрайту для достижения такого результата:
Пример Adobe Drop Shadow

Не могли бы вы мне помочь, пожалуйста?

Ответ №1:

В Cocos2D-X нет встроенной поддержки теней. Sprites

Лучшим вариантом с точки зрения производительности было бы уже размещать ваши тени в ваших изображениях спрайтов, вместо того, чтобы вычислять и рисовать их в коде.

Другой вариант — создать подкласс Sprite и переопределить draw метод, чтобы дублировать спрайт, применять свои эффекты и рисовать его ниже оригинала.

Один из возможных способов добиться этого — использовать этот фрагмент из этой темы на форуме Cocos. Я не могу сказать, что я полностью понимаю, что этот код делает с преобразованиями GL, но вы можете использовать это как отправную точку для экспериментов.

 void CMySprite::draw()
{
  // is_shadow is true if this sprite is to be considered like a shadow sprite, false otherwise.@
  if (is_shadow)
  {
    ccBlendFunc blend;
    // Change the default blending factors to this one.
    blend.src = GL_SRC_ALPHA;
    blend.dst = GL_ONE;
    setBlendFunc( blend );
    // Change the blending equation to thi in order to subtract from the values already written in the frame buffer
    // the ones of the sprite.
    glBlendEquationOES(GL_FUNC_REVERSE_SUBTRACT_OES);
  }

  CCSprite::draw();

  if (is_shadow)
  {
     // The default blending function of cocos2d-x is GL_FUNC_ADD.
    glBlendEquationOES(GL_FUNC_ADD_OES);        
  }
}
  

Комментарии:

1. Спасибо между ними. Я проверю это.