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

主角小鸟有三种状态: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;
  }
}

下一步,说说游戏的流程

时间: 2024-12-25 23:19:52

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

cocos2dx3.3开发FlappyBird总结十二:状态层设计

状态层是比较复杂的了,状态层需要与游戏层通信,因此也需要为游戏层先设计一个代理类,以便状态层遵守游戏层的代理,这样游戏层就可以在游戏开始.得分.结束时,告诉状态层做出相应的状态表现了. 游戏层的代理类: /** * The delegate between status layer and game layer */ class GameStatusDelegate { public: /** * When the game start, this method will be called *

cocos2dx3.3开发FlappyBird总结十:背景层设计

游戏背景层的任务是很简单的,只是根据当前时间来显示白天或者黑夜背景图,提供获取地面的高度方法. #ifndef __EngryBird__BackgroundLayer__ #define __EngryBird__BackgroundLayer__ #include "cocos2d.h" /** * The game background,showing the background information * in the game. */ class BackgroundLay

cocos2dx3.3开发FlappyBird总结十六:游戏层实现

游戏有三种状态,准备开始.游戏中.游戏结束,定义一个枚举来表示: /** * The status of game, it has three status. */ typedef enum tag_GameState { /** The game hasn't started, but ready to start */ kGameStateReady = 1, /** The game has started, and the player is playing the game */ kG

cocos2dx3.3开发FlappyBird总结十一:控制层功能设计

控制层的任务就是监听触摸事件,然后回调代理方法.控制层并不具体处理任务事情,只是抛给代理处理,因此需要先设计一个代理. 代理只是一个方法,那就是触摸: /** * The delegate between option layer and game layer */ class OptionDelegate { public: /** * When touch the option layer, it will be called */ virtual void onTouch() = 0; }

cocos2dx3.3开发FlappyBird总结四:资源管理类

游戏中需要全局管理很多的资源,如图片.音频文件等.下面我们设计一个骨骼资源管理类,名叫:AtlasLoader,设计为全局共享类,用于载入资源和通过资源名称获取精灵帧. 下面先上头文件: #ifndef __EngryBird__AtlasLoader__ #define __EngryBird__AtlasLoader__ #include "cocos2d.h" /** * The struct of the atlas file */ typedef struct tag_atl

cocos2dx3.3开发FlappyBird总结三:项目剖析

Flaypp bird这个小游戏是很火热的,用这个小项目来学习,是非常不错的. 游戏中主要的角色: 主角:小鸟. 小鸟是主角,只有一只小鸟,因此设计小鸟类时,设计成全局共享的类,即通过单例方式获取小鸟对象. 障碍物:水管 水管垂直方向是有两根的,一长一短,其实是同长的,只是修改了Y属性而已. 地面: 地面是无限滚动的,直到游戏结束. 游戏规则很简单: 与地面接触或者与水管接触视为游戏结束,小鸟通过一根水管,得分+1. 游戏操作方式: 玩家只需要轻轻点击屏幕,掌握好力度与点击的频率,才能通过更多的

cocos2dx3.3开发FlappyBird总结十七:结束语

教程到此也该结束了,如果您是认真看完此教程的有缘人,相信您一定会成为本行业的精英,但是我希望大家都能有开源精神,把自己的总结,自己领悟出来的知识,共享出来,大家一起学习,少走弯路. 本人Github:https://github.com/632840804 本人QQ:632840804 本人Email:huangyibiao520@163.com 写代码不易,写教程亦不易,且写且看且珍惜!!! 写代码不易,写教程亦不易,且写且看且珍惜!!! 写代码不易,写教程亦不易,且写且看且珍惜!!! 如果遇

cocos2dx3.3开发FlappyBird总结五:说说屏幕适配

官方网站中有一篇教程,是关于适配问题的,笔者也是通过阅读后,才了解一些,希望大家好好阅读,必定受益匪浅: http://cn.cocos2d-x.org/tutorial/show?id=2360 此处笔者采用的是ResolutionPolicy::EXACT_FIT,即完全显示. 由于背景图片资源的宽高为288:512,因此这里把设计分辨率为288:512,在bool AppDelegate::applicationDidFinishLaunching()中修改相应地方: if(!glview

cocos2dx3.3开发FlappyBird总结十三:数字特效类

由于显示得分其实是数字精灵的组合,因此需要先设计一个存储数字精灵数列的类: #ifndef __EngryBird__NumberSeries__ #define __EngryBird__NumberSeries__ #include "cocos2d.h" /** * This class is for ScoreNumber, and it will store a list of sprite frames. * With it, you can load number spr