上一篇
AI也能写游戏啦,用ChatGPT生成cocos creator代码,编写回合制文字rpg游戏(三) - 掘金 (juejin.cn)
这一节,我要来处理怪物掉落物的部分
首先,让AI帮我们设计下怪物的掉落物
生成的json小小排版了一下,如下
export let Monster = [
{
"id": 1,
"name": "史莱姆",
"type": "普通",
"abilities": [
{
"name": "普通攻击",
"damage": 10
},
{
"name": "弹射攻击",
"damage": 15
}
],
"drops": [
{
"id":1,
"type": "道具",
"name": "草药",
"chance": 0.5
},
{
"id":2,
"type": "装备",
"name": "铁剑",
"chance": 0.2
}
]
},
{
"id": 2,
"name": "骷髅兵",
"type": "普通",
"abilities": [
{
"name": "普通攻击",
"damage": 20
},
{
"name": "盾击",
"damage": 15,
"defense": 5
}
],
"drops": [
{
"id":3,
"type": "道具",
"name": "解毒草",
"chance": 0.3
},
{
"id":4,
"type": "装备",
"name": "铁盾",
"chance": 0.1
}
]
}
,{
"id": 3,
"name": "火焰巨人",
"type": "火焰",
"abilities": [
{
"name": "火焰喷射",
"damage": 30
},
{
"name": "烈焰陷阱",
"damage": 20,
"dot": {
"damage": 5,
"turns": 3
}
}
],
"drops": [
{
"id":5,
"type": "道具",
"name": "火之石",
"chance": 0.2
},
{
"id":6,
"type": "装备",
"name": "火焰护腕",
"chance": 0.1
}
]
},
{
"id": 4,
"name": "风暴元素",
"type": "风暴",
"abilities": [
{
"name": "风刃斩",
"damage": 25
},
{
"name": "狂风暴雨",
"damage": 20,
"dot": {
"damage": 10,
"turns": 2
}
}
],
"drops": [
{
"id":7,
"type": "道具",
"name": "风之石",
"chance": 0.3
},
{
"id":8,
"type": "装备",
"name": "风暴长靴",
"chance": 0.1
}
]
}
]
注意到drops下的掉落物品有个change字段,就是它的掉落几率,我们需要一个脚本,根据掉落几率抽掉落物品。交给AI
代码
// DropItem.ts 掉落物品脚本
export default class DropItem {
private dropRates: { [itemId: number]: number } = {};
// 添加掉落物品的几率
public addDropRate(itemId: number, rate: number): void {
this.dropRates[itemId] = rate;
}
// 根据几率随机掉落物品
public getRandomItem(): number | null {
const totalRate = Object.values(this.dropRates).reduce((acc, rate) => acc + rate, 0);
const random = Math.random() * totalRate;
let accumulateRate = 0;
for (const itemId in this.dropRates) {
if (this.dropRates.hasOwnProperty(itemId)) {
accumulateRate += this.dropRates[itemId];
if (random <= accumulateRate) {
return parseInt(itemId);
}
}
}
return null;
}
}
代码
// 在游戏中使用 DropItem
const dropItem = new DropItem();
dropItem.addDropRate(1001, 0.2); // 物品ID为1001的掉落几率为20%
dropItem.addDropRate(1002, 0.5); // 物品ID为1002的掉落几率为50%
dropItem.addDropRate(1003, 0.3); // 物品ID为1003的掉落几率为30%
const randomItemId = dropItem.getRandomItem(); // 随机获取掉落的物品ID
if (randomItemId !== null) {
console.log("掉落了物品ID为:" + randomItemId);
} else {
console.log("没有掉落物品");
}
同时我自己整理了下UI生成的掉落物,得到一个物品列表
//道具列表
export let Item=[ {
"id":1,
"type": "道具",
"name": "草药",
},
{
"id":2,
"type": "装备",
"name": "铁剑",
},{
"id":3,
"type": "道具",
"name": "解毒草",
},
{
"id":4,
"type": "装备",
"name": "铁盾",
}, {
"id":5,
"type": "道具",
"name": "火之石",
},
{
"id":6,
"type": "装备",
"name": "火焰护腕",
} ,{
"id":7,
"type": "道具",
"name": "风之石",
},
{
"id":8,
"type": "装备",
"name": "风暴长靴",
}]
准备齐全,开始在结算面板接入掉落物
代码
// EndPanel.ts 结算界面脚本
const { ccclass, property } = cc._decorator;
@ccclass
export default class EndPanel extends cc.Component {
@property(cc.Node)
private itemList: cc.Node = null; // 用于显示掉落物品的列表节点
// 显示掉落物品
public showDroppedItems(itemIds: number[]): void {
// 清空列表
this.itemList.removeAllChildren();
// 遍历掉落物品ID,创建列表项
for (const itemId of itemIds) {
const itemNode = new cc.Node("Item"); // 创建列表项节点
const itemLabel = itemNode.addComponent(cc.Label); // 添加 Label 组件
itemLabel.string = "物品ID:" + itemId; // 设置 Label 文字
this.itemList.addChild(itemNode); // 添加到列表节点
}
}
}
把本次生成的代码粘贴进EndPanle.ts里 在UIManager里添加
@property(EndPanel)
public endPanelUI:EndPanel;
在Battle.ts胜利代码处加入
UIManager.getInstance().endPanelUI = endPanel.getComponent(EndPanel);
let monsterInfo = Monster.find(x=>x.id == this.monsterId)
let dropItemIds = []
// 在游戏中使用 DropItem
const dropItem = new DropItem();
for (let item of monsterInfo.drops){
dropItem.addDropRate(item.id, item.chance); // 物品ID为1001的掉落几率为20%
}
const randomItemId = dropItem.getRandomItem(); // 随机获取掉落的物品ID
if (randomItemId !== null) {
console.log("掉落了物品ID为:" + randomItemId);
dropItemIds.push(randomItemId)
} else {
console.log("没有掉落物品");
}
UIManager.getInstance().endPanelUI.showDroppedItems(dropItemIds);
测试下效果