找回密码
 点一下
查看: 2701|回复: 3

自制弹幕函数

[复制链接]
发表于 2011-1-11 01:40:28 | 显示全部楼层 |阅读模式
专门针对单人游戏优化的弹幕函数,不过略作修改也可以支持多人。

在我的机器上,用单位作弹幕可以流畅地跑1200个左右,用图片作弹幕则是2倍(2400个),基本上够用了。

函数本身支持的弹幕上限是3000个左右,超过了则不能正常工作(这个是受jass代码执行上限的限制)。如果需要超过此数值,那就开两个计时器吧。

==================================

这个弹幕函数在判断边界时还有另一种写法,那就是事先算出弹幕达到边界需要的帧数,这样在移动函数中就不需要判断边界而直接判断帧数就可以了。

这种看似提前计算的优化,事实上却没有现在这种直接判断的快。不过这个方法有个好处就是可以加入弹幕最大存活帧数这个参数而不需要任何额外的代价。如果你需要有这个参数的弹幕可以考虑这种方法。

弹幕函数测试.w3x

11 KB, 下载次数: 113

评分

参与人数 1威望 +1 收起 理由
疯人¢衰人 + 1 优秀文章,支持!n神马都是浮云

查看全部评分

 楼主| 发表于 2011-1-11 01:41:07 | 显示全部楼层
[jass]
function BulletMove takes nothing returns nothing
    local unit u
    local real X
    local real Y
    local real ux = GetUnitX(udg_Player)
    local real uy = GetUnitY(udg_Player)
    local real z = ux*ux+uy*uy
    local integer i = 0

    set ux = 2 * ux
    set uy = 2 * uy
    loop
        exitwhen i >= udg_Bullet_IndexMax
        set X = udg_Bullet_X+udg_Bullet_DX
        set Y = udg_Bullet_Y+udg_Bullet_DY
        if (udg_GameMinX <= X) and (X <= udg_GameMaxX) and (udg_GameMinY <= Y) and (Y <= udg_GameMaxY) then
            if udg_Bullet_Range2>X*(X-ux)+Y*(Y-uy)+z then
                // 弹幕命中
                call KillUnit(udg_Bullet_Unit)
                set udg_Bullet_IndexMax = udg_Bullet_IndexMax - 1
                set udg_Bullet_Unit   = udg_Bullet_Unit  [udg_Bullet_IndexMax]
                set udg_Bullet_X      = udg_Bullet_X     [udg_Bullet_IndexMax]
                set udg_Bullet_Y      = udg_Bullet_Y     [udg_Bullet_IndexMax]
                set udg_Bullet_DX    = udg_Bullet_DX    [udg_Bullet_IndexMax]
                set udg_Bullet_DY    = udg_Bullet_DY    [udg_Bullet_IndexMax]
                set udg_Bullet_Range2 = udg_Bullet_Range2[udg_Bullet_IndexMax]
            else
                set u = udg_Bullet_Unit
                set udg_Bullet_X = X
                set udg_Bullet_Y = Y
                call SetUnitX(u, X)
                call SetUnitY(u, Y)
                set i = i + 1
            endif
        else
            // 弹幕越界
            call KillUnit(udg_Bullet_Unit)
            set udg_Bullet_IndexMax = udg_Bullet_IndexMax - 1
            set udg_Bullet_Unit   = udg_Bullet_Unit  [udg_Bullet_IndexMax]
            set udg_Bullet_X      = udg_Bullet_X     [udg_Bullet_IndexMax]
            set udg_Bullet_Y      = udg_Bullet_Y     [udg_Bullet_IndexMax]
            set udg_Bullet_DX    = udg_Bullet_DX    [udg_Bullet_IndexMax]
            set udg_Bullet_DY    = udg_Bullet_DY    [udg_Bullet_IndexMax]
            set udg_Bullet_Range2 = udg_Bullet_Range2[udg_Bullet_IndexMax]
        endif
    endloop
    set u = null
endfunction

// X、Y  弹幕的初始位置
// Face  弹幕的面向角度
// Speed 弹幕的速度
// Range 弹幕的碰撞半径
function CreateBullet takes unit Bullet, real X, real Y, real Face, real Speed, real Range returns unit
    call DisplayTimedTextToPlayer(Player(0),0,0,2,"最高位:"+I2S(udg_Bullet_IndexMax))
    set udg_Bullet_Unit  [udg_Bullet_IndexMax] = Bullet
    set udg_Bullet_X     [udg_Bullet_IndexMax] = X
    set udg_Bullet_Y     [udg_Bullet_IndexMax] = Y
    set udg_Bullet_DX    [udg_Bullet_IndexMax] = Cos(Face*0.01745)*Speed
    set udg_Bullet_DY    [udg_Bullet_IndexMax] = Sin(Face*0.01745)*Speed
    set udg_Bullet_Range2[udg_Bullet_IndexMax] = Range*Range
    set udg_Bullet_IndexMax = udg_Bullet_IndexMax + 1
    return Bullet
endfunction

function CreateBulletEx takes player p, integer id, real X, real Y, real Face, real Speed, real Range returns unit
    if (udg_GameMinX <= X) and (X <= udg_GameMaxX) and (udg_GameMinY <= Y) and (Y <= udg_GameMaxY) then
        return CreateBullet(CreateUnit(p, id, X, Y, Face), X, Y, Face, Speed, Range)
    endif
    return null
endfunction

function BulletInitialization takes nothing returns nothing
    set udg_Bullet_IndexMax = 0
    call TimerStart(CreateTimer(), 0.05, true, function BulletMove)
endfunction
[/jass]
回复

使用道具 举报

发表于 2011-9-8 13:57:01 | 显示全部楼层
好东西哦,大家不要光看不顶








byelu.com
回复

使用道具 举报

发表于 2011-11-2 17:26:12 | 显示全部楼层
我在想是用hash储存数据还是用全局好.....

全局变量更加稳定 效率

用hashtable可以使全局变量比较简洁

有点难取舍滴...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-22 16:11 , Processed in 0.195761 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表