传奇生物文档

对MOD开发相关的说明


一些实用代码示例

<h2>延迟</h2> <pre><code>yield(reTimer(0.45),"timeout"), 当前函数延迟0.45秒。 reTimer函数为chara实例所有,若在chara以外的地方使用,则需要chara.reTimer(0.45) yield(sys.get_tree().create_timer(0.5), "timeout"),当前函数延迟0.5秒,此为全局延迟函数,一般仅在第一种方法无法使用时才用。 延迟有很多好处,比如想实现“装备后马上删除该道具”,则往往需要加上至少0.05秒延迟,否则会出问题。 比如实现连续发射3枚飞弹,如果没有延迟,3枚飞弹会同时射出。</code></pre> <h2>文字特效</h2> <pre><code class="language-python">#在position位置创建一个文字特效,该处position为chara变量 var eff = sys.newEff("numHit", position, false, 1) #text为文本内容,#FF0099为颜色代码,可自行百度 eff.setText(text, "#FF0099") #特效播放速度 eff.anim.set_speed_scale(0.2)</code></pre> <h2>随机选择</h2> <pre><code class="language-python">#概率函数,10%概率返回true sys.rndPer(10) #概率函数,随机返回0-100中的一个整数 sys.rndRan(0, 100) #从一个数组中随机获得一个值 var chas = [1, 2, 3, 4, 5] #方法1 var result = chas[sys.rndRan(0, chas.size()-1)] #方法2 chas.shuffle() var result = chas[0] #方法3 var result = sys.rndListItem(chas)</code></pre> <h2>隐藏角色与道具</h2> <p>角色名或道具名带有Hide,则该道具/角色不会出现在图谱、随机池子中。 例如:i_Hide_equip</p> <h2>自定义图片特效</h2> <blockquote> <p>要想做好特效,首先要知道创建一个特效的流程 以下代码全都是写在全局文件当中</p> </blockquote> <h4>新建一个自定义特效实例需要的参数</h4> <pre><code>var eff = sys.newEff("animEff", 特效的出现位置) eff.setImgs(图片所在路径, 帧速, 是否重复播放) eff.normalSpr.position = 特效偏移量 eff.rotation = 旋转角度 eff.scale *= 缩放比例 eff.show_on_top = 特效是否遮挡住人物</code></pre> <blockquote> <p>如果你有参考过其他自定义特效的mod,对以上步骤可能不会陌生</p> </blockquote> <p>以上步骤用到最多的还只是前两行,若想要更灵活的创建特效,我在全局文件中给出了如下封装:</p> <pre><code class="language-python"># 创建特效的API,支持跨mod使用 # @param {dictionary} config - # @param {string} config.name - 特效文件夹名(必填) # @param {string} config.dir - 特效文件夹路径(必填) 两个必填至少有一个,优先读取name # @param {Vector2} config.pos - 特效定位 # @param {number} config.fps - 特效播放速度(单位秒) # @param {boolean} config.rep - 是否重复播放 # @param {Vector2} config.dev - 特效图片偏移 # @param {rad} config.rotation - 特效旋转弧度 # @param {number} config.scale - 特效缩放大小(百分比) # @param {boolean} config.top - 是否盖住人物 # @return {Eff} func draw_effect(config): var direc = "" if config.has("name"): direc = Path + "/effects/" + config.name elif config.has("dir"): direc = config.dir var position = getVal(config, "pos", Vector2(350, 150)) # 默认出现在地图中心 var frame = getVal(config, "fps", 15) # 默认每秒15张 var repeat = getVal(config, "rep", false) # 默认不重复播放 var eff = sys.newEff("animEff", position) eff.setImgs(direc, frame, repeat) eff.normalSpr.position = getVal(config, "dev", Vector2(0, 0)) # 默认不偏移 eff.rotation = getVal(config, "rotation", deg2rad(0)) # 默认不旋转 eff.scale *= getVal(config, "scale", 1) # 默认不缩放 eff.show_on_top = getVal(config, "top", true) # 默认覆盖角色 return eff # 最后返回特效实例,可以继续后续操作 func getVal(object, name, default = null): if object.has(name): return object[name] else: return default</code></pre> <p><strong>以上代码并不能直接拷贝复制使用,特效图片的路径需要根据自己的喜好进行改动</strong> 图片路径的获取,我使用的是<code>direc = Path + "/effects/" + config.name</code> 其中:<code>Path</code>为当前全局文件所在mod的绝对路径,<code>"/effects/"</code>为当前目录下的effects文件夹,最后是<strong><em>特效的文件夹名</em></strong></p> <h4>如何获取自己mod的绝对路径</h4> <blockquote> <p>如果你有参考过有写全局文件的mod,你或许会发现都有一段同样的代码</p> </blockquote> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/eb6d5309555e5551e18eef9b88cdf927?showdoc=.jpg" alt="" /></p> <p>绝对路径<code>Path</code>在最顶部声明变量后, 等全局文件加载完后进行赋值 <code>Path = chaData.infoDs["自己mod下的角色名"].dir</code> 然后你就可以在这个文件下面任意使用<code>Path</code>来表示自己mod的绝对路径</p> <h4>使用方式</h4> <pre><code class="language-python">const Utils = globalData.infoDs["g_xxxx"] # 引入你的全局文件 # 极简的使用方式 Utils.draw_effect({ "name": "boom" }) 创建一个名为"boom"的特效,至于特效出现位置,播放速率,缩放大小等等其他参数,全都使用默认值 # 灵活的使用方式 Utils.draw_effect({ "pos": Vector2(100, 100), "name": "boom", "fps": 8, "dev": Vector2(0, -150), "rep": true, "scale": 3, "rotation": deg2rad(45), "top": false, }) 以上参数可以不分先后顺序填写 在地图的x = 100, y = 100处 创建了一个名为"boom"的特效 每秒播放速度为8 特效整体向上偏移150个像素 特效重复播放 放大到原图像大小的3倍 顺时针旋转45° 不覆盖角色 # 跨mod的使用方式,方便作者在制作DLC的时候使用 # 使用dir属性,而不是name属性,且需要完整的绝对路 当前A mod下面有一个角色文件夹 当前A mod下面还有一个名为boom的特效图片文件夹 A mod的角色文件,引入了B mod的全局文件 这里考虑了DLC的制作情况,所以需要用B mod来生成A mod下的boom特效 var Path = chaData.infoDs[id].dir # 获取当前角色所在 A mod的绝对路径 B_mod_Utils.draw_effect({ "dir": Path + "/boom" })</code></pre>

页面列表

ITEM_HTML