squidGame/tgx-games-client/assets/level2/Script/CircularButton.ts

293 lines
8.4 KiB
TypeScript
Raw Normal View History

2025-02-17 21:36:37 +08:00
import { _decorator, Component, ProgressBar, Sprite, Vec3, tween, Color, Animation, Label, Node, UITransform, director, assetManager } from 'cc';
import { tgxUIAlert } from '../../core_tgx/tgx';
import { AreanNetMgr } from '../../module_arean/scripts/AreanNetMgr';
const { ccclass, property } = _decorator;
@ccclass('CircularButton')
export class CircularButton extends Component {
@property({ type: ProgressBar })
progressBar: ProgressBar = null!; // 圆形进度条
@property({ type: Sprite })
buttonSprite: Sprite = null!; // 按钮精灵
@property({ type: Label })
text: Label = null!;
@property({ type: Node })
ropeNode: Node = null!;
@property({ type: Node })
bubble1: Node = null!;
@property({ type: Node })
bubble2: Node = null!;
@property({ type: Node })
winorlose: Node = null!;
@property({ type: Sprite })
red: Sprite = null!;
@property({ type: Sprite })
blue: Sprite = null!;
@property({ type: Label })
redScoreLabel: Label = null!;
@property({ type: Label })
blueScoreLabel: Label = null!;
hasClick: boolean = false;
canClick: boolean = false;
progressTime: number = 3; // 进度增长时长
resetDelay: number = 0.5; // 进度条归零延迟时间
turn: number = 0; //
redScore: number = 0;
blueScore: number = 0;
gameover:boolean = false;
private score: number = 0; // 积分
start() {
// 初始化按钮状态
this.setButtonDark();
// 开始进度条增长动画
this.startProgressAnimation();
}
onButtonClick() {
if (this.canClick && !this.hasClick) {
this.redScore += 2;
this.getComponent(Animation)?.play("redSuccess");
this.hasClick = true;
} else {
this.text.string = "别着急";
this.redScore -= 1;
}
}
changeGameScene()
{
director.loadScene("BallScene");
}
setButtonDark() {
// 将按钮设为变暗状态
this.buttonSprite.node.getComponent(Sprite)!.color = new Color(35, 35, 35);
this.text.string = "保持住";
}
setButtonLight() {
// 将按钮设为变亮状态
this.buttonSprite.node.getComponent(Sprite)!.color = new Color(255, 66, 66);
this.text.string = "用力拉";
}
refreshScore() {
tween(this.red.node.getComponent(UITransform))
.to(0.5, { width: this.redScore*4 })
.start();
tween(this.blue.node.getComponent(UITransform))
.to(0.5, { width: this.blueScore*4 })
.start();
this.redScoreLabel.string = this.redScore+"";
this.blueScoreLabel.string = this.blueScore+"";
const newPosition = new Vec3( this.ropeNode.position.x - this.score / 10, this.ropeNode.position.y, this.ropeNode.position.z);
tween(this.ropeNode)
.to(0.3, { position: newPosition })
.start();
if (this.ropeNode.position.x < -3.5) {
this.winorlose.active = true;
this.winorlose.getChildByName("Label")!.getComponent(Label)!.string = "己方获胜";
this.gameover = true;
this.switchScene();
}
else if (this.ropeNode.position.x > 3.5) {
this.winorlose.active = true;
this.winorlose.getChildByName("Label")!.getComponent(Label)!.string = "对手获胜";
this.gameover = true;
this.switchScene();
}
}
switchScene() {
console.log("switchScene");
tween(this.node).delay(5).call(() => {
var bundle = assetManager.getBundle('level3');
if(bundle){
director.loadScene("scene/BallScene");
}else{
assetManager.loadBundle("level3",()=>{
director.loadScene("scene/BallScene");
})
}
}).start();
}
onClickBtnQuit() {
tgxUIAlert.show(`是否确认退出 ? `, true).onClick(async b => {
if (b) {
AreanNetMgr.inst.sendMsg_exit();
}
});
}
startProgressAnimation() {
if(this.gameover) return;
this.setButtonDark();
this.progressBar.progress = 0;
this.newTurn();
// 开始新的动画
tween(this.progressBar)
.to(this.progressTime, { progress: 1 }) // 设置进度条的目标进度
.call(() => {
// 如果按钮变亮,重新设为变暗状态
this.setButtonLight();
this.hasClick = false;
this.progressBar.progress = 0;
this.canClick = true;
this.AiScoreChange();
// 等待一段时间后归零进度条
tween(this.progressBar)
.to(this.resetDelay, { progress: 1 }) // 设置进度条的目标进度
.call(() => {
this.canClick = false;
this.progressBar.progress = 0;
this.refreshScore();
this.startProgressAnimation();
})
.start();
})
.start();
}
newTurn() {
this.turn++;
this.progressTime = Math.max(1.5, 3 - this.turn * 0.1); // 进度增长时长
this.resetDelay = Math.max(0.2, 1 - this.turn * 0.03); // 进度条归零延迟时间
}
AiScoreChange() {
const textArray1 = [
"无力了,无法继续了...",
"没救了,我们...",
"完了,真的完了...",
"没指望了,无法挽回...",
"我还不想死啊!"
];
const textArray2 = [
"我们还有一线生机",
"要坚持到底",
"还有机会扭转局势",
"想想家人!不能轻言放弃!",
"不能放弃希望!"
];
const textArray3 = [
"感受到了吗,他们再颤抖",
"对手已经开始向我们投降的信号了",
"看来我们要开始准备庆祝胜利了",
];
let rndText1 = [""];
let rndText2 = [""];
let randomIndex = 0;
let rnd1 = getRandomNumber(Math.max(-2,4 - this.turn * 0.5), 4)
this.redScore += rnd1;
let rnd2 = getRandomNumber(Math.max(-2,5 - this.turn * 0.5), 5)
this.blueScore += rnd2;
this.score = this.redScore - this.blueScore;
let rndString = "";
let rnd = getRandomNumber(0, 1);
if(this.ropeNode.position.x < -2)
{
if(rnd==0)
{
rndText1=textArray3;
this.redScore += 1;
}
else
{
rndText2=textArray1;
this.blueScore -= 1;
}
}else if(this.ropeNode.position.x > 2)
{
if(rnd==0)
{
rndText2=textArray3;
this.blueScore += 1;
}
else
{
rndText1=textArray1;
this.redScore -= 1;
}
}
else if(this.ropeNode.position.x <= -0.5)
{
rndText2=textArray2;
this.blueScore += 1;
}
else if(this.ropeNode.position.x >= 0.5)
{
rndText1=textArray2;
this.redScore += 1;
}
randomIndex = Math.floor(Math.random() * rndText1.length);
rndString = rndText1[randomIndex];
this.bubble1.getComponent(Animation)?.play("bubble");
this.bubble1.getChildByName("Label")!.getComponent(Label)!.string = rndString;
randomIndex = Math.floor(Math.random() * rndText2.length);
rndString = rndText2[randomIndex];
this.bubble2.getComponent(Animation)?.play("bubble");
this.bubble2.getChildByName("Label")!.getComponent(Label)!.string = rndString;
}
}
function getRandomNumber(min: number, max: number) {
// 使用 Math.random() 生成0到1之间的随机数并将其映射到指定范围
return Math.floor(Math.random() * (max - min + 1)) + min;
}