CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

破军旗:旗立三秒圈内加攻,旗倒攻散

2026-10-01 10:00 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【游戏功能】

bn.t = bn.t - dt——一行旗面倒计时的代码,撑起了破军旗全部的紧迫感:旗立三秒、圈内加攻三成,旗倒的那一帧加成散得干干净净——立旗的时机就是这门机制的全部操作。这篇的核心代码照引擎技能脚本的全规格写:配置表、旗面构件、圈内判定、定时器、调试按钮。

一、效果演示:旗立三秒,圈内加成

演示场点「立旗!」:一面金色的旗帜落在你和怪的正中间——旗面虚线圈开、头顶挂"破军 三秒"。你站在旗内:普攻从十二涨到十五,金色刀光加宽;怪冲进旗内照样挨打——旗不偏袒任何一方,圈内双方都受影响。三秒一到旗面当场散掉,加成同步消失。演示里试两个站位:圈内站桩打——加成的十二变十五刀刀金色;圈外远站——刀刀灰字白给。站位的差别就是这门机制的教学。

demo
 fx-warbanner

二、底层原理:一面旗加一个圈域加成

模块的机关是一对搭档。旗面态:旗立期间 _fieldT 大于零,圈的半径六十步、纵横比零点三六压扁贴地。圈内判定:玩家的横坐标离旗心不超过六十步即算在圈内——判定每帧跑,出圈的瞬间加成即断。加成侧不走独立加持,而是直接改写下一刀的伤害系数——SetNextAttackAmp 每帧按圈内判定重设,进出圈的加成切换就在一帧内完成。旗面倒了加成同步清——加成和旗面同帧同生同死,不存在旗倒了加成还挂着的残账。旗面倒了加成同步清——加成和旗面同帧同生同死,不存在旗倒了加成还挂着的残账。旗面的倒计时要一直挂着——旗倒前三秒的读秒写在旗面上方,读秒越近圈沿的虚线闪得越急,闪急了玩家就知道该撤了。

三、核心代码:完整模块(上·骨架)

lua
-- @file WarBanner.lua
-- 破军旗 —— 旗立三秒圈内加攻,旗倒攻散

local WarBanner = {}

local CONST = {
    BANNER_LIFE   = 3.0,
    BANNER_CD     = 8.0,
    BANNER_R      = 60,
    IN_AMP        = 1.3,

    COLOR_BANNER  = "#d8b34a",
    COLOR_DEEP    = "#6b5a2b",
    COLOR_GHOST   = "#f5ecc8",

    ZORDER_BANNER = 128,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 976000,
}

local _bannerT   = 0
local _bannerX   = 0
local _cdLeft    = 0
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "WBN",
        CONST.AUTOINC_BASE + _autoInc)
end

local function GetActorPos(id)
    if not id then return nil end
    local x = SL:GetValue("ACTOR_POSITION_X", id)
    local y = SL:GetValue("ACTOR_POSITION_Y", id)
    if not x or not y then return nil end
    return { x = x, y = y }
end

local function SafeRemove(node)
    if node and not GUI:Widget_IsNull(node) then
        GUI:removeFromParent(node)
    end
end

local function ShowTip(msg)
    if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end

local function CreateBannerNode(x)
    local node = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Bnr"), x, 0, 0, 0, false)
    GUI:setLocalZOrder(node, CONST.ZORDER_BANNER)
    GUI:DrawLine_Create(node, "pole", 0, 0, 6,
        -3, 0, -3, -70, CONST.COLOR_BANNER, 240)
    GUI:DrawLine_Create(node, "flag", 0, 0, 8,
        -3, -70, 22, -62, CONST.COLOR_GHOST, 240)
    return node
end

四、核心代码:完整模块(下·定时器与圈内判定)

lua
-- 立旗
function WarBanner.Cast()
    if _cdLeft > 0 or _bannerT > 0 then return end
    _cdLeft = CONST.BANNER_CD
    _bannerT = CONST.BANNER_LIFE
    local mp = GetActorPos(SL:GetValue("USER_ID"))
    local tp = GetActorPos(SL:GetValue("MARK_TARGET_ID"))
    if mp and tp then
        _bannerX = (mp.x + tp.x) / 2
    end
    CreateBannerNode(_bannerX)
    ShowTip("旗立了——三秒圈内加三成,抢位")
end

-- 圈内判定
local function InBanner(x)
    if _bannerT <= 0 then return false end
    return math.abs(x - _bannerX) <= CONST.BANNER_R
end

-- 定时器
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _bannerT <= 0 then return end
        _bannerT = _bannerT - dt
        if _bannerT <= 0 then
            ShowTip("旗倒了——加成散了")
        end
        local myID = SL:GetValue("USER_ID")
        local mp = GetActorPos(myID)
        if mp then
            SL:SetNextAttackAmp(
                InBanner(mp.x) and CONST.IN_AMP or 1.0)
        end
    end, 0.02)
end

SL:RegisterLUAEvent(LUA_EVENT_SCENE_CLEAR, "WBN_Clear", function()
    _bannerT = 0
    SL:SetNextAttackAmp(1.0)
end)

