這個遊戲涉及到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