mirror of https://github.com/axmolengine/axmol.git
397 lines
11 KiB
C++
397 lines
11 KiB
C++
|
#include "EffectsAdvancedTest.h"
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
kTagTextLayer = 1,
|
||
|
|
||
|
kTagSprite1 = 1,
|
||
|
kTagSprite2 = 2,
|
||
|
|
||
|
kTagBackground = 1,
|
||
|
kTagLabel = 2,
|
||
|
};
|
||
|
|
||
|
//------------------------------------------------------------------
|
||
|
//
|
||
|
// Effect1
|
||
|
//
|
||
|
//------------------------------------------------------------------
|
||
|
void Effect1::onEnter()
|
||
|
{
|
||
|
EffectAdvanceTextLayer::onEnter();
|
||
|
|
||
|
CCNode* target = getChildByTag(kTagBackground);
|
||
|
|
||
|
// To reuse a grid the grid size and the grid type must be the same.
|
||
|
// in this case:
|
||
|
// Lens3D is Grid3D and it's size is (15,10)
|
||
|
// Waves3D is Grid3D and it's size is (15,10)
|
||
|
|
||
|
CGSize size = CCDirector::getSharedDirector()->getWinSize();
|
||
|
CCIntervalAction* lens = CCLens3D::actionWithPosition(ccp(size.width/2,size.height/2), 240, ccg(15,10), 0.0f);
|
||
|
CCIntervalAction* waves = CCWaves3D::actionWithWaves(18, 15, ccg(15,10), 10);
|
||
|
|
||
|
CCFiniteTimeAction* reuse = CCReuseGrid::actionWithTimes(1);
|
||
|
CCIntervalAction* delay = CCDelayTime::actionWithDuration(8);
|
||
|
|
||
|
CCIntervalAction* orbit = CCOrbitCamera::actionWithDuration(5, 1, 2, 0, 180, 0, -90);
|
||
|
CCIntervalAction* orbit_back = orbit->reverse();
|
||
|
|
||
|
target->runAction( CCRepeatForever::actionWithAction( (CCIntervalAction *)(CCSequence::actions( orbit, orbit_back, NULL) ) ) );
|
||
|
target->runAction( CCSequence::actions(lens, delay, reuse, waves, NULL) );
|
||
|
}
|
||
|
|
||
|
std::string Effect1::title()
|
||
|
{
|
||
|
return "Lens + Waves3d and OrbitCamera";
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------
|
||
|
//
|
||
|
// Effect2
|
||
|
//
|
||
|
//------------------------------------------------------------------
|
||
|
void Effect2::onEnter()
|
||
|
{
|
||
|
EffectAdvanceTextLayer::onEnter();
|
||
|
|
||
|
CCNode* target = getChildByTag(kTagBackground);
|
||
|
|
||
|
// To reuse a grid the grid size and the grid type must be the same.
|
||
|
// in this case:
|
||
|
// ShakyTiles is TiledGrid3D and it's size is (15,10)
|
||
|
// Shuffletiles is TiledGrid3D and it's size is (15,10)
|
||
|
// TurnOfftiles is TiledGrid3D and it's size is (15,10)
|
||
|
CCIntervalAction* shaky = CCShakyTiles3D::actionWithRange(4, false, ccg(15,10), 5);
|
||
|
CCIntervalAction* shuffle = CCShuffleTiles::actionWithSeed(0, ccg(15,10), 3);
|
||
|
CCIntervalAction* turnoff = CCTurnOffTiles::actionWithSeed(0, ccg(15,10), 3);
|
||
|
CCIntervalAction* turnon = turnoff->reverse();
|
||
|
|
||
|
// reuse 2 times:
|
||
|
// 1 for shuffle
|
||
|
// 2 for turn off
|
||
|
// turnon tiles will use a new grid
|
||
|
CCFiniteTimeAction* reuse = CCReuseGrid::actionWithTimes(2);
|
||
|
|
||
|
CCIntervalAction* delay = CCDelayTime::actionWithDuration(1);
|
||
|
|
||
|
// id orbit = [OrbitCamera::actionWithDuration:5 radius:1 deltaRadius:2 angleZ:0 deltaAngleZ:180 angleX:0 deltaAngleX:-90];
|
||
|
// id orbit_back = [orbit reverse];
|
||
|
//
|
||
|
// [target runAction: [RepeatForever::actionWithAction: [Sequence actions: orbit, orbit_back, nil]]];
|
||
|
target->runAction( (CCIntervalAction *)(CCSequence::actions( shaky, delay, reuse, shuffle, delay->copy()->autorelease(), turnoff, turnon, NULL) ) );
|
||
|
}
|
||
|
|
||
|
std::string Effect2::title()
|
||
|
{
|
||
|
return "ShakyTiles + ShuffleTiles + TurnOffTiles";
|
||
|
}
|
||
|
|
||
|
|
||
|
//------------------------------------------------------------------
|
||
|
//
|
||
|
// Effect3
|
||
|
//
|
||
|
//------------------------------------------------------------------
|
||
|
void Effect3::onEnter()
|
||
|
{
|
||
|
EffectAdvanceTextLayer::onEnter();
|
||
|
|
||
|
CCNode* bg = getChildByTag(kTagBackground);
|
||
|
CCNode* target1 = bg->getChildByTag(kTagSprite1);
|
||
|
CCNode* target2 = bg->getChildByTag(kTagSprite2);
|
||
|
|
||
|
CCIntervalAction* waves = CCWaves::actionWithWaves(5, 20, true, false, ccg(15,10), 5);
|
||
|
CCIntervalAction* shaky = CCShaky3D::actionWithRange(4, false, ccg(15,10), 5);
|
||
|
|
||
|
target1->runAction( CCRepeatForever::actionWithAction( waves ) );
|
||
|
target2->runAction( CCRepeatForever::actionWithAction( shaky ) );
|
||
|
|
||
|
// moving background. Testing issue #244
|
||
|
CCIntervalAction* move = CCMoveBy::actionWithDuration(3, ccp(200,0) );
|
||
|
bg->runAction(CCRepeatForever::actionWithAction( (CCIntervalAction *)(CCSequence::actions(move, move->reverse(), NULL) ) ) );
|
||
|
}
|
||
|
|
||
|
std::string Effect3::title()
|
||
|
{
|
||
|
return "Effects on 2 sprites";
|
||
|
}
|
||
|
|
||
|
|
||
|
//------------------------------------------------------------------
|
||
|
//
|
||
|
// Effect4
|
||
|
//
|
||
|
//------------------------------------------------------------------
|
||
|
void Effect4::onEnter()
|
||
|
{
|
||
|
EffectAdvanceTextLayer::onEnter();
|
||
|
|
||
|
CCIntervalAction* lens = CCLens3D::actionWithPosition(ccp(100,180), 150, ccg(32,24), 10);
|
||
|
//id move = [MoveBy::actionWithDuration:5 position:ccp(400,0)];
|
||
|
|
||
|
/**
|
||
|
@todo we only support CCNode run actions now.
|
||
|
*/
|
||
|
// CCIntervalAction* move = CCJumpBy::actionWithDuration(5, ccp(380,0), 100, 4);
|
||
|
// CCIntervalAction* move_back = move->reverse();
|
||
|
// CCIntervalAction* seq = (CCIntervalAction *)(CCSequence::actions( move, move_back, NULL));
|
||
|
// CCActionManager::getSharedManager()->addAction(seq, lens, false);
|
||
|
|
||
|
runAction( lens );
|
||
|
}
|
||
|
|
||
|
std::string Effect4::title()
|
||
|
{
|
||
|
return "Jumpy Lens3D";
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------
|
||
|
//
|
||
|
// Effect5
|
||
|
//
|
||
|
//------------------------------------------------------------------
|
||
|
void Effect5::onEnter()
|
||
|
{
|
||
|
EffectAdvanceTextLayer::onEnter();
|
||
|
|
||
|
//CCDirector::getSharedDirector()->setProjection(CCDirectorProjection2D);
|
||
|
|
||
|
CCIntervalAction* effect = CCLiquid::actionWithWaves(1, 20, ccg(32,24), 2);
|
||
|
|
||
|
CCIntervalAction* stopEffect = (CCIntervalAction *)( CCSequence::actions(
|
||
|
effect,
|
||
|
CCDelayTime::actionWithDuration(2),
|
||
|
CCStopGrid::action(),
|
||
|
// [DelayTime::actionWithDuration:2],
|
||
|
// [[effect copy] autorelease],
|
||
|
NULL) );
|
||
|
|
||
|
CCNode* bg = getChildByTag(kTagBackground);
|
||
|
bg->runAction(stopEffect);
|
||
|
}
|
||
|
|
||
|
std::string Effect5::title()
|
||
|
{
|
||
|
return "Test Stop-Copy-Restar";
|
||
|
}
|
||
|
|
||
|
void Effect5::onExit()
|
||
|
{
|
||
|
EffectAdvanceTextLayer::onExit();
|
||
|
|
||
|
CCDirector::getSharedDirector()->setProjection(CCDirectorProjection3D);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------
|
||
|
//
|
||
|
// Effect5
|
||
|
//
|
||
|
//------------------------------------------------------------------
|
||
|
void Issue631::onEnter()
|
||
|
{
|
||
|
EffectAdvanceTextLayer::onEnter();
|
||
|
|
||
|
CCIntervalAction* effect = (CCIntervalAction*)(CCSequence::actions( CCDelayTime::actionWithDuration(2.0f), CCShaky3D::actionWithRange(16, false, ccg(5, 5), 5.0f), NULL));
|
||
|
|
||
|
// cleanup
|
||
|
CCNode* bg = getChildByTag(kTagBackground);
|
||
|
removeChild(bg, true);
|
||
|
|
||
|
// background
|
||
|
CCColorLayer* layer = CCColorLayer::layerWithColor( ccc4(255,0,0,255) );
|
||
|
addChild(layer, -10);
|
||
|
CCSprite* sprite = CCSprite::spriteWithFile("Images/grossini.png");
|
||
|
sprite->setPosition( ccp(50,80) );
|
||
|
layer->addChild(sprite, 10);
|
||
|
|
||
|
// foreground
|
||
|
CCColorLayer* layer2 = CCColorLayer::layerWithColor(ccc4( 0, 255,0,255 ) );
|
||
|
CCSprite* fog = CCSprite::spriteWithFile("Images/Fog.png");
|
||
|
|
||
|
ccBlendFunc bf = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA};
|
||
|
fog->setBlendFunc(bf);
|
||
|
layer2->addChild(fog, 1);
|
||
|
addChild(layer2, 1);
|
||
|
|
||
|
layer2->runAction( CCRepeatForever::actionWithAction(effect) );
|
||
|
}
|
||
|
|
||
|
std::string Issue631::title()
|
||
|
{
|
||
|
return "Testing Opacity";
|
||
|
}
|
||
|
|
||
|
std::string Issue631::subtitle()
|
||
|
{
|
||
|
return "Effect image should be 100% opaque. Testing issue #631";
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------
|
||
|
//
|
||
|
// EffectAdvanceTextLayer
|
||
|
//
|
||
|
//------------------------------------------------------------------
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
IDC_NEXT = 100,
|
||
|
IDC_BACK,
|
||
|
IDC_RESTART
|
||
|
};
|
||
|
|
||
|
static int sceneIdx = -1;
|
||
|
|
||
|
#define MAX_LAYER 6
|
||
|
|
||
|
CCLayer* createEffectAdvanceLayer(int nIndex)
|
||
|
{
|
||
|
switch(nIndex)
|
||
|
{
|
||
|
case 0: return new Effect3();
|
||
|
case 1: return new Effect2();
|
||
|
case 2: return new Effect1();
|
||
|
case 3: return new Effect4();
|
||
|
case 4: return new Effect5();
|
||
|
case 5: return new Issue631();
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
CCLayer* nextEffectAdvanceAction()
|
||
|
{
|
||
|
sceneIdx++;
|
||
|
sceneIdx = sceneIdx % MAX_LAYER;
|
||
|
|
||
|
CCLayer* pLayer = createEffectAdvanceLayer(sceneIdx);
|
||
|
pLayer->autorelease();
|
||
|
|
||
|
return pLayer;
|
||
|
}
|
||
|
|
||
|
CCLayer* backEffectAdvanceAction()
|
||
|
{
|
||
|
sceneIdx--;
|
||
|
int total = MAX_LAYER;
|
||
|
if( sceneIdx < 0 )
|
||
|
sceneIdx += total;
|
||
|
|
||
|
CCLayer* pLayer = createEffectAdvanceLayer(sceneIdx);
|
||
|
pLayer->autorelease();
|
||
|
|
||
|
return pLayer;
|
||
|
}
|
||
|
|
||
|
CCLayer* restartEffectAdvanceAction()
|
||
|
{
|
||
|
CCLayer* pLayer = createEffectAdvanceLayer(sceneIdx);
|
||
|
pLayer->autorelease();
|
||
|
|
||
|
return pLayer;
|
||
|
}
|
||
|
|
||
|
|
||
|
void EffectAdvanceTextLayer::onEnter(void)
|
||
|
{
|
||
|
CCLayer::onEnter();
|
||
|
float x,y;
|
||
|
|
||
|
CGSize size = CCDirector::getSharedDirector()->getWinSize();
|
||
|
x = size.width;
|
||
|
y = size.height;
|
||
|
|
||
|
CCSprite *bg = CCSprite::spriteWithFile("Images/background3.png");
|
||
|
addChild(bg, 0, kTagBackground);
|
||
|
bg->setPosition( ccp(x/2,y/2) );
|
||
|
|
||
|
CCSprite* grossini = CCSprite::spriteWithFile("Images/grossinis_sister2.png");
|
||
|
bg->addChild(grossini, 1, kTagSprite1);
|
||
|
grossini->setPosition( ccp(x/3.0f,200) );
|
||
|
CCIntervalAction* sc = CCScaleBy::actionWithDuration(2, 5);
|
||
|
CCIntervalAction* sc_back = sc->reverse();
|
||
|
grossini->runAction( CCRepeatForever::actionWithAction( (CCIntervalAction*)(CCSequence::actions(sc, sc_back, NULL)) ) );
|
||
|
|
||
|
CCSprite* tamara = CCSprite::spriteWithFile("Images/grossinis_sister1.png");
|
||
|
bg->addChild(tamara, 1, kTagSprite2);
|
||
|
tamara->setPosition( ccp(2*x/3.0f,200) );
|
||
|
CCIntervalAction* sc2 = CCScaleBy::actionWithDuration(2, 5);
|
||
|
CCIntervalAction* sc2_back = sc2->reverse();
|
||
|
tamara->runAction( CCRepeatForever::actionWithAction( (CCIntervalAction*)(CCSequence::actions(sc2, sc2_back, NULL)) ) );
|
||
|
|
||
|
CCLabel* label = CCLabel::labelWithString(title().c_str(), "Marker Felt", 28);
|
||
|
|
||
|
label->setPosition( ccp(x/2,y-80) );
|
||
|
addChild(label);
|
||
|
label->setTag( kTagLabel );
|
||
|
|
||
|
std::string strSubtitle = subtitle();
|
||
|
if( ! strSubtitle.empty() )
|
||
|
{
|
||
|
CCLabel* l = CCLabel::labelWithString(strSubtitle.c_str(), "Thonburi", 16);
|
||
|
addChild(l, 101);
|
||
|
l->setPosition( ccp(size.width/2, size.height-80) );
|
||
|
}
|
||
|
|
||
|
CCMenuItemImage *item1 = CCMenuItemImage::itemFromNormalImage("Images/b1.png", "Images/b2.png", this, menu_selector(EffectAdvanceTextLayer::backCallback) );
|
||
|
CCMenuItemImage *item2 = CCMenuItemImage::itemFromNormalImage("Images/r1.png","Images/r2.png", this, menu_selector(EffectAdvanceTextLayer::restartCallback) );
|
||
|
CCMenuItemImage *item3 = CCMenuItemImage::itemFromNormalImage("Images/f1.png", "Images/f2.png", this, menu_selector(EffectAdvanceTextLayer::nextCallback) );
|
||
|
|
||
|
CCMenu *menu = CCMenu::menuWithItems(item1, item2, item3, NULL);
|
||
|
|
||
|
menu->setPosition( CGPointZero );
|
||
|
item1->setPosition( ccp( size.width/2 - 100,30) );
|
||
|
item2->setPosition( ccp( size.width/2, 30) );
|
||
|
item3->setPosition( ccp( size.width/2 + 100,30) );
|
||
|
|
||
|
addChild(menu, 1);
|
||
|
}
|
||
|
|
||
|
EffectAdvanceTextLayer::~EffectAdvanceTextLayer(void)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
std::string EffectAdvanceTextLayer::title()
|
||
|
{
|
||
|
return "No title";
|
||
|
}
|
||
|
|
||
|
std::string EffectAdvanceTextLayer::subtitle()
|
||
|
{
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
void EffectAdvanceTextLayer::restartCallback(NSObject* pSender)
|
||
|
{
|
||
|
CCScene* s = new EffectAdvanceScene();
|
||
|
s->addChild(restartEffectAdvanceAction());
|
||
|
|
||
|
CCDirector::getSharedDirector()->replaceScene(s);
|
||
|
s->release();
|
||
|
}
|
||
|
|
||
|
void EffectAdvanceTextLayer::nextCallback(NSObject* pSender)
|
||
|
{
|
||
|
CCScene* s = new EffectAdvanceScene();
|
||
|
s->addChild( nextEffectAdvanceAction() );
|
||
|
CCDirector::getSharedDirector()->replaceScene(s);
|
||
|
|
||
|
s->release();
|
||
|
}
|
||
|
|
||
|
void EffectAdvanceTextLayer::backCallback(NSObject* pSender)
|
||
|
{
|
||
|
CCScene* s = new EffectAdvanceScene();
|
||
|
s->addChild( backEffectAdvanceAction() );
|
||
|
CCDirector::getSharedDirector()->replaceScene(s);
|
||
|
s->release();
|
||
|
}
|
||
|
|
||
|
void EffectAdvanceScene::runThisTest()
|
||
|
{
|
||
|
CCLayer* pLayer = nextEffectAdvanceAction();
|
||
|
|
||
|
addChild(pLayer);
|
||
|
CCDirector::getSharedDirector()->replaceScene(this);
|
||
|
}
|