|
上一个演示就搁浅掉吧,确实技术含量很低,真是对不住大家,这几天做了个别的演示。
话说前几天逛Ga途中被一同学发现,对我说,你怎么还在搞这个啊,现在会做图了吗?鉴于之前失败的惨痛经历,我的回答是相当的心虚,其实对于我这种没有审美没有创意没有毅力的人要做出成品图说真的确实不容易。但是不甘心还是有一点的,想到之前我曾经在Ga说过要做一个全法球的模拟(嗯嗯,说到这个还是要先谢谢libla当时对我的帮助呢),但是当时由于水平还不行所以搁浅了,那么做一下这个算是挑战加履行诺言了吧。
说到全法球模拟的初衷,就是想用模拟的手段来做出彼此之间不会冲突的法球效果,不仅不同的法球之间可以共存,而且同类的法球的效果也可以同时发挥作用。原理呢大家都知道,就是侦测单位受到伤害然后根据英雄佩戴的物品运行相应的效果,所以核心代码简单到不足百行,大概十来分钟就完成了,那我就先把代码贴出来吧。当然,首先要说明的是,我还是保持风格,使用数组存储系统而不用缓存,并非我诚心要把代码搞的复杂,既然作为我的挑战项目,我自然是要用我认为更好的技术。第一个是单位受到伤害后所运行的代码:
[codes=jass]
library Msphere
................
globals
    //这个数组一会再介绍
    private integer array _data
    //这几个东西就是用于在运行filterfunc时稍稍提高效率,因为每次都GetTriggerUnit()或者GetEventDamageSource()毕竟是没有全局变量快的
    private integer _this
    private unit _Triunit
    private unit _Souunit
    private player _Souply
    //这两个数组是将单位持有的物品形成链表,然后我们可以依次获取到要运行的filterfunc
    private integer array _itemq
    private integer array _itemh
endglobals
private function _unitD takes nothing returns boolean
    local unit ux=GetTriggerUnit()
    local real x
    local real y
    local filterfunc T
    local item H
    local integer I
    local integer ix
    //'B000'是演示中所有物品技能的魔法效果,有了它也就是说单位被持有法球的英雄攻击了
    if GetUnitAbilityLevel(ux,'B000')>0 then
        call UnitRemoveAbility(ux,'B000')
        //这r的代码作用依上所述
        set _Triunit=ux
        set _Souunit=GetEventDamageSource()
        set _Souply=GetOwningPlayer(_Souunit)
        //这个函数_get()是拉链Hash中的一个函数(包括_get(),_sto(),_del()),作用翻看之前有关Hash的帖子吧,或者下载演示自行研究
        set ix=_itemh[_get(0,_Souunit)]
        set x=GetUnitX(ux)
        set y=GetUnitY(ux)
        loop
            exitwhen ix==0
            //依据ix获得了英雄的第一个法球物品
            set I=f[ix]
            //函数_iget()它只是另一个Hash表
            set _this=_iget(GetItemTypeId(H))
            //_data[]含有该法球的所有数据,因为我们以_this作为指针,在运行filterfunc后获取数据
            set I=_data[_this]
            //既然得到了filterfunc了,我们就以函数GroupEnumUnitsInRange()来运行它
            call GroupEnumUnitsInRange(G0,x,y,50,T)
            //好了,下一个法球
            set ix=_itemh[ix]
        endloop
    endif
    set ux=null
    return false
