1 添加场景切换效果
供场景切换的类:
CCTransitionJumpZoom
CCTransitionProgressRadialCCW
CCTransitionProgressRadialCW
CCTransitionProgressHorizontal
CCTransitionProgressVertical
CCTransitionProgressInOut
CCTransitionProgressOutIn
CCTransitionCrossFade
CCTransitionFadeTR
CCTransitionFadeBL
CCTransitionFadeUp
CCTransitionFadeDown
CCTransitionTurnOffTiles
CCTransitionSplitRows
CCTransitionSplitCols
CCTransitionFade
CCTransitionShrinkGrow
CCTransitionRotoZoom
CCTransitionMoveInL
CCTransitionMoveInR
CCTransitionMoveInT
CCTransitionMoveInB
CCTransitionSlideInL
CCTransitionSlideInR
CCTransitionSlideInT
CCTransitionSlideInB
场景切换案例:
TMenu.h
#ifndef __TMenu_H__
#define __TMenu_H__
#include "cocos2d.h"
USING_NS_CC;
class TMenu:public CCLayer
{
public:
static CCScene * scene();
CREATE_FUNC(TMenu);
bool init();
CCMenu * menu;
void menuCallback(CCObject * sender);
void closeCallback(CCObject * sender);
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
};
#endif
TMenu.cpp
#include "TMenu.h"
#include "AppMacros.h"
#include "T01LayerAnchorPoint.h"
#include "T02LayerSprite.h"
#include "T03LayerZorder.h"
#include "T04ColorLayer.h"
#include "T05Coordinate.h"
#include "T06BatchNode.h"
#include "T07Schedule.h"
#include "T08Touch.h"
#include "T09Memory.h"
#include "T10Label.h"
#include "T11CCMenu.h"
#include "T12UI.h"
#include "T13Action.h"
#include "T14Animation.h"
#include "T15Speed.h"
#include "T16CCFollow.h"
#include "T17CCProgressTo.h"
#include "T18Grid3D.h"
#include "T19Draw.h"
#include "T20Music.h"
#include "T21Particle.h"
#include "T22UserDefault.h"
//供场景切换用
static CCTransitionScene * switchSceneEffect(int index,float t,CCScene *s)
{
switch (index)
{
case 0:
return CCTransitionJumpZoom::create(t, s);
break;
case 1:
return CCTransitionProgressRadialCCW::create(t, s);
break;
case 2:
return CCTransitionProgressRadialCW::create(t, s);
break;
case 3:
return CCTransitionProgressHorizontal::create(t, s);
break;
case 4:
return CCTransitionProgressVertical::create(t, s);
break;
case 5:
return CCTransitionProgressInOut::create(t, s);
break;
case 6:
return CCTransitionProgressOutIn::create(t, s);
break;
case 7:
return CCTransitionCrossFade::create(t, s);
break;
case 8:
return CCTransitionCrossFade::create(t, s);
break;
case 9:
return CCTransitionFadeTR::create(t, s);
break;
case 10:
return CCTransitionFadeBL::create(t ,s);
break;
case 11:
return CCTransitionFadeUp::create(t, s);
break;
case 12:
return CCTransitionFadeDown::create(t, s);
break;
case 13:
return CCTransitionTurnOffTiles::create(t, s);
break;
case 14:
return CCTransitionSplitRows::create(t, s);
break;
case 15:
return CCTransitionSplitCols::create(t, s);
break;
case 16:
return CCTransitionFade::create(t, s);
break;
case 17:
return CCTransitionShrinkGrow::create(t, s);
break;
case 18:
return CCTransitionRotoZoom::create(t, s);
break;
case 19:
return CCTransitionMoveInL::create(t, s);
break;
case 20:
return CCTransitionMoveInR::create(t, s);
break;
case 21:
return CCTransitionMoveInT::create(t, s);
break;
case 22:
return CCTransitionMoveInB::create(t, s);
break;
case 23:
return CCTransitionSlideInL::create(t, s);
break;
case 24:
return CCTransitionSlideInR::create(t, s);
break;
case 25:
return CCTransitionSlideInT::create(t, s);
break;
case 26:
return CCTransitionSlideInB::create(t, s);
break;
}
}
static char * menu_array[]
{
"T01LayerAnchorPoint.h",
"T02LayerSprite.h",
"T03LayerZorder.h",
"T04ColorLayer.h",
"T05Coordinate.h",
"T06BatchNode.h",
"T07Schedule.h",
"T08Touch.h",
"T09Memory.h",
"T10Label.h",
"T11CCMenu.h",
"T12UI.h",
"T13Action.h",
"T14Animation.h",
"T15Speed.h",
"T16CCFollow.h",
"T17CCProgressTo.h",
"T18Grid3D.h",
"T19Draw.h",
"T20Music.h",
"T21Particle.h",
"T22UserDefault.h"
};
CCScene * TMenu::scene()
{
CCScene * scene = CCScene::create();
TMenu * layer = TMenu::create();
scene->addChild(layer);
return scene;
}
bool TMenu::init()
{
CCLayer::init();
menu = CCMenu::create();
for (int i = 0; i < sizeof(menu_array) / sizeof(*menu_array); i++)
{
CCMenuItem * item = CCMenuItemFont::create(menu_array[i],
this,
menu_selector(TMenu::menuCallback));
menu->addChild(item);
}
menu->alignItemsVertically();
addChild(menu);
CCArray * array = menu->getChildren();
CCObject * obj;
int i = 0;
CCARRAY_FOREACH(array,obj)
{
CCMenuItem * item = (CCMenuItem*)obj;
item->setTag(i + 1 + 10000);
i++;
}
CCMenuItem * closeItem = CCMenuItemImage::create("CloseNormal.png", "CloseSelected.png");
closeItem->setTarget(this, menu_selector(TMenu::closeCallback));
CCMenu * menu2 = CCMenu::create(closeItem, NULL);
menu2->setPosition(CCPointZero);
closeItem->setPosition(ccp(winSize.width - closeItem->getContentSize().width / 2,
winSize.height - closeItem->getContentSize().height / 2));
addChild(menu2);
setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne);
return true;
}
void TMenu::menuCallback(CCObject * sender)
{
CCMenuItem * item = (CCMenuItem *)sender;
CCScene * pScene = NULL;
switch (item->getTag()-10000)
{
case 1:
pScene = T01LayerAnchorPoint::scene();
break;
case 2:
pScene = T02LayerSprite::scene();
break;
case 3:
pScene = T03LayerZorder::scene();
break;
case 4:
pScene = T04ColorLayer::scene();
break;
case 5:
pScene = T05Coordinate::scene();
break;
case 6:
pScene = T06BatchNode::scene();
break;
case 7:
pScene = T07Schedule::scene();
break;
case 8:
pScene = T08Touch::scene();
break;
case 9:
pScene = T09Memory::scene();
break;
case 10:
pScene = T10Label::scene();
break;
case 11:
pScene = T11CCMenu::scene();
break;
case 12:
pScene = T12UI::scene();
break;
case 13:
pScene = T13Action::scene();
break;
case 14:
pScene = T14Animation::scene();
break;
case 15:
pScene = T15Speed::scene();
break;
case 16:
pScene = T16CCFollow::scene();
break;
case 17:
pScene = T17CCProgressTo::scene();
break;
case 18:
pScene = T18Grid3D::scene();
break;
case 19:
pScene = T19Draw::scene();
break;
case 20:
pScene = T20Music::scene();
break;
case 21:
pScene = T21Particle::scene();
break;
case 22:
pScene = T22CCUserDefault::scene();
break;
}
//下面的代码用于做控制场景切换用
if (pScene != NULL)
{
static int idx = 0;
CCTransitionScene * scene = switchSceneEffect(idx++, 2, pScene);
if (idx == 27)
{
idx = 0;
}
CCDirector::sharedDirector()->replaceScene(scene);
}
}
void TMenu::closeCallback(CCObject * sender)
{
exit(0);
}
bool TMenu::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
return true;
}
void TMenu::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
CCRect rcWin = CCRect(0, 40, winSize.width, winSize.height-80);
CCMenuItem * firstItem = (CCMenuItem *)menu->getChildren()->objectAtIndex(0);
CCMenuItem * lastItem = (CCMenuItem *)menu->getChildren()->lastObject();
CCPoint firstInWorld = menu->convertToWorldSpace(firstItem->getPosition());
CCPoint lastInWorld = menu->convertToWorldSpace(lastItem->getPosition());
if (rcWin.containsPoint(firstInWorld)&&pTouch->getDelta().y<0)
return;
if (rcWin.containsPoint(lastInWorld) && pTouch->getDelta().y >0)
return;
menu->setPositionY(menu->getPositionY() + pTouch->getDelta().y);
}
运行效果:
2 有时候我们想等场景切换彻底完成之后再让动画播放,这时候需要做重写以下代码:
void onEnter();
void onEnterTransitionDidFinish();
案例:
#include "T14Animation.h"
#include "AppMacros.h"
CCScene *T14Animation::scene()
{
CCScene * scene = CCScene::create();
T14Animation * layer = T14Animation::create();
scene->addChild(layer);
return scene;
}
bool T14Animation::init()
{
TBack::init();
return true;
}
//在进入场景的时候做以下操作
void T14Animation::onEnter()
{
TBack::onEnter();
//以图片的方式创建一个精灵
spr = CCSprite::create("animation/p_2_01.png");
//设置精灵的显示位置
spr->setPosition(ccp(winSize.width / 2, winSize.height / 2));
addChild(spr);
}
//当场景切换彻底完成之后执行的动作。
void T14Animation::onEnterTransitionDidFinish()
{
TBack::onEnterTransitionDidFinish();
//plist中是图片信息
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("animation/plant.plist");
//创建动画
CCAnimation * animation = CCAnimation::create();
//这个用于存储图片的名字
char nameBuf[100];
for (int i = 0; i < 8; i++)
{
memset(nameBuf, 0, sizeof(nameBuf));
sprintf(nameBuf, "p_2_0%d.png", i + 1);
animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(nameBuf));
}
//设置每次动画执行的时候的延时
animation->setDelayPerUnit(0.1f);
//这只循环两次
animation->setLoops(2);
CCAnimate * animate = CCAnimate::create(animation);
spr->runAction(animate);
}
上面案例在场景彻底切换完成之后新场景中的动画等效果才执行。