#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. Спасибо между ними. Я проверю это.