Cocos2d-x fornece efeitos especiais de ação muito ricos.
Por exemplo: animação em grade, efeitos de distorção, efeitos de flutuação de blocos 3D
código:
#include “ActionEffect.h”
#include “HelloWorldScene.h”
static const char * _actionName [] =
{
“CCFadeOutBLTiles”,
“CCFadeOutDownTiles”,
“CCFadeOutTRTiles”,
“CCFadeOutUpTiles”,
“CCFlipX3D”,
“CCFlipY3D”,
“CCJumpTiles3D”,
“CCLens3D”,
"CCLiquid"
“CCPageTurn3D”,
“CCRipple3D”,
“CCShaky3D”,
“CCShakyTiles3D”,
“CCShatteredTiles3D”,
“CCShuffleTiles”,
“CCSplitCols”,
“CCSplitRows”,
“CCTurnOffTiles”,
“CCTwirl”,
“CCWaves”,
“CCWaves3D”,
“CCWavesTiles3D”
};
CCScene * ActionEffect :: scene ()
{
CCScene * s = CCScene :: criar ();
ActionEffect * layer = ActionEffect :: create ();
s-> addChild (camada);
return s;
}
bool ActionEffect :: init ()
{
CCLayer :: init ();
CCSize winSize = CCDirector :: sharedDirector () -> getWinSize ();
CCNode * c = CCNode :: criar ();
_c = c;
int actionCount = sizeof (_actionName) / sizeof (* _ actionName);
para (int i = 0; i <actionCount; i ++)
{
/ *
CCSprite * bg = CCSprite :: create ("HelloWorld.png");
c-> addChild (bg);
bg-> setPosition (ccp (winSize.width / 2 + i * winSize.width, winSize.height / 2));
* /
Camada CCLayerColor *;
if (i% 2 == 0)
{
camada = CCLayerColor :: criar (ccc4 (192, 192, 192, 255), winSize.width, winSize.height);
}
outro
{
camada = CCLayerColor :: criar (ccc4 (128, 128, 128, 255), winSize.width, winSize.height);
}
c-> addChild (camada);
layer-> setPosition (ccp (i * winSize.width, 0));
/ * Definir Título * /
const char * title = _actionName [i];
CCLabelTTF * rótulo = CCLabelTTF :: criar (título, “Arial”, 36);
camada-> addChild (rótulo, 1000);
label-> setPosition (ccp (winSize.width / 2, winSize.height - 80));
}
CCScrollView * view = CCScrollView :: create (winSize, c);
view-> setDirection (kCCScrollViewDirectionHorizontal);
view-> setContentSize (CCSize (winSize.width * actionCount, winSize.height));
addChild (ver);
c-> setPositionX ((1 - actionCount) * winSize.width);
// pode tocar
setTouchEnabled (true);
setTouchMode (kCCTouchesOneByOne);
return true;
}
bool ActionEffect :: ccTouchBegan (CCTouch *, CCEvent *)
{
return true;
}
void ActionEffect :: testAction (int idx, camada CCLayerColor *)
{
CCSize winSize = CCDirector :: sharedDirector () -> getWinSize ();
CCSprite * sprite = (CCSprite *) layer-> getUserObject ();
if (sprite == NULL)
{
// sprite = CCSprite :: create (“background3.png”);
sprite = CCSprite :: create (“HelloWorld.png”);
layer-> setUserObject (sprite);
layer-> addChild (sprite);
}
const char * an = _actionName [idx];
CCAction * action = NULL;
sprite-> setPosition (ccp (winSize.width / 2, winSize.height / 2));
CCMoveBy * moveBy = CCMoveBy :: create (4, ccp (0, sprite-> getContentSize (). Height / 2 - winSize.height / 2));
// A grade desaparece do canto superior direito para o canto inferior esquerdo
// O primeiro parâmetro: tempo
// O segundo parâmetro: tamanho da grade
if (an == “CCFadeOutBLTiles”)
{
ação = CCFadeOutBLTiles :: criar (5, CCSize (16, 12));
}
// A grade se fecha e desaparece de cima para baixo
// O primeiro parâmetro: tempo
// O segundo parâmetro: tamanho da grade
if (an == “CCFadeOutDownTiles”)
{
action = CCFadeOutDownTiles :: create (5, CCSize (16, 12));
}
// A grade desaparece da parte inferior esquerda para a parte superior direita
if (an == “CCFadeOutTRTiles”)
{
ação = CCFadeOutTRTiles :: criar (5, CCSize (16, 12));
}
// A grade desaparece de baixo para cima
if (an == “CCFadeOutUpTiles”)
{
ação = CCFadeOutUpTiles :: criar (5, CCSize (16, 12));
}
// Cria um efeito de reversão 3D no eixo X
if (an == “CCFlipX3D”) // afeta o toque
{
ação = CCFlipX3D :: criar (5);
}
// Cria um efeito especial reverso 3D do eixo Y
if (an == “CCFlipY3D”)
{
ação = CCFlipY3D :: criar (5) ;;
}
// Efeitos de batimento da grade
if (an == “CCJumpTiles3D”)
{// Parâmetros: tempo, tamanho da grade, tempos, amplitude
ação = CCJumpTiles3D :: criar (5, CCSize (16, 12), 56, 5.0f);
}
// Efeitos especiais de lentes convexas
if (an == “CCLens3D”)
{
// Parâmetros: tempo, tamanho da grade, coordenadas do centro do círculo, raio do círculo
ação = CCLens3D :: criar (5, CCSize (16, 12), ccp (winSize.width / 2, winSize.height / 2), 100);
}
// Efeitos líquidos
if (um == “CCLiquid”)
{
// Parâmetros: tempo, tamanho da grade, velocidade, amplitude
ação = CCLiquid :: criar (56, CCSize (16, 12), 56, 2.0f);
}
// efeitos de viragem de página 3D
if (an == “CCPageTurn3D”)
{
ação = CCPageTurn3D :: criar (5, CCSize (16, 12));
}
// Cria um efeito 3D water porter
if (an == “CCRipple3D”)
{
// Parâmetros: tempo, tamanho da grade, coordenadas, raio, velocidade, amplitude
ação = CCRipple3D :: criar (10, CCSize (16, 12), ccp (winSize.width / 2, winSize.height / 2), 100, 10, 50.0f);
}
// Crie um efeito de vibração 3D
if (an == “CCShaky3D”)
{
// Parâmetros: tempo, tamanho da grade de agitação, intervalo de agitação, se o eixo Z tremeu
ação = CCShaky3D :: criar (10, CCSize (16, 12), 2, verdadeiro);
}
// Crie um efeito de vibração 3D
if (an == “CCShakyTiles3D”)
{
// Parâmetros: tempo, tamanho da grade de agitação, intervalo de agitação, se o eixo Z tremeu
ação = CCShakyTiles3D :: criar (5, CCSize (16, 12), 2, verdadeiro);
}
// Cria um efeito especial de ladrilho quebrado 3D
if (an == “CCShatteredTiles3D”)
{
// Parâmetros: tempo, tamanho da grade de agitação, intervalo de agitação, se o eixo Z tremeu
ação = CCShatteredTiles3D :: criar (1, CCSize (16, 12), 7, verdadeiro);
}
// Tile shuffling efeitos especiais
if (an == “CCShuffleTiles”)
{
// Parâmetros: tempo, tamanho da grade, número aleatório
ação = CCShuffleTiles :: criar (5, CCSize (16, 12), CCRANDOM_0_1 () * 10000);
}
// Efeito de desaparecimento de várias linhas (vertical)
if (an == “CCSplitCols”)
{
// Parâmetros: tempo, número de linhas
ação = CCSplitCols :: criar (5, 9);
}
// Efeito de desaparecimento de várias linhas (horizontal)
if (an == “CCSplitRows”)
{
// Parâmetros: tempo, número de linhas
ação = CCSplitRows :: criar (5, 9);
}
// O quadrado desaparece
if (an == “CCTurnOffTiles”)
{
// Parâmetros: tempo, tamanho da grade, número aleatório
ação = CCTurnOffTiles :: criar (5, CCSize (16, 12));
}
// Crie um efeito de distorção
if (an == “CCTwirl”)
{
// Tempo, tamanho da grade, coordenadas, número de distorções, amplitude
ação = CCTwirl :: criar (5, CCSize (16, 12), ccp (winSize.width / 2, winSize.height / 2), 5, 5.0f);
}
// Cria um efeito de onda
if (an == “CCWaves”)
{
// Parâmetros: tempo, tamanho da grade de vibração, velocidade de flutuação, amplitude, se flutuação horizontal, se flutuação vertical
ação = CCWaves :: criar (5, CCSize (16, 12), 5, 5.0f, verdadeiro, falso);
}
// Crie um efeito de onda 3D
if (an == “CCWaves3D”)
{
// Parâmetros: tempo, tamanho da grade de agitação, velocidade da onda, amplitude
ação = CCWaves3D :: criar (5, CCSize (16, 12), 5, 5.0f);
}
// Crie um efeito de onda em mosaico 3D
if (an == “CCWavesTiles3D”)
{
// Parâmetros: tempo, tamanho da grade de agitação, velocidade da onda, amplitude
ação = CCWavesTiles3D :: criar (5, CCSize (16, 12), 5, 5.0f);
}
if (ação)
{
sprite-> runAction (ação);
}
}
void ActionEffect :: ccTouchEnded (CCTouch * t, CCEvent *)
{
CCPoint ptStart = t-> getStartLocation ();
CCPoint ptEnd = t-> getLocation ();
if (ptStart.getDistanceSq (ptEnd) <= 25)
{
// clique
// Qual janela filha foi clicada
// Converte ptStart para as coordenadas do Container em ScrollView
// Em seguida, julgue a LayerColor que foi clicada
CCPoint ptInContainer = _c-> convertToNodeSpace (ptStart);
CCArray * arr = _c-> getChildren (); // todas as cores da camada
for (int i = 0; i <sizeof (_actionName) / sizeof (* _ actionName); i ++)
{
CCLayerColor * layer = (CCLayerColor *) arr-> objectAtIndex (i);
if (layer-> boundingBox (). containsPoint (ptInContainer))
{
testAction (i, camada);
pausa;
}
}
}
}