lawless/client/assets/scripts/ui/screens/CombatScreen.ts

249 行
8.8 KiB
TypeScript

import { _decorator, Component, Node, Label, Sprite, Color, UITransform, Size, Layout, ScrollView } from 'cc';
import { UITheme } from '../common/UITheme';
import { UIBase } from '../common/UIBase';
const { ccclass, property } = _decorator;
/**
*
* ATB即时制战斗 +
* +
*
* +
*/
@ccclass('CombatScreen')
export class CombatScreen extends UIBase {
@property(Node) combatHeader: Node = null!;
@property(Node) characterDisplay: Node = null!;
@property(Node) battleLog: Node = null!;
@property(Node) combatFooter: Node = null!;
start() {
this.initCombatHeader();
this.initCharacterDisplay();
this.initBattleLog();
this.initCombatFooter();
}
/**
*
* + +
*/
private initCombatHeader() {
if (!this.combatHeader) return;
const transform = this.combatHeader.getComponent(UITransform) || this.combatHeader.addComponent(UITransform);
transform.setContentSize(new Size(720, 120));
// 讨伐提示
const tipNode = new Node('Tip');
const tipLabel = tipNode.addComponent(Label);
tipLabel.string = '正在讨伐';
tipLabel.fontSize = UITheme.FONT_SIZE.MD;
tipLabel.color = this.hexToColor(UITheme.COLORS.TEXT_NORMAL);
tipNode.setParent(this.combatHeader);
// 目标名称
const targetNode = new Node('Target');
const targetLabel = targetNode.addComponent(Label);
targetLabel.string = '胡威';
targetLabel.fontSize = UITheme.FONT_SIZE.LG;
targetLabel.color = this.hexToColor(UITheme.COLORS.TEXT_RED);
targetNode.setParent(this.combatHeader);
// 目标血条
const hpBar = this.createBar(this.combatHeader, {
width: 500, height: 20,
fillColor: UITheme.COLORS.HP_BAR,
bgColor: UITheme.COLORS.HP_BAR_BG,
value: 85,
maxValue: 100,
});
// 剩余血量
const hpLabel = new Node('HP');
const hp = hpLabel.addComponent(Label);
hp.string = 'x997';
hp.fontSize = UITheme.FONT_SIZE.SM;
hp.color = this.hexToColor(UITheme.COLORS.TEXT_RED);
hpLabel.setParent(this.combatHeader);
}
/**
*
* +
*/
private initCharacterDisplay() {
if (!this.characterDisplay) return;
const transform = this.characterDisplay.getComponent(UITransform) || this.characterDisplay.addComponent(UITransform);
transform.setContentSize(new Size(720, 300));
// 己方角色
const playerNode = new Node('Player');
const playerTransform = playerNode.addComponent(UITransform);
playerTransform.setContentSize(new Size(200, 280));
playerNode.setParent(this.characterDisplay);
// 己方头像
const playerAvatar = new Node('Avatar');
const playerAvatarLabel = playerAvatar.addComponent(Label);
playerAvatarLabel.string = '🧙';
playerAvatarLabel.fontSize = 80;
playerAvatar.setParent(playerNode);
// 己方名称
const playerName = new Node('Name');
const playerNameLabel = playerName.addComponent(Label);
playerNameLabel.string = '角色名';
playerNameLabel.fontSize = UITheme.FONT_SIZE.SM;
playerNameLabel.color = this.hexToColor(UITheme.COLORS.TEXT_GREEN);
playerName.setParent(playerNode);
// 己方血条
const playerHp = this.createBar(playerNode, {
width: 180, height: 16,
fillColor: UITheme.COLORS.HP_BAR,
bgColor: UITheme.COLORS.HP_BAR_BG,
value: 70,
maxValue: 100,
});
// 敌方角色
const enemyNode = new Node('Enemy');
const enemyTransform = enemyNode.addComponent(UITransform);
enemyTransform.setContentSize(new Size(200, 280));
enemyNode.setParent(this.characterDisplay);
// 敌方头像
const enemyAvatar = new Node('Avatar');
const enemyAvatarLabel = enemyAvatar.addComponent(Label);
enemyAvatarLabel.string = '👹';
enemyAvatarLabel.fontSize = 80;
enemyAvatar.setParent(enemyNode);
// 敌方名称
const enemyName = new Node('Name');
const enemyNameLabel = enemyName.addComponent(Label);
enemyNameLabel.string = '胡威';
enemyNameLabel.fontSize = UITheme.FONT_SIZE.SM;
enemyNameLabel.color = this.hexToColor(UITheme.COLORS.TEXT_RED);
enemyName.setParent(enemyNode);
// 敌方血条
const enemyHp = this.createBar(enemyNode, {
width: 180, height: 16,
fillColor: UITheme.COLORS.HP_BAR,
bgColor: UITheme.COLORS.HP_BAR_BG,
value: 85,
maxValue: 100,
});
// 战斗技能展示
const skillNode = new Node('Skill');
const skillLabel = skillNode.addComponent(Label);
skillLabel.string = '蛟龙游离剑';
skillLabel.fontSize = UITheme.FONT_SIZE.MD;
skillLabel.color = this.hexToColor(UITheme.COLORS.TEXT_BLUE);
skillNode.setParent(this.characterDisplay);
}
/**
*
*
*/
private initBattleLog() {
if (!this.battleLog) return;
const transform = this.battleLog.getComponent(UITransform) || this.battleLog.addComponent(UITransform);
transform.setContentSize(new Size(720, 400));
// 战报内容
const logContent = new Node('LogContent');
const logLabel = logContent.addComponent(Label);
logLabel.string = `【第1回合】
仿312057
使2
51953
2
使155730
使`;
logLabel.fontSize = UITheme.FONT_SIZE.SM;
logLabel.color = this.hexToColor(UITheme.COLORS.TEXT_NORMAL);
logLabel.overflow = Label.Overflow.CLAMP;
logLabel.lineHeight = 28;
logContent.setParent(this.battleLog);
// 战斗事件高亮
const eventNode = new Node('Event');
const eventLabel = eventNode.addComponent(Label);
eventLabel.string = '【第4回合】';
eventLabel.fontSize = UITheme.FONT_SIZE.MD;
eventLabel.color = this.hexToColor(UITheme.COLORS.TEXT_GOLD);
eventNode.setParent(this.battleLog);
}
/**
*
*
*/
private initCombatFooter() {
if (!this.combatFooter) return;
const transform = this.combatFooter.getComponent(UITransform) || this.combatFooter.addComponent(UITransform);
transform.setContentSize(new Size(720, 80));
const endBtn = this.createButton(this.combatFooter, '结束战斗', {
width: 200, height: 50,
bgColor: UITheme.COLORS.BG_CARD,
textColor: UITheme.COLORS.TEXT_GOLD,
});
}
/**
*
*/
addLogEntry(text: string, type: 'normal' | 'damage' | 'heal' | 'skill' | 'event' = 'normal') {
if (!this.battleLog) return;
const colorMap = {
normal: UITheme.COLORS.TEXT_NORMAL,
damage: UITheme.COLORS.TEXT_RED,
heal: UITheme.COLORS.TEXT_GREEN,
skill: UITheme.COLORS.TEXT_BLUE,
event: UITheme.COLORS.TEXT_GOLD,
};
const entryNode = new Node('LogEntry');
const label = entryNode.addComponent(Label);
label.string = text;
label.fontSize = UITheme.FONT_SIZE.SM;
label.color = this.hexToColor(colorMap[type]);
label.lineHeight = 28;
entryNode.setParent(this.battleLog);
}
/**
*
*/
updateEnemyHP(current: number, max: number) {
// 实现血条动画更新
}
/**
*
*/
showDamageNumber(value: number, isCrit: boolean = false) {
const node = new Node('Damage');
const label = node.addComponent(Label);
label.string = `-${value}`;
label.fontSize = isCrit ? UITheme.FONT_SIZE.XL : UITheme.FONT_SIZE.LG;
label.color = isCrit
? this.hexToColor(UITheme.COLORS.TEXT_ORANGE)
: this.hexToColor(UITheme.COLORS.TEXT_RED);
node.setParent(this.characterDisplay);
}
}