渲染驅動方式,事件驅動方式

this->addChild(pSprite, 0); 的第二個引數(int zOrder)表示要新增到this類物件中的順序。是由裡向外的方向。值越大表示越在外面。

CCNode:public CCObject

錨點就是改變作用點

座標系轉換函式:CCDirector::convertToGL(CCPoint);//z轉換為OpenGL座標系,頂點在左下

座標系轉換函式:CCDirector::convertToUI(CCPoint);//z轉換為螢幕座標系,頂點在左上

世界座標系:在中點

本地座標系:物體本身的座標系

相對座標,絕對座標:

//邏輯值:getContentSize();  getPosition();

//真實值:getContentSizeInPixels();getPositionInPixels();

//縮放因子:CCDirector::setContentScaleFactor(1.0f);

CCDirector::enableRetinaDisplay(false);//contentScaleFactor=1.0

CCDirector::enableRetinaDisplay(true);//contentScaleFactor=2.0

記憶體操作:

CCObject 都會有一個引用計數對記憶體處理。

引用計數機制:sprite->retain();//加一

       sprite->release();//減一

         sprite->retainCount();//返回其引用次數

       this->add(CCNode *node); //會使node的引用計數加一

節點樹:

virtual void addChild(CCNode * child);

virtual void removeChild(CCNode * child,bool cleanup);

退出的時候父節點會釋放掉子節點中所有的元素。

自動釋放池(CCPoolManager):  後臺或者引擎經營一個管理池。

PobSprite->autorelease();

屬性值和屬性函式:get ,set

引擎有定義巨集: 宣告:CC_PROPERTY(varType,varname,funName);

       定義: CC_SYNTHESIZE(varType,varname,funName);//不可定義物件,set的時候不會對原來的值進行記憶體釋放。  

CC_SYNTHESIZE_RETAIN(varType,varname,funName);//可定義物件,進行釋放。保證記憶體不洩漏

安全釋放機制:

~GameObject(){

if(sprite){     //sprite 是成員變數  

delete sprite;

sprite =NULL;

}

}

Cocos2d-x的UI系統:

字型:CCLableTTF,CCLableBMFont,CCLableAtlas

標籤:

選單:CCMenu

進度條:

計時器:schedule

  schedule( schedule_selector(Atlas3::step) );//:@selector(step:)];//不斷的重複執行step指標所指向的函式

事件處理機制:

事件佇列:

CCTouchDispatcher//需要處理事件的節點

CCTouchDelegate

CCTargetedTouchDelegate  單點觸控

CCStandardTouchDelegate  多點觸控

為精靈新增事件:

通知事件:
A傳送通知,B修改狀態

輸入框:
CCTextFieldTTF
CCTMEDelegate 針對輸入法的操作
CCTextFieldDelegate 操作TextField外觀和動畫的

cocos2d-x幾何圖形繪製: 關鍵函式draw()

程式進入到一個節點的時候,會執行節點的onEnter()函式

cocos2d-x 動作行為:
動作與動作執行函式:CCAction * runAction(CCAction *action);
動作型別:瞬時動作

CCActionInstant
CCPlace 讓節點到一個位置
CCHide/CCShow 隱藏和顯示
CCToggleVisiility 也是顯示和隱藏,只是相對的修改當前的狀態
CCFlipX/CCFlipY 翻轉 對XY軸映象
延時動作
CCActionInterval
CCMoveTo/CCMoveBy to->移動到,By->根據當前位置移動多少的距離
CCJumpto/CCJumpBy 跳躍
CCBezierTo/CCBezierBy 貝塞爾曲線
CCScaleTo/CCScaleBy 縮放
CCRotateTo/CCRotateBy 旋轉
CCBlink 閃爍
CCTintTo/CCTintBy 色調變化
CCFadeTo 變暗到
CCFadeIn 淡出(慢慢顯示)
CCFadeOut 漸隱(慢慢隱藏掉)

組合動作
CCSequence 序列
CCSpawn 同步
CCRepeat 重複有限次數
Reverse 反動作
CCRepeatForever 無限重複
CCAnimate 建立幀動畫

