教你使用单脚本制作打怪游戏

口袋方舟论坛上有很多很牛的单脚本,而且都特别通用。今天我们要聊的是,怎么把这些脚本集合起来,搭建出一个属于你自己的游戏框架。
这篇文章的主旨是教你如何构建一个数值模拟的核心框架,让你更容易做出数值模拟游戏。我们会用到一些工具,比如[怪物编辑器][动效编辑器],还有[血条系统]。这些系统的基本用法就不多说了,咱们主要关注它们的“高级玩法”。

详细说明

1. 装上怪物和玩家的“血条”
血条系统默认给玩家已经装备好了血条。所以我们的任务是给怪物也来一个。怪物默认是没血条的,但是它们会触发怪物生成的事件。所以,我们只需要监听这个事件,然后给生成的怪物加上血条就行了。代码?嗯,就几行搞定:

//怪物生成事件
MobsDef.onBorn.add((EnemyEntityCom) => {
    //异步获取怪物的配置
    MobsDef.getCfgAsync(EnemyEntityCom.cfgId).then((value) => {
        //调用血条系统的方法给怪物添加上血条
        MyClearHP.addMyClearHPForChar(EnemyEntityCom.char, { charName: value.backdes, curHP: value.Hp, maxHP: value.Hp });
    });
});
TypeScript
复制

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);
});
TypeScript
复制
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);
    }
});
TypeScript
复制


怪物受到伤害是实现了,但我们还看不到怪物当前的血量。这是因为我们还没联动到血条系统。通过监听怪物受伤的事件,我们可以更改怪物的血量。

// 怪物受到伤害事件
MobsDef.onTakeDamage.add((EnemyEntityCom, attackerPlayerId, damage) => {
    const player = Player.getPlayer(attackerPlayerId);
    //调用血条系统更改怪物的血量
    MyClearHP.ServerChangeCharCurHP(player.userId, EnemyEntityCom.char.gameObjectId, -damage);
});
TypeScript
复制


其他功能
至此,我们已经完成了最核心的打怪功能。你还可以继续扩展和完善你的游戏框架。比如,监听怪物死亡的事件,让怪物死亡时掉落一些东西给玩家,增加一些正反馈。还有很多其他的扩展,期待大家一起来搞事情!

 

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值