简介
现在论坛上有很多很牛的单脚本,而且都特别通用。今天我们要聊的是,怎么把这些脚本集合起来,搭建出一个属于你自己的游戏框架。
这篇文章的主旨是教你如何构建一个数值模拟的核心框架,让你更容易做出数值模拟游戏。我们会用到一些工具,比如[怪物编辑器]、[动效编辑器]、[属性管理器],还有[血条系统]。这些系统的基本用法就不多说了,咱们主要关注它们的“高级玩法”。
详细说明
1. 装上怪物和玩家的“血条”
血条系统默认给玩家已经装备好了血条。所以我们的任务是给怪物也来一个。怪物默认是没血条的,但是它们会触发怪物生成的事件。所以,我们只需要监听这个事件,然后给生成的怪物加上血条就行了。代码?嗯,就几行搞定:
//怪物生成事件
MobsDef.onBorn.add((EnemyEntityCom) => {
//异步获取怪物的配置
MobsDef.getCfgAsync(EnemyEntityCom.cfgId).then((value) => {
//调用血条系统的方法给怪物添加上血条
MyClearHP.addMyClearHPForChar(EnemyEntityCom.char, { charName: value.backdes, curHP: value.Hp, maxHP: value.Hp });
});
});
2.怪物死亡时掉落经验
由于怪物编辑器中的怪物使用的是对象池管理,所以我们在怪物死亡时还需要对血条进行处理,不然可能会导致性能问题。另外可以在此监听中添加怪物死亡后给予玩家的一些奖励。
// 怪物死亡事件
MyClearMobs.onDie.add((EnemyEntityCom, killerId) => {
//异步获取怪物的配置
MyClearMobs.getCfgAsync(EnemyEntityCom.cfgId).then((value) => {
const player = Player.getPlayer(killerId);
const cfg = JSON.parse(value.ExtraUserData);
//给击败该怪物的玩家增加经验值
if (cfg && player) {
MyClearAttrGo.setAttrValue("Exp",MyClearAttrGo.getAttrValue("Exp",player.userId)+cfg.Exp,player.userId);
}
//怪物死亡后清理掉其身上的血条
MyClearHP.removeMyClearHPForChar(EnemyEntityCom.char.gameObjectId);
});
});
3.怪物攻击玩家造成伤害
怪物现在还不能给玩家造成伤害,但这很简单,只需要监听怪物命中玩家的事件就可以了。下面就是几行代码的事,而且你还可以在这里定义怎样的伤害公式!
//攻击玩家事件
MobsDef.onHitPlayer_server.add((EnemyEntityCom, playerId, damage) => {
const player = Player.getPlayer(playerId);
//调用血条系统给被攻击的玩家执行扣血操作
MyClearHP.ServerChangeCharCurHP(EnemyEntityCom.char.gameObjectId, player.userId, -damage);
});
4.玩家攻击怪物造成伤害
当然啦,不能让怪物一直打玩家,玩家也要有反击的机会!动效编辑器提供了处理伤害的事件,该事件在判定盒判定成功后发送。我们可以监听这个事件来实现给怪物造成伤害的功能。
// 服务器上玩家对角色造成伤害事件
MyClearAct.ServerDamageChar.push((AttackerID: string, VictimID: string, damage: number) => {
//获取怪物配置信息
const obj = GameObject.findGameObjectById(VictimID);
const EnemyCom = MobsDef.tryGetEnemyCom(obj);
if (EnemyCom) {
//调用怪物系统中给怪物造成伤害的方法
MobsDef.tryHurtEnemy(obj, Player.getPlayer(AttackerID), damage);
}
});
怪物受到伤害是实现了,但我们还看不到怪物当前的血量。这是因为我们还没联动到血条系统。通过监听怪物受伤的事件,我们可以更改怪物的血量。
// 怪物受到伤害事件
MobsDef.onTakeDamage.add((EnemyEntityCom, attackerPlayerId, damage) => {
const player = Player.getPlayer(attackerPlayerId);
//调用血条系统更改怪物的血量
MyClearHP.ServerChangeCharCurHP(player.userId, EnemyEntityCom.char.gameObjectId, -damage);
});
其他功能
至此,我们已经完成了最核心的打怪功能。你还可以继续扩展和完善你的游戏框架。比如,监听怪物死亡的事件,让怪物死亡时掉落一些东西给玩家,增加一些正反馈。还有很多其他的扩展,期待大家一起来搞事情!
工程下载
我制作了一个小 demo,已经把上述功能都实现了。大家可以直接下载这个 demo 进行游戏扩展。欢迎大家后续来交作业,看看你们能做出一个什么样的游戏。
打怪demo.zip
(329.06 KB, 下载次数: 207)
|