速度變化
CCEaseIn 由慢變快(速度線性變化)
CCEaseOut 由快至慢
CCEaseInOut 由慢至快再由快至慢
CCEaseSineIn 由慢至快
CCEaseSineInOut 由慢至快再由快至慢
CCEaseExponentialIn 由慢至極快
CCEaseExponentialIn 由極快至慢
CCEaseExponentialInOut 由慢至極快再
CCSpeed 人工設定速度,通過setSpeed不斷調整
擴充套件動作
延時:CCDelayTime
函式呼叫 //動畫執行完呼叫一個函式接著執行下一個動畫
CCCallFunc(無引數函式)
CCCallFuncN(當前物件CCNode)
ActionManager 動作管理器 管理所有的Action

畫一個導圖:展示所有動作類的類圖。

快取機制:
紋理快取:
精靈幀快取:
動畫快取:
TexturePacker圖片拼合
1)CCSprite儲存圖片-》 CCTexture2D-》CCTextureCache(圖片快取)

spriteBatch 精靈表  提高效率

2)spriteBatch 儲存圖片組合-》 CCTextureAtlas-》CCTextureCache(紋理快取)  (效率快,一次載入N多張圖片到spritebatch中)

TexturePacker圖片拼合  (視訊36)

3)CCAnimation

     CCAnimationFrame()(動畫幀)  ->CCSpriteFrame(精靈幀)->CCSpriteFrameCache(精靈幀快取:快取了大的拼合圖片裡的每個小的精靈幀)

     CCAnimationCache(動畫快取)

粒子系統:

如果才用幀動畫:會導致資源包會增加,效果不會改變。由引擎計算下一幀的位置和豈止顏色

      粒子屬性:

           發射器屬性:  

      CCTexture2D* fire=CCTextureCache::sharedTextureCache()->addImage("fire.png");
      CCParticleSystem *fireParitcle=CCParticleFire::create();
       fireParitcle->setTexture(fire);
       this->addChild(fireParitcle);
       fireParitcle->setPosition(ccp(100,100));

場景切換:

    場景堆疊

      切換方式

      切換特效   :場景能執行的動作,圖層也可以

      CCScene *helloWorld=HelloWorld::scene();

      CCScene * helloScreen=CCTransitionMoveInR::create(1.3f,helloWorld);

      CCDirector::sharedDirector()->replaceScene(helloScreen);

網格特效:

    網格特效原理

    網格特效使用方法:

     virtual CCGridBase *getGrid();

     virtual  void  setGrid(CCGridBase *pGrid);

     CCAction *CCNode::runAction(CCAction*action)

      

        CCActionInterval *shaky=CCShaky3D::create(2,false,ccg(15,10),1.2f);
         this->runAction(shaky);
                 schedule(schedule_selector(HelloWorld::checkAction));

    攝像機動畫:CCActionInterval *orbit=CCOrbitCamera::create(....);

地圖系統:  

    載入地圖:       

CCTMXTiledMap *mapTild=CCTMXTiledMap::create("tmw_desert_spacing.tmx");
this->addChild(mapTild);
mapTild->setPosition(CCPointZero);

音訊系統:音樂、音效

    音樂:背景音樂。

    音效:非常短的。刀砍聲和發招是聲  

  1. SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(MUSIC_FILE));
  2. SimpleAudioEngine::sharedEngine()->preloadEffect(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(EFFECT_FILE));
  3. SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(1.0f);
  4. SimpleAudioEngine::sharedEngine()->setEffectsVolume(1.0f);
  5.  
  6. switch (nIdx)
  7. {
  8. case :
  9. SimpleAudioEngine::sharedEngine()->playBackgroundMusic(std::string(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(MUSIC_FILE)).c_str(),true);
  10. break;
  11. case :
  12. SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
  13. break;
  14. case :
  15. SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();
  16. break;
  17. case :
  18. m_nSoundId=SimpleAudioEngine::sharedEngine()->playEffect(std::string(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(EFFECT_FILE)).c_str(),true);
  19. break;
  20. case :
  21. SimpleAudioEngine::sharedEngine()->pauseEffect(m_nSoundId);
  22. break;
  23. case :
  24. SimpleAudioEngine::sharedEngine()->resumeEffect(m_nSoundId);
  25. }

cocos2d-x 物理引擎:視訊59

        Box2D:純邏輯計算引擎,物件都是虛的。(C++面向物件方式)

          Box2D的原理:

