一些实用代码示例
<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>