加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2dx3.3开发FlappyBird总结六:设计共享小鸟类(主角)

发布时间:2020-12-14 20:38:30 所属栏目:百科 来源:网络整理
导读:主角小鸟有三种状态:idle、fly、die。 idle状态下,小鸟会挥动翅膀,原地不动,且不受重力的影响。 fly状态下,也就是游戏过程中小鸟移动,此状态下小鸟挥动翅膀飞行移动且受重力的影响。 die状态下,游戏结束了,小鸟死亡倒地了。 所以先设计一个枚举来表

主角小鸟有三种状态:idle、fly、die。
idle状态下,小鸟会挥动翅膀,原地不动,且不受重力的影响。
fly状态下,也就是游戏过程中小鸟移动,此状态下小鸟挥动翅膀飞行移动且受重力的影响。
die状态下,游戏结束了,小鸟死亡倒地了。
所以先设计一个枚举来表示小鸟的三种状态:

/** * The leading role,bird's three action state */
typedef enum {
  kActionStateIdle = 1,/* the idle state,wave wing but gravity */
  kActionStateFly,/* the fly state,wave wing and be affected by gravity */
  kActionStateDie  /* the die state,the bird die in the ground */
} ActionState;

先重点说说创建小鸟对象方法:

// 小鸟有三种颜色,因此每次游戏开始时,会随机生成一种颜色.
// 然后创建小鸟精灵,如果创建成功,则创建小鸟主角在游戏中需要执行的动作:idle和wing。
bool BirdSprite::createBird() {
  // Randomly generate a bird color
  srand((unsigned)time(NULL));
  int type = rand() % 3;
  char birdName[10];
  char birdNameFormat[10];
  sprintf(birdName,"bird%d_%d",type,type);
  sprintf(birdNameFormat,"bird%d_%%d",type);

  auto spriteFrame = AtlasLoader::getInstance()->getSpriteFrame(birdName);
  // Create a bird sprite
  auto isInitSuccessful = Sprite::initWithSpriteFrame(spriteFrame);
  if (isInitSuccessful) {
    // init idle status
    // create the bird idle animation
    auto animation = createAnimation(birdNameFormat,3,10);
    _idleAction = RepeatForever::create(Animate::create(animation));

    // create the bird waving wing animation
    auto upAction = MoveBy::create(0.4f,Vec2(0,8));
    auto downAction = upAction->reverse();
    _wingAction = RepeatForever::create(Sequence::create(upAction,downAction,NULL));

    return true;
  }

  return false;
}

接下来很重要的一个方法就是修改小鸟主角状态的方法:

// 修改小鸟的状态,会对应执行相应的动作
// idle状态,也就是游戏准备开始时的状态,小鸟挥动翅膀原地不动
// fly状态,游戏开始了,小鸟受重力影响,由玩家控制
// die状态,游戏结束,撤消小鸟所有的动作
void BirdSprite::setActionState(ActionState state) {
  _actionState = state;

  switch (state) {
    case kActionStateIdle:
      // The idle state,the bird waves the wing and doesn't being affected by gravity
      this->runAction(_idleAction);
      this->runAction(_wingAction);
      break;
    case kActionStateFly:
      // The fly state,the bird waves the wing,affected by gravity
      this->stopAction(_wingAction);
      this->getPhysicsBody()->setGravityEnable(true);
      break;
    case kActionStateDie:
      // Thd die state,the bird get down to the ground.
      this->stopAllActions();
      break;
    default:
      break;
  }
}

下一步,说说游戏的流程

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读