cocos2d 開發]看我怎麼山寨 忍者跳躍 !!!
其實中國的遊戲開發者不寫遊戲!這裏包含各種內涵的意思 ...
如今山寨成風,今個兒開始山寨 一款從iphone上,跨平臺到android 很火的遊戲 . ninjump (忍者跳躍).
要山寨 先搞清楚別人是怎麼開發的 ,能否直接獲取到別人的素材?! 這個很關鍵,因爲中國的開發者,一個窮屌絲往往兼顧幾個人的使用:遊戲策劃,遊戲運營,遊戲編程,遊戲美工,遊戲音效 等等崗位. 結果出來,各種排斥,各種難賺錢,最後走上加廣告的道路,各種推送,各種被罵...如何之苦b,就不是這裏要討論的話題了.剛剛說到 遊戲素材,最好能解壓apk,拿到直接的png圖片,有的 是pk文件,就有些麻煩,別人打包了比較難竊取,今天不討論.自己下去研究下.
其次要搞清楚別人的開發技術 ,所以遊戲 一般有一個技術總監,來指導遊戲編程. 解壓後ninjump.apk後,你就會發現,裏面 目錄其實很清楚 : \assets\ 下面放着各種 : music ;scripts;sounds;textures 等 ;通過名字大概就知道 圖片紋理在哪,聲音在哪;
scripts 是放在全是lua文件.可知,它是採用 lua腳本編程,java很少的代碼, 是c++的引擎庫 和lua 腳本實現遊戲界面.
而且它能很好的跨平臺,只要再各各平臺實現 引擎庫,lua 都不用變 直接上,很是方便. 開源的引擎是有很多的.
今個兒選擇 cocos2d 來山寨它 .
先上山寨截圖.
遊戲如今分幾個模塊來開發:
hero 英雄sbHero : climber 攀爬者, 向上攀爬. 處理各種 動畫腳本,碰撞反應
bg 背景sbBackGround : 背景圖,背景滾動,這裏用到 2個 CCSpriteBatchNode 來循環 向下滾動 .
動畫管理器AnimationManager: 用來管理紋理緩衝,獲得動畫.(所有的動畫都從這裏獲取得)
bird sbBird : 鳥兒障礙物
squirrel sbSquirrel : 松鼠障礙物
star 飛鏢 sbStar : 飛鏢障礙物
bomb sbBomb : 炸彈障礙物.
level 等級 : 最關鍵的 一個類,管理 遊戲背景中障礙物的出現,已經碰撞檢測. 粒子效果的產生.遊戲的平很全靠它.
關於動畫管理器AnimationManager: 動畫管理很重要,包含紋理CCTextureCache.
bool AnimationManager::initAnimationMap()
{
CCAnimationCache::sharedAnimationCache()->addAnimation(createNPCAnimation(), "jumping");
/* 代碼 ... 忽略20行 */
return true;
}
CCAnimation* AnimationManager::createNPCAnimation()
{
CCTexture2D *playerRunTexture = CCTextureCache::sharedTextureCache()->addImage("enemies/jumping.png");
CCAnimation* animation = CCAnimation::create();
for( int i = 0;i < 5;i++){
animation->addSpriteFrame(CCSpriteFrame::create(playerRunTexture, cocos2d::CCRectMake(100*i, 0, 100, 100)));
}
for( int i = 0;i < 5;i++){
animation->addSpriteFrame(CCSpriteFrame::create(playerRunTexture, cocos2d::CCRectMake(100*i, 100, 100, 100)));
}
animation->setDelayPerUnit(0.4f/10 );
animation->setRestoreOriginalFrame(false);
return animation;
}
動畫使用呢,很簡單 .這個實現左右jump . 由於紋理 只有一個方向.通過 heroSprite->setFlipX(true);來設置精靈左右倒置.
case HERO_ACTION_JUMP_L:
if( spState != HERO_ACTION_RUN_R )
break;
//heroSprite->setFlipX(false);
action2 = CCMoveTo::create(0.4f, CCPointMake(HERO_OFFX, HERO_OFFY));
action = CCSpawn::create(sAnimationMgr->createAnimate("jumping") ,action2,NULL);
action4 = CCCallFuncND::create(this,callfuncND_selector(sbHero::Action_done), (void *)act);
action3 = CCSequence::create( action,action4,NULL );
heroSprite->runAction( action3 );
spState = HERO_ACTION_JUMP_L;
break;
以上爲代碼中一部分.使用其動畫!
JUMP動畫創建完成,調用完成後,走 Action_done !
根據往左跳還是往右跳,分別是實現 jump 動畫 後的 向上爬 的動畫.
void Action_done( void *ad ,int act )
{
switch( act )
{
case HERO_ACTION_JUMP_L:
heroSprite->setPosition(ccp(HERO_OFFX,HERO_OFFY));
heroSprite->setFlipX(false);
Start( HERO_ACTION_RUN );
spState = HERO_ACTION_RUN_L;
break;
case HERO_ACTION_JUMP_R:
heroSprite->setPosition(ccp(SCREEN_SIZE_W-HERO_OFFX-40,HERO_OFFY));
heroSprite->setFlipX(true);
Start( HERO_ACTION_RUN );
spState = HERO_ACTION_RUN_R;
break;
case HERO_ACTION_RUNON_SQL:
Action_done(NULL,spState);
break;
/* 代碼 ... 忽略20行 */
這樣 通過 動畫管理器,實現一個左右跳動後,繼續向上爬的過程.
如此,繼續向動畫管理器中加入其他動畫實例,在需要的裏面調用. 比如bird 怎麼飛. 松鼠應該是在 曬衣服繩子上跳.
關於cocos2d 的粒子系統是我要說的.
CCParticleExplosion爆炸
CCParticleFire
火
CCParticleFireworks煙火
CCParticleFlower花
CCParticleGalaxy
銀河
CCParticleMeteor
流行
CCParticleRain
下雨
CCParticleSmoke
下雪
CCParticleSnow
炊煙
CCParticleSpiral
螺旋
CCParticleSun
太陽焰
這麼多 確實已經非常豐富了,配合 例子編輯器非常方便.
但是我想到的是, 粒子交互的問題 ,當 鳥兒碰到hero,此刻要播放 粒子效果動畫.cocos 非常痛苦的是 一個child 粒子系統 只能加入一次 ,就算remove 再加也不行; 那麼我每次播放粒子動畫 都需要 new這個動作,但是我又不能立刻釋放,因爲有的動作還沒做完,粒子系統要播放段時間, 所以 這裏需要 調用 autorelease ,將其加入到回首的隊列中去. 如果不調用,粒子系統將會再觸發的時候 消耗比較多的內存,時間久了就必然崩潰.
case ENEMY_ACTION_HIT:
if( hit_count == 0){
if(spplc)
spplc->autorelease();
spplc = new CCParticleSystemQuad();
spplc->initWithFile("particles/bomb.plist");
spplc->setPosition(20,20);
spplc->setAutoRemoveOnFinish(true);
spobj->addChild(spplc);
spobj->setTexture(NULL);
}
hit_count++;
這次就將 目前遊戲 apk 程序放上去給大家下載: http://download.csdn.net/detail/icemanyandy/4966444