现在的位置: 首页 > 综合 > 正文

cocos2d-x 笔记综合

2013年10月02日 ⁄ 综合 ⁄ 共 15569字 ⁄ 字号 评论关闭

原文地址点击进入

 

/*
*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()里面的参数是时间

 

抱歉!评论已关闭.