cocos运动轨迹

1,301 阅读2分钟

预览地址

游戏中的世界就像拍电影一样,有制片人(自己),导演,场景,演员,制片人投资导演,导演切换场景,场景里有很多演员(精灵),演员负责表演(动画)

动画

需求

一个骑手听着音乐在一个飘着雪花的轨迹中运动

分解

  • 地图很长,不像一般的游戏场景,屏幕没有滚动条
  • 点击骑手开始运动
  • 运动方式包含,水平运动,竖直运动,弧形运动、左右翻转
  • 雪花飘落
  • 背景音乐

实现

开始状态

移动地图精灵到底部,骑手精灵放在地图精灵内部(原因:骑手精灵与地图精灵是父子关系,方便后期计算骑手运动轨迹)

// 地图精灵位置设置屏幕中间
this.mapSprite.setPosition(size.width / 2, size.height / 2)
// 设置动画让精灵移动到底部
var action = cc.moveBy(1, cc.p(0, MAP_HEIGHT / 2 - size.height / 2))
// 开始动画
this.mapSprite.runAction(action);
点击事件
// 给骑手添加点击事件
cc.eventManager.addListener({
  event: cc.EventListener.TOUCH_ONE_BY_ONE,
  swallowTouches: true, // 不进行冒泡
  onTouchBegan: this.onTouchBegan.bind(this)
}, this.riderSprite)

onTouchBegan: function(touch, event) {
  // 获取点击元素
  var target = event.getCurrentTarget()
  // 获取点击位置
  var location = touch.getLocation()
  // 点击元素的大小
  var s = target.getContentSize();
  var rect = cc.rect(0, 0, s.width, s.height);
  // 获取当前触摸点相对于按钮所在的坐标
  var locationInNode = target.convertToNodeSpace(location);
  // this.timer < 2 第三段动画没加
  if (cc.rectContainsPoint(rect, locationInNode) && this.timer < 2) {       // 判断触摸点是否在按钮范围内
    this.riderMove()
    return true;
  }
  return false;
},
运动
// 创建动画
var action1 = cc.moveTo(2, cc.p(RIDER_WIDTH / 2 + 300, 125 + RIDER_HEIGHT / 2));
this.riderSprite.runAction(action1);

如何弧线运动,利用贝塞尔曲线

4个控制点的贝塞尔曲线

4个控制点的贝塞尔曲线

var action2 = cc.bezierTo(3, [cc.p(RIDER_WIDTH / 2 + 600, 125 + RIDER_HEIGHT / 2), cc.p(RIDER_WIDTH / 2 + 600, 125 + RIDER_HEIGHT / 2 + 440), cc.p(RIDER_WIDTH / 2 + 300, 125 + RIDER_HEIGHT / 2 + 440)])

cc.bezierTo第一个参数是运动时间,第二个参数传3个控制点,还有一个控制点是起始位置

雪花飘落

粒子效果可以从在线编辑粒子导出plist文件

showEffect: function() {
  // 创建粒子系统
  this.particleSystem = new cc.ParticleSystem(res.snow_plist)
  // 完成之后消失(好性能)
  this.particleSystem.setAutoRemoveOnFinish(true)
  // 添加粒子
  this.addChild(this.particleSystem, 3)
},

播放音乐

cc.audioEngine.playMusic(res.bg_mp3, true);