人物

您所在的位置:网站首页 晓美焰弓箭名字 人物

人物

2024-07-03 04:05| 来源: 网络整理| 查看: 265

人物¶

晓美焰是动画《魔法少女小圆》的主要角色之一,掌握着强大的时间魔法。

基础属性¶

饥饿 150 / 生命 75 / 理智 200

晓美焰有超乎常人的冷静,自带2.5/分钟的理智回复。

攻击倍数¶

近战x0.75 / 远程x1

时间停止¶

注意

如果mod设置中「重塑后的世界」选项开启,晓美焰将无法发动时间停止。

时间停止是晓美焰的标志性技能。在静止的时间里,怪物不能移动和攻击,花草树木不会生长,查理不会伤害黑暗中的玩家,飞行物、雨滴和雪花也会暂时悬浮在半空中。

技能持续8秒,随后进入30秒的冷却时间。

时间停止的作用半径是10个地皮,如果其他玩家进入该范围,也会被暂停。携带“精致的怀表”可以免疫暂停。

精致的怀表¶

精致的怀表是一个可以使你免疫时停的小道具,位于魔法栏位,所有玩家均可制作,配方为金块和齿轮,不需要任何科技。

携带这块怀表,就可以在晓美焰的时停范围内自由行动。

魔法弓¶

注意

在mod设置中开启「重塑后的世界」选项,晓美焰就可以制作魔法弓。

魔法弓是晓美焰在新世界的战斗武器,轻便灵活,基础伤害30,可以通过蓄力充能提升攻击威力。

在满蓄力状态下,魔法弓会发出耀眼的光芒,射出的致命箭矢将造成150点伤害并贯穿前方所有目标。

弓箭耐久为100,晓美焰可以在魔法栏位用紫宝石、蜘蛛丝和树枝制作新的魔法弓。

普通玩家在使用魔法弓时只能发挥一小部分的威力。

实现¶

如果你是一名mod开发者,对暂停机制比较感兴趣,可以参考下面的源码。

普通玩家可跳过

如何暂停¶

饥荒原生的全局暂停接口是 TheSim:SetTimeScale(0),不过这个玩意儿会让一切物体无差别的冻结,不能用。

晓美焰的暂停参考的是 EntityScript:RemoveFromScene() 函数,并增加了一些定制的内容,如全屏变灰、阻止 scheduler、component、stategraph 的更新。

scheduler的暂停¶

以干草的燃烧为例,一根草被点燃后,经过7.5秒的燃烧,熄灭变为灰烬,这个过程的计时是基于延时任务函数(DoTaskInTime),详细定义可在饥荒代码 scripts/scheduler.lua 找到。对于这个计时器,官方提供了添加和取消它的方法,但没有提供暂停它的方法,所以得自己写一个。

--这个函数可以让延时任务的完成时间往后推1帧 local function PeriodicPostInit(self) function self:AddTick() local thislist = scheduler.attime[self.nexttick] self.nexttick = self.nexttick + 1 if not thislist then return end if not scheduler.attime[self.nexttick] then scheduler.attime[self.nexttick] = {} end local nextlist = scheduler.attime[self.nexttick] thislist[self] = nil nextlist[self] = true self.list = nextlist end end AddGlobalClassPostConstruct("scheduler", "Periodic", PeriodicPostInit)

如果想要暂停一个实体的全部延时任务,可以用以下这段代码。

-- 遍历实体的所有计时器,并让它们的完成时间往后推1帧 -- 配合组件的OnUpdate函数就能实现计时器暂停 for k in pairs(inst.pendingtasks or {})do k:AddTick() end

这样一来,物体内部的计时器就被控制住了。这有什么作用呢?例如,一个干草已经燃烧了5秒,此时发动时停技能,则这个燃烧的草不会在技能持续期间突然变成灰烬,而是在技能结束后的2.5秒才熄灭;反之,先在地上摆5个干草,发动技能,趁技能结束前依次点燃这5个干草,那么这些干草会在技能结束后同时熄灭。(因为从逻辑上它们是被同时点燃)

阻止组件更新¶

在饥荒中,很多组件存在更新机制,例如海象射出的吹箭,会以每秒30次的频率计算自己和目标的距离,如果距离小于1,就判定为击中目标。我们并不希望在撞上停止运动的飞行物后会受到伤害,所以要阻止组件的更新活动。

有少部分组件的更新是不应该被暂停的,如container(容器),如果暂停的话,会导致界面无法正常关闭。

local skip_components = { container = true, --保证容器界面正常关闭 --[[......]]-- } local function ComponentPostInit(self) local old_add = self.AddComponent function self:AddComponent(name, ...) old_add(self, name, ...) if skip_components[name] == nil and self.components[name].OnUpdate then local cmp = self.components[name] local old_up = cmp.OnUpdate cmp.OnUpdate = function(self, ...) if self.inst:HasTag('homuraTag_pause') then return else old_up(self, ...) end end end end end AddGlobalClassPostConstruct('entityscript','EntityScript', ComponentPostInit) 范围搜索¶

为了游戏的流畅性,时停技能显然不应该将饥荒世界里的所有物体都控制住,它只暂停以玩家为中心,40半径范围内的物体,距离太远的东西不会受到影响(玩家一般也看不见)。

在何时搜索附近实体呢?一般的思路是,在技能发动时搜索一次,把附近所有物体暂停,然后在技能结束时解除暂停状态。但略作思考就能发现问题:假如在技能持续期间,出现了一个新的物体(比如落下来一只鸟),则这个物体是无法受到控制的。因此,我们应该在每次 Update() 时进行一次搜索。

搜索到的实体以哈希表的形式储存,哈希表的访问速度比数组慢,但增删操作速度比大数组快得多。

--以每秒30次的频率搜索附近实体 local function OnUpdate(inst, dt) --[[......]]-- --再次遍历周围实体,加入新的,移除出范围的 local ignoretags = {"INLIMBO", "homuraTag_ignoretimemagic"} local searchlocal = not TheNet:IsDedicated() for player in pairs(inst.centers)do --所有正在发动时停的玩家 local x,y,z = player:GetPosition():Get() local ents = TheSim:FindEntities(x,y,z, MAGIC_RADIUS, nil, ignoretags) for _, item in pairs(ents)do if not IsMagicImmue(item) and (item.Network or searchlocal) then if not inst.items[item] then inst:AddItem(item) inst.items[item] = 2 else inst.items[item] = 2 end end --[[......]]-- end end --如果对应值仍然为1,则移除 --如果对应值为2,不移除,并重置为1,然后对这些实体进行更新 for k,v in pairs(inst.items)do if v == 1 then inst:RemoveItem(k) end if v == 2 then inst.items[k] = 1 ItemTimeMagicUpdate(k, dt) end end --[[......]]-- end



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3