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

293 lines
8.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}