饥荒Mod 开发(十):制作一把AOE武器

饥荒Mod 开发(九):物品栏排列
饥荒Mod 开发(十一):修改物品堆叠
前面的文章介绍了很多基础知识以及如何制作一个物品,这次制作一把武器,装备之后可以用来攻击怪物。

制作武器贴图和动画

1.1 制作贴图。

  • 先准备一张武器的贴图,png格式大小 64*64,32位图,放到images\inventoryimages 目录下 如果不知道如何制作可以参考 饥荒Mod 开发(三):资源工具使用
    在这里插入图片描述
  • 执行编译脚本:
#先cd 到 工具目录下,然后执行命令
.\autocompiler.exe "C:\WeGameApps\rail_apps\饥荒:单机版(2000013)\mods\pigpetfood"

在这里插入图片描述
执行完命令之后在相同目录下会生成两个文件,这两个文件就是贴图文件
在这里插入图片描述

1.2 制作动画

  • 下载一张高分辨率的图片,png 格式,32位图片,我下载了个128*128 像素的图片,将图片放在exported/lightsword/lightsword 目录下, 需要自己创建目录
    在这里插入图片描述

  • 打开Spriter.exe 工具,菜单新建工程,选择目录 mods\pigpetfood\exported\lightsword。然后从工程右上角拖入图片到画布中,然后保存工程到 lightsword.scml, 特别需要注意: 新建一个BUILD 动画,否则装备武器的时候不会有任何的显示。
    在这里插入图片描述

在这里插入图片描述

  • 编译脚本生成动画文件。脚本会自动编译动画并且拷贝到相应的目录里面,在制作贴图的时候也执行过一次编译脚本,其实只需要最后一次执行就可以了,为了演示这里就执行两次。
    在这里插入图片描述
    生成的动画文件被自动拷贝到anim目录下
    在这里插入图片描述

1.3 制作一个初始武器(“光剑”)物品

先参考之前的文章饥荒Mod 开发(四):制作一个物品,先制作一个简答的物品,暂时不具备攻击能力,只要能生成这个物品即可

  • 在scripts/prefabs 目录下创建一个 lightsword.lua 文件。用来创建预制物光剑

在这里插入图片描述

local assets=
{Asset("ANIM", "anim/lightsword.zip"), -- 加载动画资源Asset("ATLAS", "images/inventoryimages/lightsword.xml"), -- 加载图像资源
}local function fn(Sim)local inst = CreateEntity() -- 创建一个新的实体inst.entity:AddTransform() -- 添加变换组件inst.entity:AddAnimState() -- 添加动画状态组件MakeInventoryPhysics(inst) -- 为实体添加物理属性inst:AddComponent("inspectable") -- 添加可检查组件inst:AddComponent("inventoryitem") -- 添加库存物品组件--物品放在地上的时候播放idle 动画inst.AnimState:SetBank("lightsword") -- 设置动画库inst.AnimState:SetBuild("lightsword") -- 设置动画构建inst.AnimState:PlayAnimation("idle") -- 播放"idle"动画inst.components.inventoryitem.atlasname = "images/inventoryimages/lightsword.xml" -- 设置在物品栏的图像return inst -- 返回创建的实体
endreturn Prefab( "common/lightsword", fn, assets) -- 返回一个预制物品,这个预制物品使用了上面定义的
  • 在modmian.lua 中添加这个预制物
    在这里插入图片描述
--声明预制物
PrefabFiles = {"pigpetfood","lightsword"
}--添加光剑武器的描述
GLOBAL.STRINGS.NAMES.LIGHTSWORD = "光剑"
GLOBAL.STRINGS.CHARACTERS.GENERIC.DESCRIBE.LIGHTSWORD = "这是一把光剑"
GLOBAL.STRINGS.RECIPE_DESC.LIGHTSWORD = "可以发光的光剑"

