AI也能写游戏啦,用ChatGPT生成cocos creator代码,编写回合制文字rpg游戏(六)

429 阅读2分钟

上一篇

AI也能写游戏啦,用ChatGPT生成cocos creator代码,编写回合制文字rpg游戏(五) - 掘金 (juejin.cn)

这节就来写技能系统了,依旧向AI求助

image.png

    // 技能数据类型
    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} 无效`);
        }
    }

image.png


// 技能数据类型
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界面

image.png

// 定义技能按钮列表
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} 秒`);
                        // 在这里实现中
                    }
                }
            }
        }
    }
}

预览下效果

7.gif

接着实现技能的buff效果

image.png

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的扣血效果

8.gif