上面已经将各种需要的角色都创建了相应的类,这就相当于炒菜时准备好了“材料”,接着就需要将这些材料融合起来炒成一道美味“佳肴”。首先,我们在初始化函数init中创建并加入这些“材料”:
#include "GameScene.h"
#include "GameObjHero.h"
#include "GameHeroBullet.h"
#include "GameEnemyBullet.h"
using namespace cocos2d;
bool GameMain::init()
{
if (!CCLayer::init())
{
return false;
}
CCSize size = CCDirector::sharedDirector()->getWinSize();
//创建背景
bg1 = CCSprite::create("bg.png");
bg1->setScale(0.5);
bg2 = CCSprite::create("bg.png");
bg2->setScale(0.5);
bg1->setAnchorPoint(ccp(0 ,0));
bg2->setAnchorPoint(ccp(0 ,0));
bg1->setPosition(ccp(0, 0));
bg2->setPosition(ccp(0 ,size.height));
this->addChild(bg1 ,0);
this->addChild(bg2 ,0);
//创建主角
hero = new GameObjHero();
hero->setPosition(ccp(size.width/2 , -50));
hero->setScale(0.5);
addChild(hero ,2 ,1);
hero->runAction(CCMoveBy::create(0.5 ,ccp(0 ,150)));
//创建敌人
enemys = CCArray::createWithCapacity(3);
for (int i = 0; i<3; i++)
{
int type = i + 1;
GameObjEnemy* enemy = new GameObjEnemy();
enemy->setPosition(ccp(size.width/4 * type , size.height +50));
enemy->setScale(0.5);
enemy->setType(type);
enemys->addObject(enemy);
addChild(enemy ,1);
enemy->movestart();
}
enemys->retain();
//创建血量UI
blood = 3;
CCSpriteBatchNode* ui = CCSpriteBatchNode::create("cat.png");
blood1 = CCSprite::createWithTexture(ui->getTexture());
blood1->setPosition(ccp(20, size.height - 20));
blood1->setScale(0.2);
ui->addChild(blood1);
blood2 = CCSprite::createWithTexture(ui->getTexture());
blood2->setPosition(ccp(50, size.height - 20));
blood2->setScale(0.2);
ui->addChild(blood2);
blood3 = CCSprite::createWithTexture(ui->getTexture());
blood3->setPosition(ccp(80, size.height - 20));
blood3->setScale(0.2);
ui->addChild(blood3);
addChild(ui ,4);
//初始化主角子弹
bullets = CCArray::createWithCapacity(5);
for (int i = 0; i<bullets->capacity(); i++)
{
GameHeroBullet *hbullet = new GameHeroBullet();
hbullet->setIsNotVisable();
hbullet->setScale(0.5);
bullets->addObject(hbullet);
this->addChild(hbullet ,3);
}
bullets->retain();
//初始化敌人子弹
enemybullets = CCArray::createWithCapacity(10);
for (int i = 0; i<enemybullets->capacity(); i++)
{
GameEnemyBullet *ebullet = new GameEnemyBullet();
ebullet->setIsNotVisable();
ebullet->setScale(0.5);
enemybullets->addObject(ebullet);
this->addChild(ebullet , 3);
}
gamemark = new GameMark();
addChild(gamemark ,4);
enemybullets->retain();
//初始化游戏结束画面及按钮
gameover = CCSprite::create("gameover.png");
gameover->setAnchorPoint(ccp(0.5 ,0.5));
gameover->setPosition(ccp(0 ,0));
gameover->setPosition(ccp(size.width/2 , size.height/2 + 70));
gameover->setVisible(false);
gameover->setScale(0.5);
addChild(gameover ,5);
CCMenuItemImage *pCloseItem = CCMenuItemImage::create("back.png" ,"back.png", this, menu_selector(GameMain::menuBackCallback));
pCloseItem->setPosition(ccp(size.width/2 ,size.height/2 - 50));
pCloseItem->setScale(0.5);
CCMenu* pMenu = CCMenu::create(pCloseItem , NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu ,5 ,25);
pMenu->setVisible(false);
pMenu->setEnabled(false);
isreduce = false;
isover = false;
scheduleUpdate();
return true;
}
下面我们看看这些材料里都有那些精华:
1.addChild():
该函数有三种参数形式:
virtual void addChild (CCNode *child)//增加节点
virtual void addChild (CCNode *child, int zOrder) //通过顺序添加节点
virtual void addChild (CCNode *child, int zOrder, int tag)//通过顺序和tag添加节点
其主要作用就是添加子成员,参数zOrder是指该成员的层级(也可以说深度),其值大的成员在在值小的成员上面,tag是指该成员的tag值,tag值就是一个成员的标识,如果丢掉了这个变量,可以通过getChildByTag(tag)把这个成员找到。
2.CCMoveBy::create() 第一个参数是时间,第二个参数是移动到的所在位置。
区别:
CCMoveBy是向量,相当于从当前点开始加上你的点的大小就是移动过后的位置;
CCMoveTo是终点值, 就是你那个点是哪就移动到哪,不管开始在哪。
3.CCSpriteBatchNode:批量渲染,一次渲染就把所有的CCSprite绘制出来,可以用来提高游戏的运行效率。
分享一个详细介绍的链接:http://www.cocos2dev.com/?p=331(有举例,很清楚)。
4.CCMenu(菜单层):
这是一个以CCMenu对象为集合类,CCMenuItem类实例组成个事各样按钮的菜单管理选择画面层。
CCMenu类提供的方法主要是用来按照横向、竖向或者多行排序展示CCMenuItem类实例的。为了实现不同的按钮效果,系统提供了多种类型的CCMenuItem,但每个按钮都有三种基本状态:正常、选中、禁用。CCMenuItem是基础类,不要直接使用该类。作为所有菜单项的父类,CCMenuItem主要完成以下两个任务:
1>设置按钮的状态。
2>负责处理回调函数(当按钮被单击后,需要调用的函数叫做回调函数)。
CCMenuItem三个子类:CCMenuItemImage:图片按钮菜单项,通过指定图片资源来创建菜单项;
CCMenuItemLabel:文本菜按钮单项,通过指定文本标签( 实现CCLabelProtocol接口的类,如CCLabelTTF)来创建菜单项;
CCMenuItemToggle :开关按钮菜单项,这种类型的按钮一次只有一个菜单项显示出来,当你单击它的时候,它就会切换到另外一个菜单项;
5.CCMenuItemImage是从CCMenuItemSprit派生而来,你只需要提供图片的名字,创建CCSprite对象的过程由框架自动完成。