139 lines
4.2 KiB
TypeScript
139 lines
4.2 KiB
TypeScript
import { _decorator, BlockInputEvents, Component, easing, Label, Node, Slider, tween, UITransform, v3 } from 'cc';
|
|
import { GameDataManager } from '../../../Loading/scripts/manager/GameDataManager';
|
|
import { NodePoolManager } from '../../../Loading/scripts/manager/NodePoolManager';
|
|
import { AudioManager } from '../../../Loading/scripts/manager/AudioManager';
|
|
let { ccclass, property } = _decorator;
|
|
|
|
@ccclass('AutoSpinPanel')
|
|
export class AutoSpinPanel extends Component {
|
|
|
|
@property(Slider)
|
|
private autoSlider: Slider = null;
|
|
|
|
@property(Label)
|
|
private autoCountLabel: Label = null;
|
|
|
|
@property(Node)
|
|
private mainNode: Node = null;
|
|
|
|
@property(Node)
|
|
private barFill: Node = null;
|
|
|
|
private countArr: number[] = [10, 20, 30, 50, 70, 100, 500, 1000];
|
|
private isDragging: boolean = false;
|
|
private curIndex: number = 0;
|
|
|
|
private closeCallback: Function = null;
|
|
|
|
protected onLoad(): void {
|
|
this.updateSliderAndLabel(0);
|
|
this.setCount(100);
|
|
|
|
this.autoSlider.node.on('slide', this.onSliderChange, this);
|
|
}
|
|
|
|
showTween() {
|
|
this.mainNode.active = false;
|
|
this.mainNode.setScale(v3(0, 0, 0));
|
|
this.node.getComponent(BlockInputEvents).enabled = true;
|
|
this.mainNode.active = true;
|
|
tween(this.mainNode)
|
|
.to(0.3, { scale: v3(1, 1, 1) }, { easing: easing.backOut })
|
|
.call(() => {
|
|
this.node.getComponent(BlockInputEvents).enabled = false;
|
|
})
|
|
.start();
|
|
}
|
|
|
|
|
|
|
|
setCloseCallback(callback: Function) {
|
|
this.closeCallback = callback;
|
|
}
|
|
|
|
onSliderChange() {
|
|
this.isDragging = true;
|
|
let progress = this.autoSlider.progress;
|
|
|
|
// 计算最近的档位
|
|
let totalSteps = this.countArr.length - 1;
|
|
let targetIndex = Math.round(progress * totalSteps);
|
|
// 立即更新滑动条位置到目标档位
|
|
let targetProgress = targetIndex / totalSteps;
|
|
this.autoSlider.progress = targetProgress;
|
|
if (targetIndex !== this.curIndex) {
|
|
this.curIndex = targetIndex;
|
|
// 立即更新滑动条位置到目标档位
|
|
let targetProgress = targetIndex / totalSteps;
|
|
this.autoSlider.progress = targetProgress;
|
|
this.updateBarFill(targetProgress);
|
|
this.updateLabel(targetIndex);
|
|
}
|
|
}
|
|
updateBarFill(progress: number) {
|
|
if (this.barFill) {
|
|
// 获取 UITransform 组件
|
|
const transform = this.barFill.getComponent(UITransform);
|
|
if (transform) {
|
|
// 获取原始宽度(可以在 onLoad 中缓存)
|
|
const maxWidth = this.autoSlider.node.getComponent(UITransform).width;
|
|
// 更新填充条宽度
|
|
transform.width = maxWidth * progress;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
updateSliderAndLabel(index: number) {
|
|
// 直接更新滑动条位置
|
|
let totalSteps = this.countArr.length - 1;
|
|
let progress = index / totalSteps;
|
|
this.autoSlider.progress = progress;
|
|
|
|
// 更新显示的值
|
|
this.updateBarFill(progress);
|
|
this.updateLabel(index);
|
|
this.curIndex = index;
|
|
}
|
|
|
|
updateLabel(index: number) {
|
|
// 确保索引在有效范围内
|
|
index = Math.min(Math.max(index, 0), this.countArr.length - 1);
|
|
|
|
// 更新显示的值
|
|
let value = this.countArr[index];
|
|
if (this.autoCountLabel) {
|
|
this.autoCountLabel.string = value.toString();
|
|
}
|
|
}
|
|
|
|
onBtnStartAutoSpin() {
|
|
GameDataManager.instance.autoCount = this.countArr[this.curIndex]
|
|
if (this.closeCallback) {
|
|
this.closeCallback();
|
|
}
|
|
|
|
this.close();
|
|
}
|
|
|
|
setCount(count: number) {
|
|
let index = this.countArr.findIndex((v, i) => {
|
|
if (i === this.countArr.length - 1) return true;
|
|
return count <= v;
|
|
});
|
|
|
|
this.updateSliderAndLabel(index);
|
|
}
|
|
|
|
close() {
|
|
AudioManager.instance.playSFX('Common_Button_Click');
|
|
NodePoolManager.instance.putNodeToPool("AutoSpinPanel", this.node);
|
|
}
|
|
|
|
onDestroy() {
|
|
// 清理事件监听
|
|
this.autoSlider.node.off('slide', this.onSliderChange, this);
|
|
}
|
|
}
|
|
|