SL:ScheduleOnce(function()
    ShowTip("技能已加载: 破军旗 (调试按钮触发)")
end, 1.0)

return WarBanner

下半场的加成出口走 SetNextAttackAmp 每帧重设——出圈的瞬间加成即断、进圈的瞬间加成即挂,一帧都不多。旗面到期时加成一起清——场景清空钩子兜底重置,下一场从干净状态起步。

五、调参指南与商业服怎么用

调参三笔账。圈内加成三成对旗寿三秒是"三秒的狂欢"——加成过五成圈内输出碾压圈外,机制变成"进圈挂机";低于两成圈内圈外没区别,旗变装饰。旗寿三秒对冷却八秒留五秒真空——真空里裸打,真空越短旗越像常驻。旗半径六十步对怪的攻击距离三十步是"能站两人"的圈子——圈子太大怪也进来白嫖加成。常见坑三个:出圈后加成没断下一刀还是乘一三;旗面的虚线圈视觉和实际判定圈不同大小;旗立期间怪的攻击也加成——旗不该偏袒怪。

商业服里破军旗是"阵地流派"的入门课:旗的位置就是输出循环的上半段——圈内的三秒狂欢逼玩家在怪的攻击间隙里抢位立旗。攻城战里它是推进的信号——旗立在哪个路口,哪条路就是集火点。变体做成破军连旗:旗倒后下一面旗的加成叠加——连环立旗的收益翻着翻地涨。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句做阵地系的同学:破军旗卖的是"三秒的决心"——旗立在怪的刀口下,敢抢位的玩家才配拿那三成。旗立在怪的刀口下,敢抢位的玩家才配拿那三成。旗面的位置也有讲究——立在怪的撤退路线上,怪的退路被旗封住,进退两难的怪只能硬吃旗内加成的一刀。

旗面的收缩也要做——旗的圈从六十步开始慢慢收缩、缩到四十步才散——缩圈的旗逼着怪和你贴身,缩到头就是贴身肉搏。旗的收缩速度也是节奏的一环——匀速收缩的旗给玩家一个稳定的抢位窗口,忽快忽慢的旗会让玩家不知道该什么时候进。旗面和怪的交叉也值得做——先立旗加成、再缩地阵把怪压进旗内,两个圈的叠加就是阵地战的终极形态。破军旗和连招谱的交叉也值得做——按谱出招的每一招都算一次拍,谱和拍合流就是阵地战的高级课。旗面的虚线圈也做了双向的视觉——旗内的单位头顶亮金色小三角、旗外的没有——三角形的有无就是圈内圈外的视觉标尺。旗面的碰撞判定也别忘了做——怪的碰撞盒和旗的判定圈的交叠就是进圈的判据,两个圆的交叉判定比点到点的距离判定更宽容。旗面的收缩也要做——旗的圈从六十步开始慢慢收缩、缩到四十步才散——缩圈的旗逼着怪和你贴身,缩到头就是贴身肉搏。旗的收缩速度也是节奏的一环——匀速收缩的旗给玩家一个稳定的抢位窗口,忽快忽慢的旗会让玩家不知道该什么时候进。旗面和怪的交叉也值得做——先立旗加成、再缩地阵把怪压进旗内,两个圈的叠加就是阵地战的终极形态。破军旗和连招谱的交叉也值得做——按谱出招的每一招都算一次拍,谱和拍合流就是阵地战的高级课。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

逆时步:三秒前站在哪,一步回到哪

【游戏功能】 排查一个报错走到深夜:玩家申诉"人物瞬移",录像里人也确实是凭空跳了半张地图——坐标链上多出来一次没有来由的写…

2026-10-01 11:23 996 技术组
进阶实战游戏功能

蛮牛劲:一勾锁它拖下马,硬生生拽到跟前

【游戏功能】 后山出过一单笑话:一个远程怪卡在断桥那头射了全队十分钟,走不过去、勾不着、弹道够不到——最后是位玩钩子的老哥一…

2026-10-01 11:23 996 技术组
进阶实战游戏功能

迟滞咒:咒它出手慢一倍,节奏全乱招招落空

【游戏功能】 M.at = M.at 2 —— 就这一行,让一只盯了三天的速攻怪从"碰不得"变成"随便打"。怪的可怕从来不在…

2026-10-01 11:22 996 技术组
进阶实战游戏功能

叠劲:连打同门一刀重一刀,断了就得从头数

【游戏功能】 为什么连着打同一个怪,一刀会比一刀疼?叠劲的答案是:劲是攒出来的——起手八点,每接一刀加四点,叠到六层刀刀二十…

2026-10-01 11:22 996 技术组
进阶实战游戏功能

破势令:一处破绽挂六秒,谁打它都更疼

【游戏功能】 群里报过一个怪现象:同一位玩家打同一个怪,有时一刀十三有时一刀十,面板攻击力没变过——排查了半天才发现,十三的…

2026-10-01 11:22 996 技术组
进阶实战游戏功能

血债簿:五笔血账一次清算,欠下的刀刀要还

【游戏功能】 线上出过一单事故:同战力两个人对砍,先手的那位反而输了——事后翻账才发现,赢家的每一刀都比面板数值高出一截,高…

2026-10-01 11:22 996 技术组