//对于游戏开始的界面,笔者在这里省略,直接引入游戏核心的代码实现
//在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);
}
//2016.9.27
转载请注明原文地址: https://ju.6miu.com/read-1202032.html