世界:通常作為整個螢幕的大小,一個場景對應一個物理世界

             剛體:所有物體都可以稱著剛體:靜態物體,動態物體(有質量,收到各種力的影響),平臺物體(保持同一種運動的物體)。

            形狀:圓形,多邊形

            夾具:(Fixture):人是通過夾具形成的: 圓形的頭,矩形的身體,兩個矩形的腳

            關節:(連線夾具之間的結點):

                  線關節的目的:將兩個物體的相對運動限制在一個直線方向,允許物體的自身旋轉運動。

                  稜鏡關節:線性關節的升級版,不但固定了物體的運動方向,而且不允許物體有任何的旋轉運動,關聯物體必須始終保持初始狀態的角度。            

                  旋轉關節:

                  滑輪關節:

                  齒輪關節:

                  滑鼠關節:可以支援使用者的直接拖拽

            碰撞點:

            單位變換:

                b2Vec2   GetWorldPoint(const b2Vec2 &localPoint);

            其他遍歷:

            常用操作:視訊(61)

              點是否在形狀內:  

                    b2Transfrom   transform;    

                    transform.SetIdentity();

                    b2Vec2.point(5.0f,2.0f);

                    bool  hit=shape->TestPoint(transform,point);

             光線是否和指定的形狀交叉:

程式碼實現:

  1.   成員變數: b2World *world;//物理世界
  2.  
  3. void HelloBox2D::initPhysics() //系統初始化的時候呼叫該函式
  4.  
  5. {
  6.  
  7. b2Vec2 gravity;//重力
  8.  
  9. gravity.Set(0.0f,-10.0f);
  10.  
  11. world=new b2World(gravity);
  12.  
  13. world->SetAllowSleeping(true);//物體停止之後是否還會納入物理世界,進行計算
  14.  
  15. world->SetContinuousPhysics(true);//物體停止之後是否還會納入物理世界,進行計算
  16.  
  17. b2BodyDef groundBodyDef;//定義一個剛體  
  18.  
  19. groundBodyDef.position.Set(,); //給世界指定一個範圍,盒子。
  20.  
  21. b2Body *groundBody=world->CreateBody(&groundBodyDef);//建立一個剛體(整個框架)
  22.  
  23. b2EdgeShape groundBox;//定義一個形狀
  24.  
  25. //指定物理空間範圍:
  26.  
  27. //底部
  28.  
  29. groundBox.Set(b2Vec2(,),b2Vec2(/PTM_RATIO,)); // PTM_RATIO是個巨集定義為32.0f 比例縮放
  30.  
  31. groundBox->CreateFixture(&groundBox,);建立夾具
  32.  
  33. //頂部
  34.  
  35. groundBox.Set(b2Vec2(,/PTM_RATIO),b2Vec2(/PTM_RATIO,/PTM_RATIO)); // PTM_RATIO是個巨集定義為32.0f
  36.  
  37. groundBox->CreateFixture(&groundBox,);建立夾具
  38.  
  39. //左
  40.  
  41. groundBox.Set(b2Vec2(,/PTM_RATIO),b2Vec2(,)); // PTM_RATIO是個巨集定義為32.0f
  42.  
  43. groundBox->CreateFixture(&groundBox,);建立夾具
  44.  
  45. //右
  46.  
  47. groundBox.Set(b2Vec2(/PTM_RATIO,/PTM_RATIO),b2Vec2(/PTM_RATIO,)); // PTM_RATIO是個巨集定義為32.0f
  48.  
  49. groundBox->CreateFixture(&groundBox,);建立夾具
  50.  
  51. }
  52.  
  53. void HelloBox2D::addNewSpriteAtPosition(CCPoint p)
  54.  
  55. {
  56.  
  57. b2BodyDef bodyDef;
  58.  
  59. bodyDef.type=b2_dynamicBody//定義剛體型別
  60.  
  61. bodyDef.positon.Set(p.x/PTM_RATIO,p.y/PTM_RATIO);
  62.  
  63. b2Body *body=world->CreateBody(&bodyDef);
  64.  
  65. b2PolygonShape dynamicBox;//定義一個多邊形
  66.  
  67. dynamicBox.SetAsBox(0.5f,0.5f);//定義重心點
  68.  
  69. b2FixtureDef fixtureDef;//定義夾具
  70.  
  71. fixtureDef.shape=&dynamicBox;//夾具形狀
  72.  
  73. fixtureDef.density=1.0f;//夾具密度
  74.  
  75. fixtureDef.friction=0.3f;//摩擦係數  
  76.  
  77. body->CreateFixture(&fixtureDef);//為剛體定義夾具
  78.  
  79. CCNode*parent=this->getChildByTag(kTagParentNode)//根據tag到精靈表中找到對應的精靈
  80.  
  81. //m_pSpriteTexture 前面儲存的紋理物件, idx,idy 0或1的數 建立物理精靈
  82.  
  83. //使用這個類需要引入標頭檔案和名稱空間 #include"cocos-ext.h" using namespace cocos2d::extension
  84.  
  85. //專案中還要新增標頭檔案的搜尋路徑 還要在連結中新增對應的lib
  86.  
  87. CCPhysicsSprite *sprite=CCPhysicsSprite::createWithTexture(m_pSpriteTexture,CCRectMake(*idx,*idy,,));
  88.  
  89. parent->addChild(sprite);//將精靈新增到精靈表
  90.  
  91. sprite->setbody(body);
  92.  
  93. sprite->setPTMRatio(PTM_RATIO);//設定縮放因子
  94.  
  95. sprite->setPosition(ccp(p.x,p.y));
  96.  
  97. }
  98.  
  99. void update(float dt)//更新 需要開啟排程器 (scheduleupdate())
  100.  
  101. {
  102.  
  103. int velocityItereations=;//遊戲迴圈次數
  104.  
  105. int positionItereations=;
  106.  
  107.   world->Step(dt,velocityItereations,positionItereations);//更新
  108.  
  109. }

