【唠叨】

    源码教程请移步:http://blog.csdn.net/iamlazybone/article/details/19612941

    感谢懒骨头提供了这么多的Demo教程,对于初学者的我而言,帮助真的十分大。

    注:本节仅仅记录博主自身学习《萝莉快跑》的心得体会。


【游戏截图】

wKioL1QKfB-gpzDFAAGnf6DDQyM688.jpg




【学习心得】


1、游戏主场景分层

    如果将所有的元素全部都写在一个Game类里面,会很混乱,且改动也很麻烦。

    所以应该对游戏的元素进行分层,如:背景层、人物层、怪物层、道具层等。

    然后再将所有的层放入Game场景中,组合成完整的游戏。

    (1)人物层:GameHero.h

    (2)道具层:GameStar.h

    (3)分数层:GameMark.h

    (4)地图层:GameMap.h


2、更换CCMenuItemImage的图片

//
	sp->setNormalImage(CCSprite::create("sound-off-A.png"));   //正常图片
	sp->setSelectedImage(CCSprite::create("sound-off-B.png")); //选中时图片
//


3、精灵背景更换

//
	jump = CCTextureCache::sharedTextureCache()->addImage("s_jump.png"); //跳
	luoli->setTexture(jump);
//


4、跑动作动画

    使用Animation/Animate动画动作。

//
	CCAnimation* anrun = CCAnimation::create();
	
	anrun->addSpriteFrameWithFileName("s_1.png");
	anrun->addSpriteFrameWithFileName("s_2.png");
	anrun->addSpriteFrameWithFileName("s_3.png");
	anrun->addSpriteFrameWithFileName("s_4.png");
	anrun->addSpriteFrameWithFileName("s_5.png");
	anrun->addSpriteFrameWithFileName("s_6.png");
	anrun->addSpriteFrameWithFileName("s_7.png");
	anrun->addSpriteFrameWithFileName("s_8.png");
	
	anrun->setDelayPerUnit(0.1f);         //帧间隔
	anrun->setRestoreOriginalFrame(true); //是否返回初始帧
	
	CCRepeatForever* acrun = CCRepeatForever::create( CCAnimate::create(anrun) );
	luoli->runAction(acrun);
//


5、Game里地图层的sp元素的坐标

    假设:bg1和sp都是以中心为锚点的,AnchorPoint(0.5,0.5),且sp为bg1的子节点。

    要想知道sp元素在屏幕上的坐标,就需要知道bg1在屏幕上的坐标,以及sp相对bg1的坐标。

    因为sp设置的setPosition是相对其父节点bg1的坐标,而不是在屏幕上的实际坐标

//
	//1.获得地图层坐标,p1是相对Game的坐标
	CCPoint p1 = gamemap->getPosition();
	
	//2.获得sp坐标,psp是相对gamemap的坐标
	CCPoint psp = (gamemap->sp)->getPosition();
	
	//3.计算sp在Game中的坐标
	CCPoint pt = ccp(
		(p1.x - gamemap->getContentSize().width/2)  + psp.x ,
		(p2.y - gamemap->getContentSize().height/2) + psp.y );
//


6、背景滚动

    使用两张背景图片,从右到左滚动,超出屏幕就从新设置位置,继续滚动。

    屏幕大小:480 X 320。

//
	//背景1
	bg1 = CCSprite::create("back_1.png");
	bg1->setPosition(ccp(240,160));
	this->addChild(bg1);

	//背景2
	bg2 = CCSprite::create("back_1.png");
	bg2->setPosition(ccp(720,160));
	this->addChild(bg2);
	

	void GameMap::update(float dt)
	{
		//向左移动2个像素
		bg1->setPosition(bg1->getPosition() - ccp(2, 0));
		bg2->setPosition(bg2->getPosition() - ccp(2, 0));

		//超出屏幕,设置坐标,重新滚动
		if (bg1->getPositionX() <= -240) {
			bg1->setPosition(ccp(720, 160));
			//重新加载背景上的道具
			resetStar(star1); 
		}
		if (bg2->getPositionX() <= -240) {
			bg2->setPosition(ccp(720, 160));
			//重新加载背景上的道具
			resetStar(star2);
		}
	}
//