zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【cocos2dx-3.0beta-制作flappybird】尾随时代潮流,关于引擎升级

引擎 关于 升级 时代 制作 3.0 Beta cocos2dx
2023-09-14 09:10:16 时间

cocos2dx3.1版本号会被释放出,本来,我自己想要这个升级到官方的3.0版本号。只是无奈3.0坑的正式版不会做,偶数帧动画是正确及时的问题,果断放弃,随着广大淫民的支持。我已经升级到最新的代码cocos2dx3.1可得到。尽管cocos2dx3.1支持3d但是,我在这里没有什么3d型号。不然也能够加进去玩玩。

非常多人也去试过直接升级,只是原有的代码妥妥的出现了问题,我在升级的过程当初也发现了这些问题:

1.首先出现的一个问题就是一个语法错误:

auto contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = CC_CALLBACK_2(GameLayer::onContactBegin, this);
this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener, this);

这里的第二句出现了语法错误,这个是由于引擎把碰撞检測的接口换掉了由原来的两个參数换成了一个參数,自然语法上就出现了错误,以下是改动后的代码:

auto contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = CC_CALLBACK_1(GameLayer::onContactBegin, this);
this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener, this);

相同函数onContactBegin也须要做相同的改动:

bool GameLayer::onContactBegin(PhysicsContact& contact) {
	this->gameOver();
	return true;
}

2.第二个问题事实上非常多人已经发现了。就是小鸟的旋转角度不正常,这里仅仅须要加个减号进行修正就能够了:

void GameLayer::rotateBird() {
    float verticalSpeed = this->bird->getPhysicsBody()->getVelocity().y;
    this->bird->setRotation(- min(max(-90, (verticalSpeed*0.2 + 60)), 30));
}

3.第三个问题是碰撞检測不行了,这个事实上也非常easy。之前的cocos2d的碰撞系统集成并非非常完美。各类掩码都已经被设定好了,用默认的即可,可是如今须要自己设定了,改动例如以下:

首先定义游戏里面的三类拥有物理属性的东东:

typedef enum : uint8_t {
    ColliderTypeBird        = 0x1,
    ColliderTypeLand        = 0x1<<1,
    ColliderTypePip         = 0x1<<2
} ColliderType;

设定到鸟。地面和管子上面:

// Add the bird
this->bird = BirdSprite::getInstance();
this->bird->createBird();
PhysicsBody *body = PhysicsBody::create();
body->addShape(PhysicsShapeCircle::create(BIRD_RADIUS));
body->setCategoryBitmask(ColliderTypeBird);
body->setCollisionBitmask(ColliderTypeLand & ColliderTypePip);
body->setContactTestBitmask(ColliderTypePip);
body->setDynamic(true);
body->setLinearDamping(0.0f);
body->setGravityEnable(false);
this->bird->setPhysicsBody(body);
this->bird->setPosition(origin.x + visiableSize.width*1/3 - 5,origin.y + visiableSize.height/2 + 5);
this->bird->idle();
this->addChild(this->bird);

...
// Add the ground
this->groundNode = Node::create();
float landHeight = BackgroundLayer::getLandHeight();
auto groundBody = PhysicsBody::create();
groundBody->addShape(PhysicsShapeBox::create(Size(288, landHeight)));
groundBody->setDynamic(false);
groundBody->setLinearDamping(0.0f);
groundBody->setCategoryBitmask(ColliderTypeLand);
groundBody->setCollisionBitmask(ColliderTypeBird);
groundBody->setContactTestBitmask(ColliderTypeBird);
this->groundNode->setPhysicsBody(groundBody);
this->groundNode->setPosition(144, landHeight/2);
this->addChild(this->groundNode); 

...
body->addShape(shapeBoxDown);
body->addShape(PhysicsShapeBox::create(pipUp->getContentSize()));
body->setDynamic(false);
body->setCategoryBitmask(ColliderTypePip);
body->setCollisionBitmask(ColliderTypeBird);
body->setContactTestBitmask(ColliderTypeBird);
singlePip->setPhysicsBody(body);

基本上就以上三点改动,程序就行和曾经一样生龙活虎了,当然还有些小的warning,比方Object已经推荐不使用了。大家换成Ref就行了,我已经替大家改完了。

v3.1的代码见https://github.com/OiteBoys/Earlybird/tree/v3.1

版权声明:本文博主原创文章。博客,未经同意不得转载。