學習cocos2d-x-中國象棋

      這個遊戲涉及到cocos2d-x的知識,主要有以下幾點:

1,內存管理

    原則1:誰申請的就誰釋放,凡是用了new或malloc的就得記得delete或者free或者能用上aotorelease的

    原則2:誰調用了retain方法,那就得調用release來釋放

2,場景的切換的特效

     例如:淡入淡出的效果

       CCScene *pScene =  MainMenu::scene();
       CCScene *pS = CCTransitionFade::transitionWithDuration(2, pScene,ccc3(0,0,0));
//  pScene->release();  自己沒有retain,故不需要調用這個方法
      CCDirector::sharedDirector()->replaceScene(pS);

      更多的特效可參考tests裏面的

3,定時器

      schedule方法是設置一個定時器,如下

      schedule( schedule_selector(CHSWelcome2::gotoMainScene), 3); 

     這樣每隔3s就會掉用CHSWelcome2::gotoMainScene這個方法,

     直到這個場景被釋放了

      或者調用了  unschedule( schedule_selector(CHSWelcome2::gotoMainScene)); 這個方法

4,畫圖

     1)一個圖,一個精靈

CCSprite* pSprite = CCSprite::spriteWithFile("res/chess/bnkjs.jpg");
pSprite->setPosition( ccp(size.width/2, size.height/2) );
this->addChild(pSprite, 0);//把精靈加到layer裏面才能顯示出來

        如果有很多圖的話,感覺這樣的方法效率會很低

      2)用,CCSpriteFrameCache,CCTexture2D,CCSpriteBatchNode,

            這裏要用工具TexturePacker:網址http://www.codeandweb.com/,目的是把多張圖片放到一張大的圖片上,這樣opengl好處理,爲了效率它得內存對齊,這樣cpu處理才快的,紋理的大小事2的倍數。

            CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
    cache->addSpriteFramesWithFile("res\\one\\chess.plist", "res\\one\\chess.png");//獲取每個小圖片在大圖的信息

            CCTexture2D *texture = CCTextureCache::sharedTextureCache()->textureForKey("res\\one\\chess.png");//把圖片轉化成紋理,這裏得申請紋理的內存,引擎裏面的png解碼器把png解碼後變成位圖緩存在紋理裏面,爲後面的操作服務。


CCSpriteBatchNode *spriteBatch = CCSpriteBatchNode::batchNodeWithTexture(texture);//根據紋理創建
addChild(spriteBatch);//加到layer裏面

       pSprite =   CCSprite::spriteWithSpriteFrameName("rk.png");//創建一個精靈,rk.png已在chess.png裏面了
        spriteBatch->addChild(pSprite, 0);//加到這個節點裏面去,也就是說spriteBatch可以加了多精靈到裏面去,這些精靈只限chess.png裏的小圖。

     3)畫直線

重寫draw這個方法

          void MainMenu::draw()
    {
CCLayer::draw();

       CCSize s = CCDirector::sharedDirector()->getWinSize();

glEnable(GL_LINE_SMOOTH);

    ccDrawLine( CCPointMake(10,10), CCPointMake(50,50) );

glDisable(GL_LINE_SMOOTH);

  }

,更多的圖形可參考tests裏的,這裏就不詳細描寫了,挺簡單的

     4)網上有資料說可以用CCTextureRender來操作圖,它就像一個畫布,可以在上面畫,這樣的效率將會很高,會稍微複雜點 ,以後有機會再看看這個

4,動畫

     1) 裏面用定時器來控制精靈的位置,這樣它就動起來了,還有圖片的交替顯示,可以用setIsVisiable這個函數來控制,

     2)用精靈的action動的效果,具體沒有實現,可以參考tests裏面的例子



二,涉及中國象棋的規則

       這是個模擬的過程,每個棋子都有其自身的規則,爲了簡單以及好維護,可以單獨爲他們設定,

如將

int checkBKPos(int x,int y,int inMap[][9])
{
if(x<3 || x>5||y<7||y>9)//軟禁它的九宮格里面
{
return 0;
}

if(inMap[y][x] != 0 && inMap[y][x] > 10)
{
return 0;
}
return 1;
}


int getBKPos(int sx,int sy,int dx,int dy,int inMap[][9], int outMap[][9])
{
int d[4][2] = {{-1,0},{0,1},{1,0},{0,-1}} ;//一般只能上下左右走,這裏還差一個位置,就是它喫掉對面的帥的情況
memset(outMap,0,sizeof(int)*10*9);//設置整個棋盤都不能走

      //獲取將所有能走的位置
for(int i = 0; i<4;i++)
{
if(checkBKPos(sx+d[i][0],sy+d[i][1],inMap))
{
outMap[sy+d[i][1]][sx+d[i][0]] = 1;
}
}

if(outMap[dy][dx])//如果用戶點擊的位置正好是可以走的話,那就返回1
{
return 1;
}
return 0;
}


單獨思考某一個棋就會簡單了,把所有的棋子都按這樣的想法思考,那規則的實現就簡單了

其它詳情看源碼。


三,AI

        這個比較複雜,涉及的知識比較多,也不是一兩天能寫出個好的AI的。說下我的想法:

        給每個棋子設定重要性,比如帥 = 100,車 = 90,馬 = 80,炮 = 70,相 = 70 等等,這樣在判斷捨棄那個棋子可以捨棄沒那麼重要的

     第一步:   搜索每個棋子所有能走的位置,並給每個位置分數,然後從中選最高的分數即可;這樣只搜索了一次,智力太低了

     第二步:  重複這樣幾次也就是說把搜索的深度加大些,到最後把每一層的分數加起來,選最高的那個。

     第三步:  但是這樣的效率將會很低很低,這樣就要考慮怎麼剪枝了,當滿足什麼條件就不往下搜索

     第四步: 從幾個高分中隨機選,提高可玩性,開局,及殘局的時候另外處理,這樣更豐富


還在找工作中,暫時無時間研究這個,還是集中精力學習cocos2d-x

代碼:http://download.csdn.net/detail/lansong4/4431394

      


           

          

      


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章