下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

地图滚动算法在Cocos2D-X中的实现流程

作者:课课家教育     来源: http://www.kokojia.com点击数:1061发布时间: 2019-04-11 14:28:19

标签: Cocos2D-X地图Cocos2D-X教程Cocos2D-X学习

  我们在玩游戏的时候,经常会遇见这种情形——我们的主角在游戏地图中走动着,而地图随着主角走动切换,这一效果是怎么实现的呢?本篇教程将为大家解析Cocos2d-x中地图滚动算法的实现流程。

地图滚动算法在Cocos2D-X中的实现流程_Cocos2D-X地图_Cocos2D-X教程_Cocos2D-X学习_课课家

  即是要求人物在移动的时候,保持地图滚动,因为地图足够长的时候,不能让人物一出场就跑出屏幕的范围,而要使其在屏幕上跑完整个地图。效果如上图示。

  这个实现就用到了上面所说的坐标系的理解,精灵的坐标系是相对于其所在的图层而言的。

  当精灵的横坐标小于屏幕的横坐标时候,可以使精灵继续向前移动,如下:

  但是当精灵的坐标大于屏幕的一般的时候,如果不采取措施,精灵就会继续向前移动,直至走出屏幕,那么应该采取什么行动呢?

  首先我们已经明白,精灵的所谓的坐标是相对于图层而言的,因此实际上精灵向前移动仅仅是相对于下面的地图的移动,如果地图也以相同的变化移动的话,那么精灵和地图在我们看来就是相对静止的。(坐标参考系的不同)。这个时候精灵的坐标虽然在变化,但是在屏幕的位置却没有变化,但是精灵确实在走地图。

  简单的说,其实就是这样的情形——精灵在屏幕上的位置不变,地图相对的在移动,所以精灵坐标没有改变,当地图走完了之后我们就接上另外一块地图,这样就实现了地图的滚动。

  如果还是不明白就先看代码吧:

  void Player::setViewPointByPlayer() {

  if (m_sprite == NULL) {

  return;

  }

  Layer* parent = (Layer*)getParent();

  /* 地图方块数量 */

  Size mapTiledNum = m_map->getMapSize();

  /* 地图单个格子大小 */

  Size tiledSize = m_map->getTileSize();

  /*地图大小 */

  Size mapSize = Size(

  mapTiledNum.width * tiledSize.width,

  mapTiledNum.height * tiledSize.height);

  /* 屏幕大小 */

  Size visibleSize = Director::getInstance()->getVisibleSize();

  /* 主角坐标 */

  Point spritePos = getPosition();

  /* 如果主角坐标小于屏幕的一半,则取屏幕中点坐标,否则取主角的坐标 */

  float x = std::max(spritePos.x, visibleSize.width / 2);

  float y = std::max(spritePos.y, visibleSize.height / 2);

  /* 如果X、Y的坐标大于右上角的极限值,则取极限值的坐标(极限值是指不让地图超出

  屏幕造成出现黑边的极限坐标) */

  x = std::min(x, mapSize.width - visibleSize.width / 2);

  y = std::min(y, mapSize.height - visibleSize.height / 2);

  if (x >= visibleSize.width);

  /* 目标点 */

  Point destPos = Point(x, y);

  /* 屏幕中点 */

  Point centerPos = Point(visibleSize.width / 2, visibleSize.height / 2);

  /* 计算屏幕中点和所要移动的目的点之间的距离 */

  Point viewPos = centerPos - destPos;

  parent->setPosition(viewPos);

  }

  由于地图移动也有一个限度,就是不能将地图移出屏幕,否则就会出现黑框,这个时候的坐标就是当地图的极限坐标。

  其实也可以理解为精灵在地图上移动,我们拿着一个镜头记录,为了保持精灵在镜头的中心,要么移动镜头,要么拖着地图(包括精灵)往精灵移动的反方向移动。

  想通了就觉得很好理解了。就是一个相对的问题。

  总结:

  本篇教程到这里就结束了,希望能对各位同学有所帮助,谢谢大家观看。

赞(16)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程