293 lines
8.1 KiB
TypeScript
293 lines
8.1 KiB
TypeScript
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;
|
||
}
|