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