games/FullFire/assets/scripts/common/ScollHelper.ts

148 lines
5.0 KiB
TypeScript

import RankingItem from "./scripts/RankingItem";
// Learn TypeScript:
// - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/typescript.html
// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/typescript.html
// Learn Attribute:
// - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/reference/attributes.html
// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
// - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/life-cycle-callbacks.html
// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/life-cycle-callbacks.html
const {ccclass, property} = cc._decorator;
@ccclass
export default class ScollHelper extends cc.Component {
@property(cc.ScrollView)
scollView: cc.ScrollView = null;
@property(cc.Node)
nodeItem: cc.Node = null;
@property(cc.Node)
nodeContent: cc.Node = null;
//初始item 的数量
initCount:number = 0;
//item 的最大数量
maxCount:number = 100;
//当前索引
curIndex:number = 0;
//偏移索引
offsetIndex:number = 0;
//上次的y的位置
lastPosY:number = 0;
refreshItemCallBack:Function;
start () { //初始显示的数量
console.log(this.nodeItem)
console.log(this.nodeContent)
// this.initItems(10,null);
}
initItems(count:number,callBack:Function){
this.refreshItemCallBack = callBack;
if(this.nodeContent.childrenCount == 0){
for (let index = 0; index < 8; index++) { // 60
let itemNode = cc.instantiate(this.nodeItem)
this.nodeContent.addChild(itemNode);
itemNode.position = new cc.Vec2(0,index*-88 - 5 - 44);
}
}
//隐藏所有
for (let index = 0; index < 8; index++) { // 60
this.nodeContent.children[index].position = new cc.Vec2(0,index*-88 - 5 - 44);
this.nodeContent.children[index].active = false
}
this.maxCount = count
if(count > 8){
count = 8
}
for (let index = 0; index < count; index++) { // 60
let itemNode:cc.Node = this.nodeContent.children[index];
this.initCount = index;
itemNode.active = true;
this.refreshItem(index,0,itemNode);
}
this.nodeContent.height = this.maxCount * 88;
this.lastPosY = this.nodeContent.position.y
this.offsetIndex = 0;
this.nodeContent.position = new cc.Vec2(0,308)
}
update (dt) {
let isUp = false;
if(this.lastPosY < this.nodeContent.position.y){ //上面
isUp = true;
}
if(this.nodeContent.position.y < 308){
this.scollView.stopAutoScroll();
this.nodeContent.position = new cc.Vec2(0,308)
}else if(this.nodeContent.position.y >= 308 + this.maxCount*88){
this.scollView.stopAutoScroll();
this.nodeContent.position = new cc.Vec2(0,308 + this.maxCount*88)
}
let index = Math.floor((this.nodeContent.position.y - 308)/88)
this.lastPosY = this.nodeContent.position.y;
if(index < 0 || index + this.initCount >= this.maxCount){
return;
}
let count = Math.abs(this.offsetIndex - index)
if(count > 0){
console.log(" index = " + index + " count = " + count + " this.offsetIndex = " + this.offsetIndex);
this.offsetIndex = index;
let tempNodeCount = this.nodeContent.childrenCount
for (let i = count; i > 0; i--) {
this.nodeContent.children.sort((a, b) => {
return b.position.y - a.position.y;
});
if(isUp){ //向上移动中
this.curIndex = index - i;
let tempNode1:cc.Node = this.nodeContent.children[0]
let tempNode2:cc.Node = this.nodeContent.children[tempNodeCount - 1];
tempNode1.position =new cc.Vec2(0,tempNode2.position.y - 88);
this.refreshItem(this.curIndex + this.initCount + 1 ,0,tempNode1);
}else{
this.curIndex = index + i;
let tempNode1:cc.Node = this.nodeContent.children[0]
let tempNode2:cc.Node = this.nodeContent.children[tempNodeCount - 1];
tempNode2.position =new cc.Vec2(0,tempNode1.position.y + 88);
this.refreshItem(this.curIndex - 1,0,tempNode2);
}
}
}
}
refreshItem(idx:number, objIdx:number, obj:cc.Node){
if(this.refreshItemCallBack != null){
this.refreshItemCallBack(idx,objIdx,obj);
}
/*
let item:RankingItem = obj.getComponent<RankingItem>(RankingItem);
item.textUserName.string = idx.toString()
*/
}
}