您的位置:首页 > 移动开发 > Cocos引擎

[cocos2d 开发]看我怎么山寨 跳跃忍者 !!!ninjump 1

2012-12-31 12:15 344 查看
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 的粒子系统是我要说的.

这么多 确实已经非常丰富了,配合 例子编辑器非常方便.

但是我想到的是, 粒子交互的问题 ,当 鸟儿碰到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






















                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