Files
CocosCreatorTutorial/RollingNumber/assets/script/RollingNumber.js
2020-03-26 18:35:00 +08:00

198 lines
4.0 KiB
JavaScript

cc.Class({
extends: cc.Component,
properties: {
startSpeed: 10,
finallySpeed: 3,
frameSpeedOffset: 0.05,
lap: 2,
finallyNumber: 2,
offset: cc.Vec2,
prefab: cc.Prefab,
spriteFrames: [cc.SpriteFrame]
},
onLoad() {
this.isOver = true;
},
registerEvent() {
},
init(data) {
this.time = 0;
this.curIndex = 0;
this.isOver = false;
this.speed = this.startSpeed;
this.finallyNumber = data * 1;
this.initRollNumbers(this.lap, this.finallyNumber);
this.onRemoveItem();
this.initItme();
for (let i = 0; i < this.items.length; i++) {
let item = this.items[i];
this.onSwithSpriteFrame(item, this.getCurIndex());
}
},
initRollNumbers(lap, finallyNumber) {
this.rollNumbers = [];
let i = 0, rollNumbersTemp = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for (i = 0; i < lap; i++) {
this.rollNumbers = this.rollNumbers.concat(rollNumbersTemp);
}
for (i = 0; i <= finallyNumber; i++) {
this.rollNumbers.push(i);
}
this.rollNumbers.push((finallyNumber + 1) % 10);
this.rollNumbers.push((finallyNumber + 2) % 10);
},
initItme() {
let len = 3, height;
this.items = [];
let node = cc.instantiate(this.prefab);
height = node.height + this.offset.y;
this.endPos = cc.v2(0, -height);
this.startPos = cc.v2(0, height * 2);
this.node.addChild(node);
this.items.push(node);
for (let i = 1; i < len; i++) {
let node = cc.instantiate(this.prefab);
node.y = height * i;
this.items.push(node);
this.node.addChild(node);
}
},
onRemoveItem() {
let len = this.node.children.length;
for (let i = 0; i < len; i++) {
let item = this.node.children[i];
item.destroy();
}
},
getCurIndex() {
return this.rollNumbers[this.curIndex++];
},
onMoveItem(node, y) {
node && (node.y += y);
},
onCheckBorder(node, borderPos) {
if (node.y < borderPos.y) {
return true;
} else {
return false;
}
},
setStartPos(node, startPos, borderPos) {
let offset = node.y - borderPos.y;
node.y = startPos.y + offset;
},
resetLocation() {
let zeroNode = this.getNearZeroNode(this.items);
let offset = 0 - zeroNode.y;
let v2 = cc.v2(0, offset);
for (let i = 0; i < this.items.length; i++) {
let item = this.items[i];
item.runAction(cc.moveBy(0.2, v2));
}
},
getNearZeroNode(items) {
let result = items[0];
for (let i = 1; i < items.length; i++) {
let item = items[i];
if (item.y < result.y) {
result = item;
}
}
return result;
},
onSwithSpriteFrame(node, index) {
let sprite = node.getComponent(cc.Sprite);
sprite.spriteFrame = this.spriteFrames[index];
},
setSpeed() {
if (this.speed > this.finallySpeed) {
this.speed -= this.frameSpeedOffset;
}
},
onCheckRollingOver() {
if (this.speed == 0) {
if (this.isOver == false) {
console.log('time=', this.time);
this.resetLocation();
}
this.isOver = true;
return;
}
},
judgeRollingOver() {
if (this.curIndex == this.rollNumbers.length) {
this.speed = 0;
}
},
update(dt) {
this.time += dt;
if (this.isOver) {
return;
}
this.setSpeed();
this.onCheckRollingOver();
let i = 0;
//移动
for (i = 0; i < this.items.length; i++) {
let item = this.items[i];
this.onMoveItem(item, -this.speed);
}
//是否过界
for (i = 0; i < this.items.length; i++) {
let item = this.items[i];
let isBorder = this.onCheckBorder(item, this.endPos);
if (isBorder) {
this.setStartPos(item, this.startPos, this.endPos);
let index = this.getCurIndex();
this.onSwithSpriteFrame(item, index);
//是否结束
this.judgeRollingOver();
}
}
},
onEnable() {
this.registerEvent();
},
onDisable() {
this.offEvent();
this.onRemoveItem();
this.isOver = true;
},
offEvent() {
cc.emitter.offThis(this);
},
onDestroy() {
}
});