1.4 测试物品

  • 进入游戏按下 ` 键盘,在ESC 的下面。 打开控制台输入 c_give(“lightsword”) 生成光剑物品看看是否显示正常。
    在这里插入图片描述
    在这里插入图片描述
    简单物品创建完成之后,接下来让他成为一把能攻击的武器。

成为有攻击力的武器

2.1 让武器能装备

在lightsword.lua 文件的fn 函数中添加可装备组件。这样鼠标悬浮上就会显示装备,右键点击就可以装备

--添加可装备组件inst:AddComponent("equippable") -- 添加可装备组件inst.components.equippable.equipslot = EQUIPSLOTS.HANDSinst.components.equippable:SetOnEquip(function(inst, owner) -- 设置装备时的回调函数owner.AnimState:OverrideSymbol("swap_object", "lightsword", "lightsword") -- 设置玩家的动画owner.AnimState:Show("ARM_carry") -- 显示玩家的手臂owner.AnimState:Hide("ARM_normal") -- 隐藏玩家的手臂end)inst.components.equippable:SetOnUnequip(function(inst, owner) -- 设置卸下时的回调函数owner.AnimState:Hide("ARM_carry") -- 隐藏玩家的手臂owner.AnimState:Show("ARM_normal") -- 显示玩家的手臂end)

在这里插入图片描述
右键装备之后,就可以看到手上持有武器了。
在这里插入图片描述

2.2 设置攻击力

此时装备的光剑并没有任务的作用,所以需要给武器增加攻击力,攻击范围等等

 --添加武器组件inst:AddComponent("weapon") -- 添加武器组件inst.components.weapon:SetDamage(1) -- 设置武器的伤害值inst.components.weapon.hitrange = 10 -- 设置武器的攻击范围

2.3 添加耐久度

武器每次攻击都会丢失耐久度,耐久度为0 就会报废掉。下面设置了100的耐久度,每次攻击默认会减少1.耐久为0的时候就会消失,也可以不设置耐久,这样武器可以一直使用

    -- 添加"finiteuses"组件,这个组件用于表示一个物品的耐久度inst:AddComponent("finiteuses")-- 设置物品的最大耐久度为100inst.components.finiteuses:SetMaxUses(100)-- 设置物品的当前耐久度为100inst.components.finiteuses:SetUses(100)-- 设置当耐久度用完时的回调函数-- 在这个例子中,当耐久度用完时,物品会被移除inst.components.finiteuses:SetOnFinished(function (inst)inst:Remove()end)

在这里插入图片描述

2.4 添加冰冻AOE 效果

如果有一堆怪物的武器可以触发群体攻击,并且冰冻怪物,触发AOE伤害

    inst.components.weapon:SetOnAttack(function (inst, attacker, target)-- 获取攻击目标的世界坐标local x, y, z = target.Transform:GetWorldPosition()-- 在攻击目标周围5个单位的范围内查找所有带有"monster"标签的实体local entities = TheSim:FindEntities(x, y, z, 5, {"monster"})-- 计算AOE伤害,等于武器的伤害的200%local damage = inst.components.weapon:GetDamage(attacker, target) * 2for _,obj in pairs(entities) do-- 触发"onareaattackother"事件,该事件在区域攻击其他实体时触发inst:PushEvent("onareaattackother", {target = obj, weapon = inst})-- 对除攻击目标外的其他实体造成AOE伤害if obj ~= target thenobj.components.combat:GetAttacked(inst, damage, inst)end-- 如果实体可以被冻结,则增加其冷度if obj.components.freezable thenobj.components.freezable:AddColdness(1)end-- 在实体位置生成随机特效local fxs = {"icespike_fx_1", "icespike_fx_2","icespike_fx_3","icespike_fx_4"}SpawnAt(GetRandomItem(fxs), obj)endend)

在这里插入图片描述

AOE带冰冻效果武器源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283132.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】梯度下降法:从底层手写实现线性回归

【机器学习】Building-Linear-Regression-from-Scratch 线性回归 Linear Regression0. 数据的导入与相关预处理0.工具函数1. 批量梯度下降法 Batch Gradient Descent2. 小批量梯度下降法 Mini Batch Gradient Descent(在批量方面进行了改进)3. 自适应梯度…

MATLAB图像处理技巧

MATLAB图片处理------动态绘图 1. 动态绘图2. XXXXX 1. 动态绘图 主要用到四个函数,分别为getframe、frame2im、rgb2ind以及imwrite: 1.getframe:获取当前绘图窗口的图片作为影片帧; 2.frame2im:从单个影片帧 F 返回索…

Eclipse 自动生成注解,如果是IDEA可以参考编译器自带模版进行修改

IDEA添加自动注解 左上角选择 File -> Settings -> Editor -> File and Code Templates&#xff1b; 1、添加class文件自动注解&#xff1a; ​/*** <b>Function: </b> todo* program: ${NAME}* Package: ${PACKAGE_NAME}* author: Jerry* date: ${YEA…

为什么在Android中需要Context?

介绍 在Android开发中&#xff0c;Context是一个非常重要的概念&#xff0c;但是很多开发者可能并不清楚它的真正含义以及为什么需要使用它。本文将详细介绍Context的概念&#xff0c;并解释为什么在Android应用中需要使用它。 Context的来源 Context的概念来源于Android框架…

FPGA设计与实战之时钟及时序简介1

文章目录 一、时钟定义二、基本时序三、总结一、时钟定义 我们目前设计的电路以同步时序电路为主,时钟做为电路工作的基准而显得非常重要。 简单的接口电路比如I2C、SPI等,复杂一点接口比如Ethernet的MII、GMII等接口,它们都有一个或多个时钟信号。 那么什么是时钟信号?它…

【JAVA-Day69】抛出异常的精髓:深度解析 throw、throws 关键字,优雅处理异常问题

抛出异常的精髓&#xff1a;深度解析 throw、throws 关键字&#xff0c;优雅处理异常问题 &#x1f680; 抛出异常的精髓&#xff1a;深度解析 throw、throws 关键字&#xff0c;优雅处理异常问题 &#x1f680;一、什么是抛出异常 &#x1f60a;二、如何抛出异常 &#x1f914…

桌面概率长按键盘无法连续输入问题

问题描述&#xff1a;概率性长按键盘无法连续输入文本 问题定位&#xff1a; 系统按键流程分析 图一 系统按键流程 按键是由X Server接收的&#xff0c;这一点只要明白了X Window的工作机制就不难理解了。X Server在接收到按键后&#xff0c;会转发到相应程序的窗口中。在窗…

将mjpg格式数转化成opencv Mat格式

该博客可以解决如下两个问题&#xff1a; 1、将mjpg格式数据转化成opencv Mat格式 2、v4l2_buffer 格式获取的mjpg格式数据转换成Mat格式。 要将 MJPEG 格式的数据转换为 OpenCV 的 Mat 格式&#xff0c;您可以使用 imdecode 函数。imdecode 函数可以将图像数据解码为 Mat 对象…

C语言预处理详解及其指令

预处理详解 1.预定义符号2.#define定义常量基本使用方法举例子如果在define定义的表示符后面加上分号会发生什么&#xff1f;用一下来解释 3. #define定义宏举例例1例2 4. 带有副作用的宏参数例如: 5. 宏替换的规则6. 宏函数的对比宏和函数的一个对比 7. #和##7.1 #运算符7.2 #…

chrome升级后,调试vue在控制台输出总是显示cjs.js

当前chrome版本120.0.6099.72 在vue中使用console.log输出时&#xff0c;总是显示cjs.js多少多少行&#xff0c;不能显示源文件名及行数 【解决方案】 打开控制台的设置 左侧找到“Ignore List”&#xff0c;取消勾选"enable Lgnore Listing"&#xff0c;并重启chr…

Python Django 连接 PostgreSQL 操作实例

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python Django 连接 PostgreSQL 操作实例&#xff0c;全文3500字&#xff0c;阅读大约10分钟 在Web开发中&#xff0c;使用Django连接到PostgreSQL数据库是一种常见的选择。…