/*
*1 逻辑代码中都使用 do {} while(0) 样式, 主要是代码中 CC_BREAK_IF(!XX); 中使用了 if() break, 如果没有for while if 等条件语句,会报错
*/
void fun()
{
do
{
.......
CC_BREAK_IF(! XX);
}while(0);
}
/*
*2 场景可由 CCLayer 继承,在层中定义一个创建scene 的静态成员函数,也可以直接由CCScene 继承
*/
CCScene* TitleScene::scene()
{
CCScene * scene = NULL;
do
{
// 'scene' is an autorelease object
scene = CCScene::node();
CC_BREAK_IF(! scene);
// 'layer' is an autorelease object
TitleScene *layer = TitleScene::node();
CC_BREAK_IF(! layer);
// add layer as a child to scene
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
/*
*3 cocos2d-x 在win32 平台支持中文, 在其它平台可支持,win32 平台汉字为gb2312编码,但在 cocos2d-x 中使用的是utf-8编码,所以需要转换
*/
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
#include "iconv.h" //此文件在 cocos2d-x 里面
//字符转换,使cocos2d-x在win32平台支持中文显示
int GBKToUTF8(std::string &gbkStr,const char* toCode,const char* formCode)
{
iconv_t iconvH;
iconvH = iconv_open(formCode,toCode);
if(iconvH == 0)
{
return -1;
}
const char* strChar = gbkStr.c_str();
const char** pin = &strChar;
size_t strLength = gbkStr.length();
char* outbuf = (char*)malloc(strLength*4);
char* pBuff = outbuf;
memset(outbuf,0,strLength*4);
size_t outLength = strLength*4;
if(-1 == iconv(iconvH,pin,&strLength,&outbuf,&outLength))
{
iconv_close(iconvH);
return -1;
}
gbkStr = pBuff;
iconv_close(iconvH);
return 0;
}
#endif
/*
*4 创建文字列表菜单,在 CCLayer 的子类中的init初使化过程中
*/
bool TitleScene::init()
{
do
{
//.....
std::string menuItemStr = "新游戏";
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
GBKToUTF8(menuItemStr,"gb2312","utf-8");
#endif
CCMenuItem *newGame = CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,menu_selector(TitleScene::menuNewCallback));
menuItemStr = "设置";
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
GBKToUTF8(menuItemStr,"gb2312","utf-8");
#endif
CCMenuItem *optionGame=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,menu_selector(TitleScene::menuOptionCallback));
menuItemStr = "退出";
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
GBKToUTF8(menuItemStr,"gb2312","utf-8");
#endif
CCMenuItem *quitGame=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,menu_selector(TitleScene::menuQuitCallback));
CCMenu *menu=CCMenu::menuWithItems(newGame,optionGame,quitGame,NULL);
menu->alignItemsVertically();//竖直排列
//menu->alignItemsInColumns(2, 2, 2, 2, 1, NULL);//菜单排列方式每行 几个
this->addChild(menu,1);
}while(0);
}
/*
*5 菜单点击回调函数, 菜单点击事件
*/
//头文件中定义
void menuNewCallback(CCObject* pSender);
//实现文件中使用 menu_selector(XXXXX)
CCMenuItem *newGame = CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,menu_selector(TitleScene::menuNewCallback));
void TitleScene::menuNewCallback( CCObject* pSender )
{
CCScene *scene=FlyScene::scene();
CCDirector::sharedDirector()->replaceScene(scene);
}
/*
*6 菜单字体颜色,大小,字体设置
*/
void fun()
{
CCMenuItemFont *quitGame=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,menu_selector(TitleScene::menuQuitCallback));
quitGame->setColor()
quitGame->setFontSize()
quitGame->setFontName()
.....
CCMenu *menu=CCMenu::menuWithItems(newGame,optionGame,quitGame,NULL);
menu->setColor(ccc3(255,0,0));//注意 ccc3 ccc4
//全局设置
CCMenuItemFont::setFontName("Thonburi");
CCMenuItemFont::setFontSize(25);
//指定特殊字体文件
CCLabelBMFont* label = CCLabelBMFont::labelWithString("configuration", "fonts/bitmapFontTest3.fnt");
}
/*
*7 场景切换,场景切换动画,场景结束退出
*/
void TitleScene::menuClickCallback(CCObject* pSender)
{
//结束
CCDirector::sharedDirector()->end();
//切换
CCScene *scene = XXXX;
CCDirector::sharedDirector()->replaceScene(scene);
//切换动画
//CCTransitionCrossFade::transitionWithDuration()
//CCTransitionFlipX::transitionWithDuration()
CCDirector::sharedDirector()->replaceScene(CCTransitionCrossFade::transitionWithDuration(1.2f,scene));
CCTransitionJumpZoom::transitionWithDuration(t, s);//跳跃式,本场景先会缩小,然后跳跃进来
CCTransitionFade::transitionWithDuration(t, s);//淡出淡入,原场景淡出,新场景淡入
CCTransitionFade::transitionWithDuration(t, s, ccWHITE);//如果上一个的函数,带3个参数,则第三个参数就是淡出淡入的颜色 CCTransitionFlipX::transitionWithDuration(t, s, kOrientationLeftOver);//x轴左翻
CCTransitionFlipX::transitionWithDuration(t, s, kOrientationRightOver);//x轴右翻
CCTransitionFlipY::transitionWithDuration(t, s, kOrientationUpOver);//y轴上翻
CCTransitionFlipY::transitionWithDuration(t, s, kOrientationDownOver);//y轴下翻
CCTransitionFlipAngular::transitionWithDuration(t, s, kOrientationLeftOver);//有角度转的左翻
CCTransitionFlipAngular::transitionWithDuration(t, s, kOrientationRightOver);//有角度转的右翻
CCTransitionZoomFlipX::transitionWithDuration(t, s, kOrientationLeftOver);//带缩放效果x轴左翻
CCTransitionZoomFlipX::transitionWithDuration(t, s, kOrientationRightOver);//带缩放效果x轴右翻
CCTransitionZoomFlipY::transitionWithDuration(t, s, kOrientationUpOver);//带缩放效果y轴上翻
CCTransitionZoomFlipY::transitionWithDuration(t, s, kOrientationDownOver);//带缩放效果y轴下翻
CCTransitionZoomFlipAngular::transitionWithDuration(t, s, kOrientationLeftOver);//带缩放效果/有角度转的左翻
CCTransitionZoomFlipAngular::transitionWithDuration(t, s, kOrientationRightOver);//带缩放效果有角度转的右翻
CCTransitionShrinkGrow::transitionWithDuration(t, s);//交错换
CCTransitionRotoZoom::transitionWithDuration(t, s);//转角换
CCTransitionMoveInL::transitionWithDuration(t, s);//新场景从左移入覆盖
CCTransitionMoveInR::transitionWithDuration(t, s);//新场景从右移入覆盖
CCTransitionMoveInT::transitionWithDuration(t, s);//新场景从上移入覆盖
CCTransitionMoveInB::transitionWithDuration(t, s);//新场景从下移入覆盖
CCTransitionSlideInL::transitionWithDuration(t, s);//场景从左移入推出原场景
CCTransitionSlideInR::transitionWithDuration(t, s);//场景从右移入推出原场景
CCTransitionSlideInT::transitionWithDuration(t, s);//场景从上移入推出原场景
CCTransitionSlideInB::transitionWithDuration(t, s);//场景从下移入推出原场景
以下三个需要检测opengl版本是否支持CCConfiguration::sharedConfiguration()->getGlesVersion() <= GLES_VER_1_0如果为真则为不支持 CCTransitionCrossFade::transitionWithDuration(t,s);//淡出淡入交叉,同时进行
CCTransitionRadialCCW::transitionWithDuration(t,s);//顺时针切入
CCTransitionRadialCW::transitionWithDuration(t,s);//逆时针切入
以下两个需要先设置摄像机,使用CCDirector::sharedDirector()->setDepthTest(true);
CCTransitionPageTurn::transitionWithDuration(t, s, false);//翻页,前翻
CCTransitionPageTurn::transitionWithDuration(t, s, true);//翻页,后翻
CCTransitionFadeTR::transitionWithDuration(t, s);//向右上波浪
CCTransitionFadeBL::transitionWithDuration(t, s);//向左下波浪
CCTransitionFadeUp::transitionWithDuration(t, s);//向上百叶窗
CCTransitionFadeDown::transitionWithDuration(t, s);//向下百叶窗
CCTransitionTurnOffTiles::transitionWithDuration(t, s);//随机小方块
CCTransitionSplitRows::transitionWithDuration(t, s);//按行切
CCTransitionSplitCols::transitionWithDuration(t, s);//按列切
}
/*
*8 背景音乐
*/
void fun()
{
CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music-aac.wav", true);
SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}
/*
*9 计划任务,定时器的使用
*/
//头文件类中定义,最多两参数,可以一个参数,第一个参数为调用的方法,第二个参数为间隔时间 ccTime, ccTime 即 float ,此参数可选,如果没有设定时间,则即时刷新
void HelloWorld::gameLogic(ccTime dt);//参数为ccTime
void fun()
{
this->schedule( schedule_selector(HelloWorld::gameLogic), 1.0 );
this->schedule( schedule_selector(HelloWorld::updateGame) );
this->unschedule(schedule_selector(HelloWorld::updateGame));//取消定时器
}
/*
*10 设置背景图片
*/
void fun()
{
CCSize size = CCDirector::sharedDirector()->getWinSize();
//添加背景
CCSprite* pSprite = CCSprite::spriteWithFile("background.png");
CC_BREAK_IF(! pSprite);
// Place the sprite on the center of the screen
pSprite->setPosition(ccp(size.width/2, size.height/2));
// Add the sprite to TitleScene layer as a child layer.
this->addChild(pSprite, 0);//背景设置为0层,即底层
}
/*
*11 Label 使用, CCLabelTTF
*/
void fun()
{
std::string titleStr = "hello world";//注意中文在win32 中需要转换编码 utf-8
CCLabelTTF* pLabel = CCLabelTTF::labelWithString(titleStr.c_str(), "Thonburi", 30);
CC_BREAK_IF(! pLabel);
pLabel->setColor(ccRED);
CCSize size = CCDirector::sharedDirector()->getWinSize();
pLabel->setPosition(ccp(size.width / 2, size.height*0.8f));
this->addChild(pLabel, 1);
}
/*
*12 启动触屏点击事件 Touch
*/
//头文件定义
virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
bool init()
{
do
{
....
this->setIsTouchEnabled(true);
.....
}while(0);
}
void ccTouchesBegan( CCSet *pTouches, CCEvent *pEvent )
{
CCTouch *touch = (CCTouch*)pTouches->anyObject();
CCPoint location = touch->locationInView(touch->view());
//得到点击的点的坐标, OPENGL 坐标
CCPoint convertedLocation = CCDirector::sharedDirector()->convertToGL(location);
//得到人物角色的区域 rect
CCRect rect=sprite->boundingBox();
//判断点击坐标是否在人物角色区域内
if (CCRect::CCRectContainsPoint(rect,convertedLocation))
{
.........
}
}
void ccTouchesMoved( CCSet *pTouches, CCEvent *pEvent )
{
CCTouch *touch = (CCTouch*)pTouches->anyObject();
CCPoint location = touch->locationInView(touch->view());
CCPoint convertedLocation = CCDirector::sharedDirector()->convertToGL(location);
.......
}
void ccTouchesEnded( CCSet *pTouches, CCEvent *pEvent )
{
........
}
//允许触屏
CCTouchDispatcher::sharedDispatcher()->setPriority(kCCMenuTouchPriority+1, this);
//不允许触屏
CCTouchDispatcher::sharedDispatcher()->setPriority(kCCMenuTouchPriority-1, this);
/*
*13 多层的使用 CCLayer CCLayerMultiplex,层的切换
*/
void fun() //CCScene 继承的子类的方法
{
CCLayer* pLayer1 = new MenuLayer1();
CCLayer* pLayer2 = new MenuLayer2();
CCLayer* pLayer3 = new MenuLayer3();
CCLayer* pLayer4 = new MenuLayer4();
CCLayerMultiplex* layer = CCLayerMultiplex::layerWithLayers(pLayer1, pLayer2, pLayer3, pLayer4, NULL);
addChild(layer, 0);
pLayer1->release();
pLayer2->release();
pLayer3->release();
pLayer4->release();
CCDirector::sharedDirector()->replaceScene(this);
}
//层的切换, m_pParent 为系统内置变量
void fun()
{
((CCLayerMultiplex*)m_pParent)->switchTo(1);
}
/*
*14 动作,角色移动 action,
*/
void fun()
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *projectile = CCSprite::spriteWithFile("Projectile.png", CCRectMake(0, 0, 20, 20));
projectile->setPosition( ccp(20, winSize.height/2) );//起点
......
//CCPoint realDest 终点, realMoveDuration 持续时间
projectile->runAction( CCSequence::actions(
CCMoveTo::actionWithDuration(realMoveDuration, realDest),
CCCallFuncN::actionWithTarget(this,
callfuncN_selector(HelloWorld::spriteMoveFinished)),
NULL) );
//循环跳跃
CCJumpBy* jump = CCJumpBy::actionWithDuration(3, CCPointMake(400,0), 50, 4);
item2->runAction( CCRepeatForever::actionWithAction(
(CCActionInterval*)(CCSequence::actions( jump, jump->reverse(), NULL))
)
);
//循环旋转
CCActionInterval* spin1 = CCRotateBy::actionWithDuration(3, 360);
CCActionInterval* spin2 = (CCActionInterval*)(spin1->copy()->autorelease());
CCActionInterval* spin3 = (CCActionInterval*)(spin1->copy()->autorelease());
item1->runAction( CCRepeatForever::actionWithAction(spin1) );
item2->runAction( CCRepeatForever::actionWithAction(spin2) );
item3->runAction( CCRepeatForever::actionWithAction(spin3) );
}
/*
*15 闪动字体动画特效
*/
void fun()
{
CCMenuItemFont* item6 = CCMenuItemFont::itemFromString("Quit", this, menu_selector(MenuLayer1::onQuit));
CCActionInterval* color_action = CCTintBy::actionWithDuration(0.5f, 0, -255, -255);
CCActionInterval* color_back = color_action->reverse();
CCFiniteTimeAction* seq = CCSequence::actions(color_action, color_back, NULL);
item6->runAction(CCRepeatForever::actionWithAction((CCActionInterval*)seq));
CCMenu* menu = CCMenu::menuWithItems( item6, NULL);
menu->alignItemsVertically();
this->addChild(menu);
}
/*
*16 特殊字体设置,比如图片字体, 图片字体库由一个 .fnt 文件和一个 .png 图片文件组成, fnt文件中定义了字体属性,这种方式可以实现系统字库中不存在的字体,以图片来代替文字
*/
void fun()
{
CCLabelAtlas* labelAtlas = CCLabelAtlas::labelWithString("0123456789", "fonts/fps_images.png", 16, 24, '.');
CCMenuItemLabel* item3 = CCMenuItemLabel::itemWithLabel(labelAtlas, this, NULL );
item3->setDisabledColor( ccc3(255,32,64) );
item3->setColor( ccc3(125,147,255) );
CCLabelBMFont* label = CCLabelBMFont::labelWithString("configuration", "fonts/bitmapFontTest3.fnt");
CCMenuItemLabel* item5 = CCMenuItemLabel::itemWithLabel(label, this, NULL);
//放大倍数
item5->setScale( 2.8f );
CCMenu *menu = CCMenu::menuWithItems(item3,item5,NULL);
menu->alignItemsVertically();
this->addChild(menu);
}
/*
*17 菜单的遍历,动态特效
*/
void fun()
{
int i=0;
CCNode* child;
CCArray * pArray = menu->getChildren();
CCObject* pObject = NULL;
CCARRAY_FOREACH(pArray, pObject)
{
if(pObject == NULL)
break;
child = (CCNode*)pObject;
CCPoint dstPoint = child->getPosition();
int offset = (int) (s.width/2 + 50);
if( i % 2 == 0)
offset = -offset;
child->setPosition( CCPointMake( dstPoint.x + offset, dstPoint.y) );
child->runAction(
CCEaseElasticOut::actionWithAction(
CCMoveBy::actionWithDuration(2, CCPointMake(dstPoint.x - offset,0)), 0.35f
)
);
i++;
}
}
/*
*18 菜单触发器,菜单子项
*/
void fun()
{
CCMenuItemToggle *item4 = CCMenuItemToggle::itemWithTarget( this,
menu_selector(MenuLayer4::menuCallback),
CCMenuItemFont::itemFromString( "Off" ),
NULL );
item4->getSubItems()->addObject( CCMenuItemFont::itemFromString( "33%" ) );
item4->getSubItems()->addObject( CCMenuItemFont::itemFromString( "66%" ) );
item4->getSubItems()->addObject( CCMenuItemFont::itemFromString( "100%" ) );
item4->setSelectedIndex( 2 );
//item4->getSelectedIndex();
}
//在点击事件中可以进行处理
void menuCallBack(CCObject *sender)
{
dynamic_cast<CCMenuItemToggle*>(sender)->selectedItem();
dynamic_cast<CCMenuItemToggle*>(sender)->selectedIndex();
}
/*
*19 精灵的各种应用
*/
1,锚点
锚点就是所有旋转,移动,缩放的参考点。cocos2-x中默认的锚点是中心点。锚点用比例来表示范围为0-1,(0,0)点代表左下点,(1,1)代表右上点。设置的函数为setAnchorPoint(ccp(0.5, 0.5));
2,旋转
setRotation(angle) 其中angle为角度不是弧度。正数为顺时针旋转,负数为逆时针旋转。
3,位置
setPosition(ccp(xPos, yPos)) xPos和yPos为相对于父节点锚点的位置。
4,缩放
setScale(s); // 整体缩放
setScaleX(s); // 原图片坐标X轴缩放
setScaleY(s); // 原图片坐标Y轴缩放
s为比例,s = 1表示原尺寸。
5,倾斜
setSkewX(s); // 原图片坐标X轴倾斜
setSkewY(s); // 原图片坐标Y轴倾斜
X轴向右为正,Y轴向上为正。
6,透明度
setOpacity(s);
s范围0-255,0完全透明,255完全不透明。
7,可见
setIsVisible(bVisible)
bVisible为bool值true代表可见false代表不可见
8,翻转
setFlipX(bFlip); // 水平翻转
setFlipY(bFlip); // 竖直翻转
bFlip为true,则图片翻转,false不翻转。注意,翻转是针对原图片的操作,水平翻转相当于在图片编辑软件里水平翻转一样。不根据锚点进行翻转。翻转以后,设置的以前设置的锚点不会随着图片的翻转而改变。比如设置右下角为锚点,则翻转以后,锚点为翻转后的图片的右下角(是不是有点绕?)
最后,初始化完成后,不要忘了使用addChild加入到父节点,否则是不会显示的。
/*
*20 进度条,进度条由两张图片组成。一张作背景,另一张则在背景上以动画形式显示出来,此处可以作为竞技血条或时间条
*/
void fun()
{
CCSprite *bg = CCSprite::spriteWithFile("images/button_moregame1.png");
bg->setPosition(CCPointMake(100,size.height/2));
this->addChild(bg,1);
CCProgressTo *to1 = CCProgressTo::actionWithDuration(6, 100);
CCProgressTo *to2 = CCProgressTo::actionWithDuration(2, 100);
CCProgressTimer *left = CCProgressTimer::progressWithFile("images/button_moregame2.png");
left->setType( kCCProgressTimerTypeHorizontalBarRL );
addChild(left,2);
//left->setPercentage(55.0f);
left->setPosition(CCPointMake(100, size.height/2+3));
left->runAction( CCRepeatForever::actionWithAction(to1));
}
void fun1()
{
//进度条加载满时 触发一个事件 void progressCallback(CCNode *pSender);
CCSprite *bg = CCSprite::spriteWithFile("images/button_moregame1.png");
bg->setPosition(CCPointMake(100,size.height/2));
this->addChild(bg,1);
CCProgressTo *to1 = CCProgressTo::actionWithDuration(6, 100);
CCProgressTo *to2 = CCProgressTo::actionWithDuration(2, 100);
CCProgressTimer *left = CCProgressTimer::progressWithFile("images/button_moregame2.png");
left->setType( kCCProgressTimerTypeHorizontalBarRL );
addChild(left,2);
//left->setPercentage(55.0f);
left->setPosition(CCPointMake(100, size.height/2+3));
//left->runAction( CCRepeatForever::actionWithAction(to1));
//CCCallFuncN* action_call_back = CCCallFuncN::actionWithTarget(this,callfuncN_selector(DegreeScene::progressCallback));
left->runAction(CCSequence::actions(to1,CCCallFuncN::actionWithTarget(this,
callfuncN_selector(DegreeScene::progressCallback)),NULL));
}
/*
*21 设置加速
*/
void fun
{
setIsTouchEnabled( true );//可触屏
setIsAccelerometerEnabled( true );//加速计
}
/*
*22 多张图片动画
*/
void fun()
{
CCAnimation* animation = CCAnimation::animation();
char frameName[100] = {0};
for( int i=1;i<34;i++){
sprintf(frameName, "demo%04d.png", i);
animation->addFrameWithFileName(frameName);
}
CCActionInterval* action = CCAnimate::actionWithDuration(1.0f, animation, false);
}
CCSprite *p2 = CCSprite::spriteWithFile("name1.png");//首先还是要创建一个精灵对象
p2->setPosition(CCPointMake(240,160));
this->addChild (p2,1);
CCAnimation* animation = CCAnimation::animation();
char frameName[100] = {0};
for( int i=1;i<=4;i++) //图片的张数
{
sprintf(frameName, "name%d.png", i); //循环
animation->addFrameWithFileName(frameName);
}
CCActionInterval* action = CCAnimate::actionWithDuration(0.5f, animation, false); //0.5f 是切换图片的时间
CCActionInterval* action_back = action->reverse();//返回到原先的状态
sp2->runAction(action);
这样就实现了简单的连帧动画了!
同时可以定义其他的动作:
CCMoveTo
CCMoveBy
CCJumpTo
。。。
sp2->runAction(CCSequence::actions(action1,action2,action3,NULL));//不要忘了加NULL哦
sp2->runAction(CCSequence::actions(action1,CCDelayTime:;actionWithDuration(3),action2,NULL));//actionWithDuration()里面的参数是时间