物理編輯器:OS版  vertexHelper

      Windows版   PhysicsEditor

使用物理編輯器:

GB2ShapeCache::sharedGB2ShapeCache()->addShapesWithFile("shapedefs.plist");

CCPhysicsSprite *sprite = CCPhysicsSprite::create((name+".png").c_str());
this->addChild(sprite);
sprite->setBody(body);
sprite->setPTMRatio(PTM_RATIO);
sprite->setPosition( ccp( p.x, p.y) );
sprite->setAnchorPoint(sc->anchorPointForShape(name.c_str()));

物理除錯:

GLESDebugDraw* m_debugDraw;

m_debugDraw = new GLESDebugDraw( PTM_RATIO );
world->SetDebugDraw(m_debugDraw);

uint32 flags = 0;
flags += b2Draw::e_shapeBit;
flags += b2Draw::e_jointBit;
flags += b2Draw::e_aabbBit;
flags += b2Draw::e_pairBit;
flags += b2Draw::e_centerOfMassBit;
m_debugDraw->SetFlags(flags);

void HelloPhysicsEditor::draw()
{
//
// IMPORTANT:
// This is only for debug purposes
// It is recommend to disable it
//
CCLayer::draw();

#if CC_ENABLE_BOX2D_INTEGRATION
ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );//啟用頂點

kmGLPushMatrix();//繪製之前儲存矩陣的狀態

world->DrawDebugData();

kmGLPopMatrix();//恢復到儲存的狀態
#endif
}

cocos2d-x 物理引擎:chipmunk  (c語言方式)  

cpInitChipmunk

cpSpaceStep

void  cpBodyUpdatePosition(cpBody *body,cpFloat  dt);

void  cpSpaceRehashStatic(cpSpace *space);  

空間cpSpace:

剛體cpBody:

形狀cpShape:

約束cpConstraint:(對應Box2d關節)

    cpConstraint *constraint=cpPivotJointNew(staticBody.bodyA,staticBody->p);//建立約束

    cpSpaceAddConstraint(Space.constraint1);//新增約束

碰撞:

遍歷:cpSpaceEachShape

cpSpaceEachBody

cpSpaceEachConstraint

記憶體管理:

    cpSpaceAlloc

    cpSpaceInit

    cpSpaceDestroy

    cpSpaceNew

    cpSpaceFree

cpBody *body = cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts, cpvzero));

body->p = cpv(pos.x, pos.y);
cpSpaceAddBody(m_pSpace, body);

cpShape* shape = cpPolyShapeNew(body, num, verts, cpvzero);
shape->e = 0.5f; shape->u = 0.5f;
cpSpaceAddShape(m_pSpace, shape);