函數(function)

什麼是函數

函數是一段用來完成一個獨立功能的程式碼,它的運作原理就像數學的f(x), g(x,y)那樣,只要輸入一些數值,它就會幫你做相應的事。函數是JASS中極為重要的部分,想學好JASS,就要學會設計函數。

註:函數(function)也稱為函式、程序、副程式等。

源函數

API(Application Programming Interface,應用程式介面)是指包含在common.j中的函數,該部分函數實際上是一些已經由系統封裝好的函數,用戶只要知道function名 稱、功能、參數,就可以藉由呼叫這些函數完成自己想要做的事情,通常API是實現用戶無法通過自定義函數來實現的功能,在common.j中,API的定義形式如下:

native <函數名> takes <參數類型1> <參數名1>, <參數類型2> <參數名2>, ... returns <傳回類型>

函數可以不取參數(填nothing),也可以不傳回值(一樣填nothing)。

這種函數是變函數,它根據參數和函數本體內的運算,傳回不同的值。另外有一種所謂的常函數(constant function),它傳回一個固定的值。

常函數的定義和變函數差不多,只是在native前面多加一個constant而已。

自定函數

自定函數是指用戶在使用過程中,自己定義的函數

一段函數,由定義和函數主體兩部分構成:

function <函數名> takes <參數類型1> <參數名1>, <參數類型2> <參數名2>, ... returns <傳回類型> //定義
    //*****************************
    //***        函數主體       ***
    //*****************************
    return <運算式>
endfunction //函數結尾

函數可以不取參數(填nothing),也可以不傳回值(一樣填nothing)。對於不傳回值的函數,最後面可以不寫return那行。

接著介紹函數基本語法return, 它必須寫在函數裏,格式為:

return <運算式>

當函數傳回類型為nothing時,後面不需要運算式,否則必須寫運算式。

它可以出現在函數的任何地方,也可以出現不止一次,但是一旦碰到這一行,函數立即傳回值並跳出。

注意,return值的類型必須和函數的傳回類型相同。除了有定義傳回類型函數的最後面要寫以外,return也可以作為提早結束函數之用。

呼叫函數

有了函數,我們當然要使用它,這個動作稱為「呼叫」。呼叫函數可以在很多地方進行,只要類型合適即可。

語法

<函數名稱>(<引數1>, <引數1>, ...)

如果這個函數自成一行,前面必須加上call。

函數的執行流程

當我們在一段程式碼A中調用函數B的時候,A會首先傳遞一些相關的資訊給B,這些由A傳遞的值稱為引數(argument)。

然後控制權移轉到B,直到B把所有的東西都處理完之後,再把控制權交還A,繼續執行後面的動作。

B在處理時可能會用到一些參數(parameter),而B的參數要和A傳給它的引數類型相同,否則就會出錯。

也就是說,一條敘述調用一個函數,就意味著只有當被調用函數執行完畢之後,才會繼續執行呼叫敍述後面的程式碼。

註:只有在後面的程式碼可以呼叫前面的函數;函數可以呼叫自己,但不能呼叫寫在後面的函數。

函數範例

API函數

native CreateTimer takes nothing returns timer

native TriggerSleepAction   takes real timeout returns nothing

native TimerStart takes timer whichTimer, real timeout, 下行接續
    boolean periodic, code handlerFunc returns nothing

native TimerGetRemaining takes timer whichTimer returns real

native DestroyTimer takes timer whichTimer returns nothing

constant native GetTriggerUnit takes nothing returns unit

blizzard.j中等待遊戲時間的函數

function PolledWait takes real duration returns nothing
//因為這裡returns nothing,所以最後面沒有寫return也沒關係
    local timer t
    local real  timeRemaining

    if (duration > 0) then
        set t = CreateTimer()
        call TimerStart(t, duration, false, null)
        loop
            set timeRemaining = TimerGetRemaining(t)
            exitwhen timeRemaining <= 0

            // If we have a bit of time left, skip past 10% of the remaining
            // duration instead of checking every interval, to minimize the
            // polling on long waits.
            if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
                call TriggerSleepAction(0.1 * timeRemaining)
            else
                call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
            endif
        endloop
        call DestroyTimer(t)
    endif
endfunction

blizzard.j中取餘數的函數

function ModuloInteger takes integer dividend, integer divisor returns integer
    local integer modulus = dividend - (dividend / divisor) * divisor

    // If the dividend was negative, the above modulus calculation will
    // be negative, but within (-divisor..0).  We can add (divisor) to
    // shift this result into the desired range of (0..divisor).
    if (modulus < 0) then
        set modulus = modulus + divisor
    endif

    return modulus  //前面定義傳回integer,這裡就要return integer
endfunction

呼叫函數的範例

function EX1 takes nothing returns nothing
    local integer i
    //傳遞的引數是5和3
    //ModuloInteger函數的參數dividened和divisor在開始執行時的值就分別是5和3
    set i = ModuloInteger(5,3)
    //之後ModuloInteger執行完會傳回值,結果i==2
endfunction
function EX2 takes nothing returns nothing
    //傳遞的參數是4*20和bj_MAX_PLAYERS
    //當然,傳遞時會運算,所以最後輸入的是80和12(bj_MAX_PLAYERS是一個blizzard.j中的常數,值為12)
    //ModuloInteger函數的參數dividened和divisor在開始執行時的值就分別是5和3
    local integer i = ModuloInteger(4*20,bj_MAX_PLAYERS)
    //之後ModuloInteger執行完會傳回值,結果i==8
endfunction
function EX3 takes nothing returns nothing
    local integer i = PolledWait(20.0) //錯誤寫法,因為PolledWait不會傳回整數,所以不能把它指定給i

    //函數若自成一行,前面就必須加個call
    call PolledWait(20.0) //正確寫法
    PolledWait(20.0)      //錯誤寫法

    call ModuloInteger(5,3) 
    //語法正確,可是沒有意義。
    //雖然運算會得到結果2,可是沒有被儲存,之後也無法使用它
endfunction 
綜合教學/jass入門教學/4.函數.txt · 上一次變更: 2007年11月11日 4:11 pm 來自 wasabi
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0