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