上一篇
AI也能写游戏啦,用ChatGPT生成cocos creator代码,编写回合制文字rpg游戏(五) - 掘金 (juejin.cn)
这节就来写技能系统了,依旧向AI求助
// 技能数据类型
interface Skill {
id: number; // 技能ID
name: string; // 技能名称
damage: number; // 技能伤害
cooldown: number; // 技能冷却时间
}
// 技能列表
const skillList: Skill[] = [
{ id: 1, name: "普通攻击", damage: 10, cooldown: 0 },
{ id: 2, name: "重击", damage: 20, cooldown: 3 },
{ id: 3, name: "旋风斩", damage: 30, cooldown: 5 },
// 可以根据游戏需求,添加更多的技能数据
];
// 玩家使用技能
function useSkill(skillId: number) {
const skill = skillList.find(skill => skill.id === skillId); // 根据技能ID查找技能数据
if (skill) {
if (skill.cooldown === 0) {
// 执行技能逻辑,例如计算伤害、播放动画等
cc.log(`使用了技能:${skill.name},造成了 ${skill.damage} 点伤害`);
skill.cooldown = skillList.find(skill => skill.id === skillId).cooldown; // 设置技能冷却时间
} else {
cc.log(`技能 ${skill.name} 冷却中,还需等待 ${skill.cooldown} 秒`);
}
} else {
cc.log(`技能ID ${skillId} 无效`);
}
}
// 技能数据类型
interface Skill {
id: number; // 技能ID
name: string; // 技能名称
damage: number; // 技能伤害
cooldown: number; // 技能冷却时间
buffs?: Buff[]; // 技能BUFF效果
}
// BUFF效果数据类型
interface Buff {
type: string; // BUFF类型
duration: number; // BUFF持续时间
effect: number; // BUFF效果值
}
// 技能列表
const skillList: Skill[] = [
{
id: 1,
name: "普通攻击",
damage: 10,
cooldown: 0
},
{
id: 2,
name: "重击",
damage: 20,
cooldown: 3,
buffs: [
{ type: "bleed", duration: 5, effect: 2 } // 重击技能附带流血效果,每秒造成2点额外伤害,持续5秒
]
},
{
id: 3,
name: "旋风斩",
damage: 30,
cooldown: 5,
buffs: [
{ type: "poison", duration: 3, effect: 5 } // 旋风斩技能附带中毒效果,每秒造成5点额外伤害,持续3秒
]
},
// 可以根据游戏需求,添加更多的技能数据
];
数据设计好了,继续让AI写UI界面
// 定义技能按钮列表
const skillList: string[] = ['技能1', '技能2', '技能3'];
//这里的技能列表自行替换成前面生成的技能
// 在战斗界面添加技能按钮列表
for (let i = 0; i < skillList.length; i++) {
const skillBtn = new cc.Button(); // 创建按钮
skillBtn.node.name = `SkillBtn${i+1}`; // 设置按钮名字
skillBtn.node.addComponent(cc.Label).string = skillList[i]; // 设置按钮文字
let id = skillList[i].id;
skillBtn.node.on(cc.Node.EventType.TOUCH_END, () => {
// 按钮点击事件回调,释放对应的技能
const skillName = skillBtn.node.getComponent(cc.Label).string;
console.log(`释放技能:${skillName}`);
this.useSkill(id);
// 在这里调用相应的技能释放逻辑
});
// 添加按钮到战斗界面的节点下
// 这里假设战斗界面的节点名称为 battleUI,你需要根据你的实际项目中的节点结构进行调整
cc.find('battleUI').addChild(skillBtn.node);
}
// 玩家使用技能
useSkill(skillId: number) {
const skill = skillList.find(skill => skill.id === skillId); // 根据技能ID查找技能数据
if (skill) {
if (skill.cooldown === 0) {
// 执行技能逻辑,例如计算伤害、播放动画等
cc.log(`使用了技能:${skill.name},造成了 ${skill.damage} 点伤害`);
// 处理技能附带的BUFF效果
if (skill.buffs) {
for (const buff of skill.buffs) {
// 处理流血效果
if (buff.type === "bleed") {
cc.log(`目标中了流血效果,每秒受到 ${buff.effect} 点额外伤害,持续 ${buff.duration} 秒`);
// 在这里实现流血效果的逻辑,例如给目标添加一个持续伤害的状态,持续指定的时间
}
// 处理中毒效果
else if (buff.type === "poison") {
cc.log(`目标中了中毒效果,每秒受到 ${buff.effect} 点额外伤害,持续 ${buff.duration} 秒`);
// 在这里实现中
}
}
}
}
}
}
预览下效果
接着实现技能的buff效果
enum BuffType {
Bleed = 'Bleed', // 流血
Poison = 'Poison', // 中毒
Burn = 'Burn', // 灼烧
// 可以继续添加其他类型的 buff
}
class Buff {
public type: BuffType;
public duration: number;
public damage: number;
constructor(type: BuffType, duration: number, damage: number) {
this.type = type;
this.duration = duration;
this.damage = damage;
}
}
class BuffManager {
private static instance: BuffManager;
private buffList: Buff[];
private constructor() {
this.buffList = [];
}
public static getInstance(): BuffManager {
if (!BuffManager.instance) {
BuffManager.instance = new BuffManager();
}
return BuffManager.instance;
}
public addBuff(type: BuffType, duration: number, damage: number): void {
const buff = new Buff(type, duration, damage);
this.buffList.push(buff);
// 在这里根据 buff 类型和效果进行相应的处理逻辑
switch (buff.type) {
case BuffType.Bleed:
// 处理流血效果
break;
case BuffType.Poison:
// 处理中毒效果
break;
case BuffType.Burn:
// 处理灼烧效果
break;
// 可以添加其他类型的 buff 处理逻辑
}
}
public update(dt: number): void {
// 更新 buff 的持续时间
for (let i = this.buffList.length - 1; i >= 0; i--) {
const buff = this.buffList[i];
buff.duration -= dt;
if (buff.duration <= 0) {
// 如果 buff 持续时间结束,从列表中移除该 buff
this.buffList.splice(i, 1);
// 在这里根据 buff 类型进行相应的结束处理逻辑
switch (buff.type) {
case BuffType.Bleed:
// 结束流血效果
break;
case BuffType.Poison:
// 结束中毒效果
break;
case BuffType.Burn:
// 结束灼烧效果
break;
// 可以添加其他类型的 buff 结束处理逻辑
}
}
}
}
}
在使用技能前加个启动buff效果的代码
Battle.ts
添加2个buff管理器来管理buff
playerBuffManager:BuffManager;
enemyBuffManager:BuffManager;
updateBuff(){
cc.log("启用buff")
this.playerBuffManager.updateTurn();
this.enemyBuffManager.updateTurn();
}
Buff管理器update时,执行扣血
DataManager.getInstance().changeEnemyHealth(-buff.damage);
最终效果,在第二次回合开始时,成功激活了流血buff的扣血效果