Coco2d-x3.8.1制作飞翔的小鸟(上)

发表于2018-03-19
评论0 1.5k浏览
Cocos引擎在游戏开发中也是用的比较广泛,像html5游戏开发、Android游戏开发Cocos引擎肯定是首选,为了让开发者可以熟练使用Cocos引擎,本系列就以制作飞翔的小鸟为例给大家进行介绍,首先和大家介绍在制作飞翔的小鸟过程中如何创建物理场景。

重点:
1. 对于一些简单的功能这里就忽略了,直接引入游戏核心的代码实现。
2. 在cocos2d-x3.0以上版本对Box2d和chumk物理引擎进行整合,使用起来是很方便的,这里通过flappBird对游戏进行测试。

在主场景中初始化该场景为物理场景
//playGameScene.cpp
Scene* playGameScene::createScene()
{
Scene* scene=Scene::createWithPhysics();
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);//调试物理粒子
scene->getPhysicsWorld()->setGravity(Vec2(0,-1000));//使用矢量值来表示重力
playGameScene* pgs=playGameScene::create();
scene->addChild(pgs);
return scene;
}

另外创建一个类(类名为edgeWord)继承于cocos2d::Node,用于构建物理世界,以下是init()函数的方法实现
//edgeWord.cpp
bool edgeWord::init()
{
if (!Node::init())
{
return false;
}
Size visibleSize=Director::getInstance()->getVisibleSize();
auto land=Sprite::create("land.png");
Size landSize=land->getContentSize();
this->setPhysicsBody(PhysicsBody::createEdgeBox(Size(visibleSize.width,visibleSize.height-landSize.height)));
this->setContentSize(Size(visibleSize.width,visibleSize.height-landSize.height));
this->setPosition(visibleSize.width/2,visibleSize.height/2+landSize.height/2);
return true;
}

接而和创建物理世界一样,创建主角和障碍物
//heroBird.cpp
bool heroBird::init()
{
if (!Sprite::init())
{
return false;
}
srand(time(NULL));//获取随机种子
int bird_type=rand()%3;
Size visibleSize=Director::getInstance()->getVisibleSize();
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Plist1.plist","Plist1.png");
switch (bird_type)
{
case 0:
this->initWithSpriteFrameName("bird0_0.png");//初始精灵纹理图片
break;
case 1:
this->initWithSpriteFrameName("bird1_0.png");
break;
case 2:
this->initWithSpriteFrameName("bird2_0.png");
break;
default:
break;
}
this->setPosition(80,visibleSize.height/2);
this->setPhysicsBody(PhysicsBody::createBox(Size(30,25)));
this->getPhysicsBody()->setRotationEnable(false);
this->getPhysicsBody()->setContactTestBitmask(1);//碰撞信号检测
return true;
}

添加障碍物
//doubleBlocks
doubleBlocks* doubleBlocks::createDoubleBlocks(cocos2d::Layer* layer)
{
doubleBlocks* blocks=new doubleBlocks();
blocks->autorelease();
if (!blocks->init(layer))
{
return NULL;
}
return blocks;
}
bool doubleBlocks::init(cocos2d::Layer* layer)
{
if (!Node::init())
{
return false;
}
block_up=obstaclesBlock::createBlock(0);
layer->addChild(block_up);
block_down=obstaclesBlock::createBlock(1);
layer->addChild(block_down);
return true;
}

接而返回playGameScene.cpp的init()函数添加物理节点
//playGameScene.cpp
bool playGameScene::init()
{
         if(!Layer::init())
         {
                  return false;
         }
        //添加主角
m_heroBird=heroBird::create();
this->addChild(m_heroBird);

添加物理世界
m_word=edgeWord::create();
this->addChild(m_word);
         return true;
}
void playGameScene::addBlocks(float dt)
{
Size visibleSize=Director::getInstance()->getVisibleSize();

添加障碍物
obstaclesBlock* block_up=obstaclesBlock::createBlock(0);
obstaclesBlock* block_down=obstaclesBlock::createBlock(1);
this->addChild(block_up);
this->addChild(block_down);
int heigth=rand()%200-20;
int clearance=90;//两障碍水管的间隙
block_down->setPosition(visibleSize.width,heigth);
block_up->setPosition(visibleSize.width,heigth+320+clearance);
}

对于Coco2d-x3.8.1制作飞翔的小鸟的上半部分就和大家介绍这么多,相信大家现在也都知道怎么创建物理场景了吧,接下来就和大家介绍下半部分碰撞事件以及触摸事件的处理。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引