Cocos Creator 实现摩天轮效果
来源:互联网 发布:mapreduce python编程 编辑:程序博客网 时间:2024/06/11 20:34
第一次写博客 导致紧张吓得我直接贴代码
cc.Class({ extends: cc.Component, properties: { selecNode: { default: null, type: cc.Node }, item: { default: null, type: cc.Prefab }, radius: 0, //半径 pCenter: cc.Vec2, //圆心 angleInterval: 0, //每个预制体之间的间隔角度 angleFx: 0, //阻力系数 speedMin: 0.1, //最小转速 itemNum: 0, //预制体个数 //滑动的最终角度,用来设置最小角度和最大角度 angleMin: 0, angleMax: 0, beginVec: cc.Vec2, touchVec: cc.Vec2, backNum: 0, oldVec: 0,//记录上一次角度的位置 beginPoint: cc.Vec2, //开始的位置 movePoint: cc.Vec2, guanxing: cc.repeatForever, count: cc.repeatForever, angleDx: null, angleS: 0, time: 0, angleSpeed: 0, stopTime: 0, angleDx_Save: null, direction: 0, beRotation: 0, Speed: 0, i: 0 }, // use this for initialization onLoad: function () { this.initSelecScene(); }, buttonEvent: function (event, data) { if (data === 'back') { cc.director.loadScene('MainScene'); } }, initSelecScene: function () { this.initData(); this.loadUI(); this.loadTouchStartEvent(); this.loadTouchEndEvent(); this.loadTouchMoveEvent(); this.updateItemAngle(); }, initData: function () { this.selecNode.rotation = 47; this.radius = 1600; this.pCenter = cc.v2(this.radius, this.radius); this.angleInterval = 6; this.angleFx = 1 / 6; this.speedMin = 0.1; this.itemNum = 6; this.angleMin = 47; this.angleMax = -2; this.backNum = 3; this.Speed = 1.9; }, loadUI: function () { for (var i = 0; i < this.itemNum; ++i) { var angle = this.angleInterval * i + 1.1; var vec = cc.p(0, this.radius).rotate(angle); // var addHeight = vec.add(cc.v2(this.pCenter.x, this.pCenter.y)); var itemNode = cc.instantiate(this.item); itemNode.position = vec; itemNode.getComponent('selecItem').initSelecImg(i); this.selecNode.addChild(itemNode); itemNode.setTag(i); cc.log(vec); } }, loadTouchStartEvent: function () { var self = this; this.node.on(cc.Node.EventType.TOUCH_START, function (event) { self.savaOldVec(cc.v2(event.getLocation().x, event.getLocation().y)); self.beginVec = self.selecNode.getRotation(); self.touchVec = self.pCenter.sub(cc.v2(event.getLocation().x, event.getLocation().y)); self.beginPoint = cc.v2(event.getLocation().x, event.getLocation().y); self.setRotate1(); self.countAngleSpeed(); }, this.node); }, loadTouchEndEvent: function () { var self = this; this.node.on(cc.Node.EventType.TOUCH_END, function (event) { self.guanxingFunc(); }, this.node); }, loadTouchMoveEvent: function () { var self = this; this.node.on(cc.Node.EventType.TOUCH_MOVE, function (event) { if (self.selecNode.getRotation() > self.angleMin + 5 || self.selecNode.getRotation() < self.angleMax - 5) { cc.log('rotation Error'); return; } self.movePoint = cc.v2(event.getLocation().x, event.getLocation().y); var vec = self.pCenter.sub(cc.v2(event.getLocation().x, event.getLocation().y)); var angle = cc.pToAngle(self.touchVec) - cc.pToAngle(vec); self.rotationNode(self.beginVec - (angle * 180 / Math.PI)); self.angleDx = angle * 180 / Math.PI; }, this.node); }, updateItemAngle: function () { for (var i = 0; i < this.itemNum; ++i) { var item = this.selecNode.getChildByTag(i); var angle = this.angleInterval * i + 1.1; var vec = cc.p(0, this.radius).rotate(-angle); item.getComponent('selecItem').rotationItem(cc.pToAngle(vec) * 180 / Math.PI - 90); } }, update: function () { //模拟旋转 // this.selecNode.rotation = this.i++; this.updateItemAngle(); }, rotationNode: function (vec) { this.selecNode.rotation = vec; }, guanxingFunc: function () { this.selecNode.stopAction(this.count); if (this.angleS === 0 || this.time === 0) { return this.trainBack(); } this.angleSpeed = this.angleS / (this.time / 5); if (this.angleS > 0) { this.direction = 1; } else { this.direction = -1; } //限制最大转速 if (this.angleSpeed > 2.5) { this.angleSpeed = 2.5; } else if (this.angleSpeed < -2.5) { this.angleSpeed = -2.5; } this.beRotation = this.selecNode.getRotation(); var guanxingFunction = cc.callFunc(this.updateGuanxin, this); var delayTime = cc.delayTime(1 / 60); var repeat = cc.repeatForever(cc.sequence(delayTime, guanxingFunction)); this.guanxing = repeat; this.selecNode.runAction(this.guanxing); }, trainBack: function () { var angle = this.selecNode.getRotation(); var rotateTo; if (angle >= this.angleMin - this.backNum) { rotateTo = cc.rotateTo(0.2, 47); if (rotateTo != null) { this.selecNode.runAction(rotateTo); } else { this.trainBack(); } } if (angle <= this.angleMax + this.backNum) { rotateTo = cc.rotateTo(0.2, -2); if (rotateTo != null) { this.selecNode.runAction(rotateTo); } else { this.trainBack(); } } }, getDirection: function () { if (this.beginPoint.x > this.movePoint.x) { return 1; } else if (this.beginPoint.x < this.movePoint.x) { return -1; } return ''; }, savaOldVec: function (vec) { var vecs = this.pCenter.sub(vec); var angle = cc.pToAngle(this.touchVec) - cc.pToAngle(vecs); this.oldVec = this.beginVec - (angle * 180 / Math.PI); }, // 获得控制权 setRotate1: function () { this.angleS = 0 this.time = 0 this.angleDx = 0 // 取消惯性强制停止 if (this.guanxing != null) { this.selecNode.stopAction(this.guanxing); // this.guanxing = null; } }, countAngleSpeed: function () { var delayTime = cc.delayTime(1 / 60); var callfunc = cc.callFunc(this.callFunctionAction, this); var repeat = cc.repeatForever(cc.sequence(delayTime, callfunc)); this.count = repeat; this.selecNode.runAction(this.count); }, callFunctionAction: function () { var self = this; self.time = 0 // 同方向旋转过时间 self.angleS = 0 // 同方向旋转过的角度 self.stopTime = 0 // 转动过程停留 if (self.angleDx != null) { if (self.angleDx_Save === null) { self.angleDx_Save = self.angleDx; } if (self.angleDx * self.angleDx_Save < 0) { //改变方向 数据清零 // cc.log('改变方向'); self.time = 0; self.angleS = 0; } else if (Math.abs(self.angleDx_Save - self.angleDx) >= 0.1) { //同方向旋转 // cc.log('同方向旋转1'); self.time = self.time + 1; self.angleS = self.angleDx + self.angleS; self.stopTime = 0 } else if (Math.abs(self.angleDx_Save - self.angleDx) < 0.1) { //同方向旋转 // cc.log('同方向旋转2'); self.stopTime = self.stopTime + 1; if (self.stopTime >= 4) { self.stopTime = 0 self.time = 0 self.angleS = 0 } } self.angleDx_Save = self.angleDx; } // cc.log('time:' + self.time + ' stopTime:' + self.stopTime + ' angleS:' + self.angleS); }, updateGuanxin: function () { var self = this; // cc.log(this.i++); // by tanp 让回车滑的更加正常,所以把阻力系数angleFx改为“math.abs(self.angleSpeed)*self.angleFx + .01”了。 // by tanp 让回车滑的更加顺畅,所以把阻力系数angleFx改回0.05了。 var angleFx = Math.abs(self.angleSpeed) * self.angleFx + 0.01; //阻力=速度*阻力系数*方向 var angleF = (Math.abs(self.angleSpeed) * angleFx) * self.direction; //更新速度 self.angleSpeed = self.angleSpeed - angleF; //更新角度 // cc.log('angleFx:' + angleFx + ' angleF:' + angleF + ' angleSpeed:' + self.angleSpeed); self.selecNode.rotation = self.beRotation - self.angleSpeed * self.Speed; self.beRotation = self.beRotation - self.angleSpeed * self.Speed; if (Math.abs(self.angleSpeed) < self.speedMin || self.beRotation > self.angleMin || self.beRotation < self.angleMax) { self.selecNode.stopAction(self.guanxing) // self.guanxing = null; self.trainBack(); } }});
1 0
- Cocos Creator 实现摩天轮效果
- cocos Creator拖动效果
- cocos creator
- cocos Creator
- Cocos Creator 实现js调用object-c
- Cocos Creator实现的《点我+1》
- 摩天轮
- 摩天轮
- cocos creator: js中实现protobuf的打包和解析
- Cocos Creator 实现按钮图标的流光特效(Shader)
- cocos creator(十三)android平台返回键的监听实现
- cocos creator发布
- Cocos Creator问题汇总
- cocos creator shader用法
- Cocos Creator常见问题汇总
- Cocos Creator 介绍
- Cocos Creator 控制面板
- Cocos Creator 点击事件
- Ionic简单开始
- JS实现点击按钮,下载文件
- 升级迁移案例分享
- LeetCode刷题(C++)——Minimum Path Sum(Medium)
- 发布App 安卓
- Cocos Creator 实现摩天轮效果
- 补作业3
- mergeTwoList
- 在西安,程序员的平均薪资是多少?同职场经验的不同职位薪资差距到底有多大?
- NSRunLoopCommonModes和Timer
- TortoiseGit 代码回退版本
- 微信小程序引入weui组件
- 利用wsdl2java生成本地WebService客户端
- Linux下的SVN服务器搭建(亲测可行)