endfunction
.............
endlibrary
[/codes]
关于上面代码调用的两个函数,_get()和_iget()(请不要计较它们的名字了- -),我说了它们都是Hash表,前者是拉链Hash,它更适合频繁的添加删除句柄这样的场合,后者是双重Hash,它所适合的是初始化既完成或者只添加不删除句柄的场合,更加详细的关于它们的使用方法就不是本贴的讨论范围了,所以pass。下一段代码是单位获取、丢弃物品是触发的动作:
[codes=jass]
library Msphere
................
//怎么解释呢...大家结合上一段函数自行理解吧,pass。
private function _item takes nothing returns boolean
    local item it=GetManipulatedItem()
    local integer ix=_iget(GetItemTypeId(it))
    local integer n
    local integer m
    if ix!=0 then
        if GetTriggerEventId()==EVENT_PLAYER_UNIT_PICKUP_ITEM then
            set ix=_sto(0,it)
            set n=_get(0,GetManipulatingUnit())
            set m=_itemh[n]
            set _itemq[m]=ix
            set _itemh[ix]=m
            set _itemq[ix]=n
            set _itemh[n]=ix
        else
            set ix=_get(0,it)
            set n=_itemq[ix]
            set m=_itemh[ix]
            set _itemh[n]=m
            set _itemq[m]=n
            call _del(ix)
        endif
    endif
    return false
endfunction
.............
endlibrary
[/codes]
下来的一段就是法球的效果及数据的注册了,千万注意,物品ID一定不要重复。呃,惭愧的是我现在只做了4个火焰的法球效果就来发帖了,但还是老话,承诺更新!
[codes=jass]
library Msphere
................
//话说vJ好与不好我说了也不算,但是文本宏和库确实很实用,不会的同学不妨查看教程,了解一些。
//! textmacro zhuce2 takes ID,n1
set ix=_isto($ID$,2)
set _data[ix]=I
set _data[ix+1]=$n1$
//! endtextmacro
//! textmacro zhuce3 takes ID,n1,n2
set ix=_isto($ID$,3)
set _data[ix]=I
set _data[ix+1]=$n1$
set _data[ix+2]=$n2$
//! endtextmacro
//! textmacro zhuce4 takes ID,n1,n2,n3
set ix=_isto($ID$,4)
set _data[ix]=I
set _data[ix+1]=$n1$
set _data[ix+2]=$n2$
set _data[ix+3]=$n3$
//! endtextmacro
//函数_zhuce()是法球类型及其数据的注册函数,具体效果请参考相应的filterfunc
private function _zhuce takes nothing returns nothing
    local boolexpr T
    local integer I
    local integer ix
    //以下为“烈焰”的注册,参数依次为物品ID,伤害半径,伤害值
    set T=Filter(function _fire1)
    set _fire1b=Filter(function _fire1f)
    //! runtextmacro zhuce3("'I000'","175","10")
    //! runtextmacro zhuce3("'I001'","225","20")
    //! runtextmacro zhuce3("'I002'","275","30")
    //以下为“燃灰”的注册,参数依次为物品ID,附加伤害,爆破半径,爆破伤害
    set T=Filter(function _fire2)
    set _fire2b=Filter(function _fire2f)
    //! runtextmacro zhuce4("'I003'","1","150","30")
    //! runtextmacro zhuce4("'I004'","5","175","10")
    //! runtextmacro zhuce4("'I005'","6","200","70")
    //以下为“燃灰·改”的注册,参数依次为物品ID,附加伤害
    set T=Filter(function _fire3)
    //! runtextmacro zhuce2("'I009'","5")
    //! runtextmacro zhuce2("'I00A'","10")
    //! runtextmacro zhuce2("'I00B'","15")
    //以下为“焚烧”的注册,参数依次为物品ID,伤害半径,伤害,伤害次数
    set T=Filter(function _fire4)
    set _fire4b=Filter(function _fire4f)
    //! runtextmacro zhuce4("'I008'","300","10","3")
    //! runtextmacro zhuce4("'I00C'","325","30","4")
    //! runtextmacro zhuce4("'I00D'","350","50","5")
endfunction
.............
endlibrary
[/codes]
好了,通过以上的3段代码,我就生成了4类共12个法球,具体的filterfunc大家可以自己下载演示查看。
我在下一楼就具体说说演示中法球的具体的效果了。 |
评分
-
查看全部评分
|