[教學]Visual Jass (vJass) 教學(初步完成)

分享各類的精華文章,如心得、範例、工具、連結……等等。

版主: crassorz, tv580025

[教學]Visual Jass (vJass) 教學(初步完成)

文章AppleSheep » 2009年10月10日 4:52 am

Visual Jass (vJass)


介紹

這是一種物件導向程式設計,指一種程式設計典範,同時也是一種程式開發的方法論。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充套件性。

如果要比喻的話
 Jass就像c語言,而vJass就像c++
它不僅指一種程式設計方法。它更多意義上是一種程式開發方式。


回到頁頂

如何使用

你可以使用已經封裝好的NewGenApple NewGen

或是使用Grimoire魔法書自行組裝

新版本可以從這邊找到並下載

回到頁頂

Jass語法模式

Global

<全域宣告>
在儲存地圖時會將變數自動移動到地圖腳本頂端
所以可以不用在意它的位置

例子:

function something takes nothing returns nothing
    set somearray[SOMETHING_INDEX]=4
endfunction

globals
    constant integer SOMETHING_INDEX = 45
    integer array somearray
endglobals

甚至是它們的類型

例子:
globals
    code func
    handle array object
    string MyName = "AS"
endglobals

Native

<本地宣告>
如果你有自訂的common.j而需要他們做不同的處理又怕衝突就可以使用此語法將函數調用出來
這是一個極少數情況會被使用的功能..

例子:

native GetUnitGoldCost takes integer unitid returns integer

function test takes nothing returns nothing
    call BJDebugMsg("此工人需花費: "+I2S( GetUnitGoldCost('hfoo')+" 黃金" ) )
endfunction

Debug Mode

<測試模式>
此語法可以幫助你擁有可以在地圖中寫入有時需要有時則需要刪除的部分

例子:

function InitMap takes integer a returns nothing
    call BJDebugMsg("地圖初始化")
    debug call BJDebugMsg("測試模式")
endfunction
開啟Debug模式下會看到「地圖初始化」與「測試模式」兩行訊息
而關閉Debug模式只會看到「地圖初始化」
開關在此

Local variables shadowing

<局域變數映射>
由於魔獸在1.24為了防止Union Bug而禁止了映射功能
但這功能並不安全
它常常導致你的觸發執行中斷
於是就有了此系統自動解決此問題
它會自動在已有相同名稱的區域變數前面加上l__
以編譯後的名稱衝突為準

例子:

globals
    integer A = 0
    real B = 4.5
endglobals

function test takes string A returns nothing
    local boolean B
endfunction
編譯後
globals
    integer A = 0
    real B = 4.5
endglobals

function test takes string l__A returns nothing
    local boolean l__B
endfunction

回到頁頂

Libraries 與 Scopes

Libraries

<函數庫>
此功能與「自定腳本區」的功能相近
它可以將你需要的代碼、函數移動到地圖腳本區頂端 供其他觸發使用

定義方式:

library A
    function Afunc takes nothing returns nothing
    endfunction
endlibrary

library B
    function Bfunc takes nothing returns nothing
    endfunction
endlibrary

但它們通常不是來自同一個觸發
而又需要遵守「向前參照」規則時
我們可以藉由關鍵字「needs」、「uses」、「requires」其中一個來指引它需要哪個函數庫作為參照(指引)

例子:
library A needs B
    function Afunc takes nothing returns nothing
        call Bfunc()
    endfunction
endlibrary

library B
    function Bfunc takes nothing returns nothing
    endfunction
endlibrary

當然. 參照多個也是可以的

library A needs B, C, D
    function Afunc takes nothing returns nothing
        call Bfunc()
        call Cfunc()
        call Dfunc()
    endfunction
endlibrary

library B
    function Bfunc takes nothing returns nothing
    endfunction
endlibrary

library C needs D
    function Cfunc takes nothing returns nothing
        call Dfunc()
    endfunction
endlibrary

library D
    function Dfunc takes nothing returns nothing
    endfunction
endlibrary

常常你會需要一段函數做初始化
這時就可以使用關鍵字「initializer」
它會再地圖初始化時使用ExecuteFunc的方式來執行你需要執行的初始化函數

例子:
library A initializer InitA requires B
    function InitA takes nothing returns nothing
       call StoreInteger(B_GC,"A","RandomInt",GetRandomInt(0x0,0x100))
    endfunction
endlibrary

library B initializer InitB
    globals
        gamecache B_GC
    endglobals

    function InitB takes nothing returns nothing
        set B_GC = InitGameCache("B.w3v")
    endfunction
endlibrary

Private

<私有化>
大部分的情況常常需要再不同的函數庫中使用相同的變數或函數名稱
原本避免衝突都需要你手動去增長它的名稱並手動歸類來防止衝突情況
而這時候就可以使用關鍵字「private」來省略這些麻煩的動作了
而且無法從外部使用

例子:

library A
    globals
        private integer N = 0
    endglobals

    private function x takes nothing returns nothing
        set N=N+1
    endfunction

    function RunA takes nothing returns nothing
        call x()
        call x()
    endfunction
endlibrary

library B
    globals
        private integer N = 5
    endglobals

    private function x takes nothing returns nothing
        set N=N+1
    endfunction

    function RunB takes nothing returns nothing
        call x()
        call x()
    endfunction
endlibrary

function Outside takes nothing returns nothing
    set B___N = 0 //錯誤:無法從外部使用
endfunction

Public

<公用化>
有的時候你會希望private可以在外部被使用
這時候就可以使用關鍵字「public」
它一樣可以避免不同函數庫的同名變數或函數名稱衝突
但可以從外部使用

例子:

library A
    public function func takes nothing returns nothing
        call BJDebugMsg("A")
    endfunction

    function Msg takes nothing returns nothing
        call func() //正確
        call A_func() //錯誤:內部不需要加函數名
    endfunction
endlibrary

function Outside takes nothing returns nothing
    call A_func() //正確
endfunction

scope

<範圍>
有時候你可能需要一個函數庫. 但不需要將它移動到地圖腳本的頂端
這時候你可以使用關鍵字「scope」
它擁有與函數庫完全相同的功能. 但它不會被移動到地圖腳本頂端. 且不能被參照.
其使用方法完全相同

例子:

scope B initializer InitB
    globals
        gamecache B_GC
    endglobals

    function InitB takes nothing returns nothing
        set B_GC = InitGameCache("B.w3v")
    endfunction
endscope

scope A initializer InitA
    function InitA takes nothing returns nothing
       call StoreInteger(B_GC,"A","RandomInt",GetRandomInt(0x0,0x100))
    endfunction
endscope

而它還有另一個功能就是可以內嵌於函數庫

例子:
library A
    scope B
        globals
            private integer x = 4
        endglobals

        public function display takes nothing returns nothing
            call BJDebugMsg(I2S(x))
        endfunction
    endscope

    scope C
        globals
            public integer x = 5
        endglobals

        public function display takes nothing returns nothing
            call BJDebugMsg(I2S(x))
        endfunction
    endscope

    function Msg takes nothing returns nothing
        call B_display() //正確
        call C_display() //正確
    endfunction
endlibrary

function Outside takes nothing returns nothing
    set A_B_x = 0 //錯誤 不可調用私有變數
    set A_C_x = 7 //正確
    call Msg() //正確
    call A_B_display() //正確
    call A_C_display() //正確
endfunction

範圍甚至可以內嵌範圍內
而且沒有限制層數

例子:
scope A
    scope B
        scope C
            private function Test takes nothing returns nothing
            endfunction
        endscope
    endscope
endscope

但內嵌可能會造成語法判斷上的問題
例如你不能這樣做

例子:
library A
    globals
        private integer x = 3
    endglobals

    scope B
        globals
            private integer x = 4 //錯誤:名稱衝突
        endglobals
    endscope
endlibrary

這樣會讓系統不清楚你哪時候要使用函數庫私有哪時候用範圍私有
於是就有了先來後到的問題
或許你可以嘗試這樣寫

例子:
library A
    scope B
        globals
            private integer x = 4 //正確
        endglobals
    endscope

    globals
        private integer x = 3 //正確
    endglobals
endlibrary

SCOPE_PREFIX 與 SCOPE_PRIVATE

<前綴名>
有些時候你可能會需要函數庫的前綴名

例子:

library test
    private function A takes nothing returns nothing
        call BJDebugMsg("...")
    endfunction

    public function B takes nothing returns nothing
        call BJDebugMsg("...")
    endfunction

    function Msg takes nothing returns nothing
         call ExecuteFunc(SCOPE_PRIVATE+"A")
         call ExecuteFunc(SCOPE_PREFIX+"B")
    endfunction
endlibrary

另外. 前綴名在函數庫(library)一樣有用

回到頁頂

Structs

Structs

<結構>
這解釋太困難..(待補)
暫時先直接看例子

例子:

struct Point
    real x
    real y
endstruct

function testpairs takes nothing returns nothing
    local Point p = Point.create()

        set p.x = 140.0
        set p.y = -80.0

        call BJDebugMsg("座標"+"("+R2S(p.x)+","+R2S(p.y)+")")

    call Point.destroy(p)
endfunction

如上. 結構是一個可以動態操控. 由一個結構來控制多個數組的類型
並且在結構內定義全域變數並不需要globals
.create.destroy是定義結構後就會自動生成的關鍵字
顧名思義. 前者功能是創造一個新的索引. 後者是刪除一個舊的索引. 這功能用於動態的操控變數

定義結構後
你可以將它視為一個新的類型來使用

例子:
struct Point
    real x
    real y
endstruct

function testpairs takes Point p1 returns Point
    local Point p2
        set p2.x = (p1.x + p2.x) / 2
        set p2.y = (p1.y + p2.y) / 2
    return p2
endfunction

globals
    Point array heropoint
    Point applepoint
    Point bbqpoint = 0 //正確:因為原理的關係 所以可以定義整數類型
    Point pigpoint = Point.create() //錯誤:全域變數中不能使用動態的方法
endglobals

如果在結構內定義初值. 那它的定義會是動態的
這會讓我們更方便的動態控制它

例子:
globals
    real xIndex = 0
    real yIndex = 0
endglobals

struct Point
    real x = xIndex
    real y = yIndex
endstruct

function Init takes nothing returns nothing
    local Point p = Point.create()

        call BJDebugMsg("座標"+"("+R2S(p.x)+","+R2S(p.y)+")")
        //顯示:座標(0,0)

        set xIndex = 10
        set yIndex = -5
        set p = Point.create() //創造一個新的Point

        call BJDebugMsg("座標"+"("+R2S(p.x)+","+R2S(p.y)+")")
        //顯示:座標(10,-5)
endfunction

結構也可以內嵌
方法很簡單. 只要把一個結構放到另一個結構就可以了

例子:
struct Point
    real x = 0
    real y = 0
endstruct

struct PointGroup
    Point p1 = 0
    Point p2 = 0
endstruct

function test takes nothing returns nothing
    local PointGroup pg = PointGroup.create()

        set pg.p1 = Point.create()
        set pg.p2 = Point.create()

        set pg.p1.x = 7
        set pg.p1.y = -1
        set pg.p2.x = 10
        set pg.p2.y = pg.p1.y * 2

        call BJDebugMsg("p1座標"+"("+R2S(pg.p1.x)+","+R2S(pg.p1.y)+")")
        //顯示:p1座標(7,-1)

        call BJDebugMsg("p2座標"+"("+R2S(pg.p2.x)+","+R2S(pg.p2.y)+")")
        //顯示:p2座標(10,-2)

    //回收方法一樣 但要注意先後順序
    call pg.p1.destroy()
    call pg.p2.destroy()
    call pg.destroy() //母類型要比子類型晚刪除
endfunction

結構及結構內部也可以使用私有化(private)與公用化(public)

例子:
scope A
    public struct Point
        real x
        real y
    endstruct

    globals
        private Point p1
        public  Point p2
    endglobals

    public function Msg takes nothing returns nothing
        set p1 = p1.create()

        set p1.x = 3
        set p1.y = 7

        call BJDebugMsg("p1座標"+"("+R2S(p1.x)+","+R2S(p1.y)+")")

        call p1.destroy()
    endfunction
endscope

function test takes nothing returns nothing
    local A_Point p = A_Point.create()

        set p.x = 6
        set p.y = -9

        call BJDebugMsg("p2座標"+"("+R2S(p2.x)+","+R2S(p2.y)+")")
        // 顯示:p2座標(6,-9)

        call A_Msg()
        // 顯示:p1座標(3,7)

    call p.destroy()
endfunction

特別說明一下
code類型是沒有辦法列陣的
所以也不能動態使用

例子:
struct test
    code ABC //錯誤
endstruct

Methods

<方法>
既然有了動態的變數控制. 那當然也少不了動態的函數

例子:

struct point
    real x = 0
    real y = 0

    method move takes real newx, real newy returns nothing
        set this.x = newx //this是一個關鍵字 它代表了動態索引
        set .y = newy //this也可以忽略不填 因為它是一個默認項
    endmethod
endstruct

function testpoint takes nothing returns nothing
    local point p = point.create()
        call p.move(56,89)

        call BJDebugMsg("座標"+"("+R2S(p.x)+","+R2S(p.y)+")")
endfunction

即使是動態的. 但它們也是可以私有化(private)與公用化(public)的

例子:
struct encap
    private real a = 2.0
    public  real b = 0.5

    public method aMsg takes nothing returns nothing
        call BJDebugMsg(R2S(this.a))
    endmethod

    private method bMsg takes nothing returns nothing
        call BJDebugMsg(R2S(this.b))
    endmethod
endstruct

function test takes nothing returns nothing
    local encap e = encap.create()
        call BJDebugMsg(R2S(e.a)) //錯誤:無法調用私有變數
        call BJDebugMsg(R2S(e.b)) //正確
        call e.aMsg() //正確
        call e.bMsg() //錯誤:無法調用私有函數
endfunction

Static

<靜態>
有的時候. 你可能在結構內使用不需要動態的變數或是函數
這時候你就可以使用關鍵字「static」

例子:

struct ArrayReal
    static  integer i = 0
    private real a = 3.2
    public  real b = 7.5

    method randomize takes nothing returns nothing
        set this.a = GetRandomReal(0,100)
        set this.b = GetRandomReal(0,100)
        set ArrayReal.i = ArrayReal.i + 1 //靜態的來源索引必須填入結構名
        call BJDebugMsg("已重新抽取隨機數"+I2S(ArrayReal.i)+"次")
    endmethod
endstruct

如果你需要直接使用function (code)
那就必須要讓他為靜態

例子:
struct test
    static method ABC takes nothing returns nothing
        call BJDebugMsg("ABC")
    endmethod
endstruct

function Msg takes nothing returns nothing
        call TimerStart(CreateTimer(),3.5,false,function test.ABC)
endfunction

thistype

<當前結構>
沒什麼特別的
單純讓你填類型時比較簡單方便之類的

例子:

struct test 
    thistype array ts
    method tester takes nothing returns thistype
        return thistype.create()
    endmethod
endstruct

//編譯後將會自動變成

struct test 
    test array ts
    method tester takes nothing returns test
        return test.create()
    endmethod
endstruct

allocate 與 deallocate

<內部分配>
有的時候. 你可能會想使用「.create」或「.destroy」兩個關鍵字
這時你就可以使用「.allocate」與「.deallocate」這兩個隱藏的關鍵字來取代它們

例子:

struct point
    real x = 0
    real y = 0

    // create必須為靜態
    static method create takes real tx, real ty returns point
        local point this = point.allocate() //靜態的情況下
                                            //使用this當名稱也是可以的
            set this.x = tx
            set this.y = ty
        return this
    endmethod

    // destroy必須是動態 並且引數及傳回都必須為nothing
    method destroy takes nothing returns nothing
        //座標被刪除後就將座標移動到(0,0)吧
        set this.x = 0
        set this.y = 0

        //因為原本的destroy被取代了 所以手動必須取消分配
        call this.deallocate()
    endmethod
endstruct

補充說明 這兩個關鍵字僅限結構內部使用
如果在外部使用它是會報錯的喔

例子:
struct point
    real x = 0
    real y = 0
endstruct

function test takes nothing returns nothing
    local point p

        set p = p.create() //正確
        set p = p.allocate() //錯誤:.allocate是結構內部關鍵字

    call p.destroy() //正確
    call p.deallocate() //錯誤:.deallocate是結構內部關鍵字
endfunction

onDestroy

<額外移除>
「onDestroy」也是一個關鍵字
它作用於在動態結構被「.destroy」自動執行函數
不過在「.deallocate」關鍵字的豋場之後. 此關鍵字並沒有什麼用途了. 看看就好吧...

例子:

struct point
    real x = GetRandomReal(-100,100)
    real y = GetRandomReal(-100,100)

    // onDestroy關鍵字必須為動態 引數必須為nothing
    method onDestroy takes nothing returns nothing
        set this.x = 0
        set this.y = 0
    endmethod
endstruct

function test takes nothing returns nothing
    local point p = p.create()

        call BJDebugMsg("座標"+"("+R2S(p.x)+","+R2S(p.y)+")")
        //顯示:座標(-100~100,-100~100)

        call p.destroy()

        call BJDebugMsg("座標"+"("+R2S(p.x)+","+R2S(p.y)+")")
        //顯示:座標(0,0)
endfunction

onInit

<結構初始化>
有的時候你可能會需要初始化一些變數或是其他
這時候就可以使用關鍵字「onInit」

例子:

struct A
    static unit array Hero

    // onInit關鍵字必須為靜態 引數及傳回都必須為nothing
    // 一般onInit不會被外部所需要 所以通常會加上private
    private static method onInit takes nothing returns nothing
        local integer i = 0
            loop
                exitwhen i == 12
                set A.Hero[i] = CreateUnit(Player(i),'Hero',0,0,270)
                set i = i + 1
            endloop
    endmethod
endstruct

Operator

<運算子>
一種變化的「Methods」
說明無意義. 直接看例子吧

例子:

struct point
    private static location Loc = Location(0,0)
    real x
    real y

    method operator z takes nothing returns real
        call MoveLocation(point.Loc,this.x,this.y)
        return GetLocationZ(point.Loc)
    endmethod
endstruct

function test takes nothing returns nothing
    local unit  u = GetTriggerUnit()
    local point p = point.create()

        set p.x = GetUnitX(u)
        set p.y = GetUnitY(u)

        call BJDebugMsg("部隊位置"+"("+R2S(p.x)+","+R2S(p.y)+","+R2S(p.z)+")")
        //顯示:部隊位置(x,y,z)

    set u = null
endfunction

除了一般名稱外. 甚至可以用於其他的運算功能
能使用的有「名稱」「名稱=」「[]」「[]=」「<」「==」這六種

例子:
struct operatortest
    string str=""

    method operator [] takes integer i returns string
        return SubString(.str,i,i+1)
    endmethod

    method operator []= takes integer i, string ch returns nothing
        local string s1 = SubString(this.str,0,i)
        local string s2 = SubString(this.str,i+1,StringLength(this.str)-i)
        set this.str = s1 + ch + s2
    endmethod
endstruct

function test takes nothing returns nothing
    local operatortest x = operatortest.create()

        set x.str = "Test"
        call BJDebugMsg( x[1] ) //顯示: e
        call BJDebugMsg( x[0] + x[3] ) //顯示: Tt

        set x[1] = "."
        call BJDebugMsg( x.str ) //顯示: t.s
endfunction

它也可以用於靜態. 再丟一個例子吧

例子:
struct EffectUnit
    private unit   dummy = CreateUnit(Player(15),'h000',0,0,0)
    private string path
    private effect Effect

    method operator x takes nothing returns real
        return GetUnitX(this.dummy)
    endmethod

    method operator y takes nothing returns real
        return GetUnitY(this.dummy)
    endmethod

    method operator angle takes nothing returns real
        return GetUnitFacing(this.dummy)
    endmethod

    method operator x= takes real value returns nothing
        call SetUnitX(this.dummy,value)
    endmethod

    method operator y= takes real value returns nothing
        call SetUnitY(this.dummy,value)
    endmethod

    method operator angle= takes real value returns nothing
        call SetUnitFacingTimed(this.dummy,value,0)
    endmethod

    static method operator [] takes EffectUnit this returns EffectUnit
        return EffectUnit(this)
    endmethod

    static method create takes string path, string attachpoint returns EffectUnit
        local EffectUnit this = EffectUnit.allocate()
            set this.path = path
            set this.Effect = AddSpecialEffectTarget(path,this.dummy,attachpoint)
        return this
    endmethod

    method destroy takes nothing returns nothing
        call DestroyEffect(this.Effect)
        call KillUnit(this.dummy)
        call RemoveUnit(this.dummy)
        call this.deallocate()
    endmethod
endstruct

Array members

<列陣成員>
結構內的動態變數也是可以使用列陣的

例子:

struct stack
    private integer array V [100] //列陣大小一定要填
    private integer N = 0

    method push takes integer i returns nothing
        set this.V[this.N] = i
        set this.N = this.N + 1
    endmethod

    method pop takes nothing returns nothing
        set this.N = this.N - 1
    endmethod

    method top takes nothing returns integer
        return this.V[thsi.N-1]
    endmethod

    method empty takes nothing returns boolean
        return (this.N == 0)
    endmethod

    method full takes nothing returns boolean
        return (this.N == this.V.size) //任何有指定列陣大小的變數
                                       //都可以使用.size關鍵字
                                       //它指向你當初定義的大小 (此範例為100)
    endmethod
endstruct

Extending structs

<結構繼承>
這是一個可以結構(struct)將做延伸的功能
例如英雄是部隊的子類型
所以部隊和英雄的結構概念就是

例子:

struct Unit
    integer id
    unit object
    real name
    real mhp
    real mmp
    real hp
    real mp
    //...中間省略

    static method create takes player p, integer typeid, real x, real y, real a returns A
        local Unit this = Unit.allocate()
            set this.object = CreateUnit(p,typeid,x,y,a)
            set this.id = GetHandleId(this.object)
            set this.mhp = GetUnitState(this.object,UNIT_STATE_MAX_LIFE)
            //...中間省略
        return this
    endmethod
endstruct

struct Hero extends Unit
    integer str
    integer agi
    integer int
    //...中間省略

    static method create takes player p, integer typeid, real x, real y, real a returns B
        local Hero this = Hero.allocate(p,typeid,x,y,a) //分配也可以延伸
            set this.str = GetHeroStr(this.object,false)
            set this.agi = GetHeroAgi(this.object,false)
            set this.int = GetHeroInt(this.object,false)
            //...中間省略
        return this
    endmethod
endstruct

這只是個參考. 實際上不是這樣..
另外要注意擴展的動態變數及函數都需要注意名稱衝突

Interfaces

<接口>
它的主要功能類似"中繼站"
它用於判斷你的需求. 自動分辨該用什麼子結構

例子:

interface A
    method str takes nothing returns string
endinterface

struct B extends A
    method str takes nothing returns string
        return "B結構"
    endmethod
endstruct

struct C extends A
    method str takes nothing returns string
        return "C結構"
    endmethod
endstruct

function Msg takes A aa returns nothing
    call BJDebugMsg(aa.str())
endfunction

function test takes nothing returns nothing
    local B bb = B.create()
    local C cc = C.create()

    call Msg(bb) //顯示: B結構
    call Msg(cc) //顯示: C結構
endfunction

不一定每個子結構都存在接口
所以可以檢查接口所指向的函數存不存在
使用關鍵字「.exists」

例子:
interface myInterface
    method myMethod1 takes nothing returns nothing
    method myMethod2 takes nothing returns nothing
endinterface

struct myStruct
    method myMethod1 takes nothing returns nothing
        call BJDebugMsg("@@")
    endmethod
endstruct

function test takes nothing returns nothing
    local myInterface mi = myStruct.create()
        if mi.myMethod1.exists then //存在
            call BJDebugMsg("myStruct.myMethod1 存在")
        else
            call BJDebugMsg("myStruct.myMethod1 不存在")
        endif
        if mi.myMethod2.exists then //不存在
            call BJDebugMsg("myStruct.myMethod2 存在")
        else
            call BJDebugMsg("myStruct.myMethod2 不存在")
        endif
endfunction

另外接口(Interfaces)可以當作結構(struct)來用

Stub

<存根>
此功能與接口(Interfaces)完全相同..
再一些情況下你可能會比較適合使用它

例子:

struct Parent
    stub method xx takes nothing returns nothing
        call BJDebugMsg("Parent")
    endmethod

    method doSomething takes nothing returns nothing
        call this.xx()
        call this.xx()
    endmethod
endstruct

struct ChildA extends Parent
    method xx takes nothing returns nothing
        call BJDebugMsg("Child A")
    endmethod
endstruct

struct ChildB extends Parent
    method xx takes nothing returns nothing
        call BJDebugMsg("Child B")
    endmethod
endstruct


function test takes nothing returns nothing
    local Parent P = Parent.create()
    local Parent A = ChildA.create()
    local Parent B = ChildB.create()

    call P.doSomething() //顯示: Parent
    call A.doSomething() //顯示: Child A
    call B.doSomething() //顯示 Child B
endfunction

super

<超載存根>
存根的延伸使用法
使用它可以同時運行存根與擴展

例子:

struct Parent
    stub method xx takes nothing returns nothing
        call BJDebugMsg("Parent")
    endmethod

    method doSomething takes nothing returns nothing
        call this.xx()
        call this.xx()
    endmethod
endstruct

struct ChildA extends Parent
    method xx takes nothing returns nothing
        call BJDebugMsg("Child A")
        call super.xx()
    endmethod
endstruct

struct ChildB extends Parent
    method xx takes nothing returns nothing
        call BJDebugMsg("Child B")
    endmethod
endstruct

function test takes nothing returns nothing
 local Parent P = Parent.create()
 local Parent A = ChildA.create()
 local Parent B = ChildB.create()

    call P.doSomething() //顯示: Parent
    call A.doSomething() //顯示: Child A
                         //      Parent
    call B.doSomething() //顯示: Child B
endfunction

Module

<模塊>
有的時候. 你可能會常常用完全相同的結構部分代碼
如果先用模塊裝起來
你想使用的時候就可以簡單貼上
如果需要修改時. 它會省去不少麻煩

例子:

module MyModule
    method repeat1000 takes nothing returns nothing
        local integer i = 0
            loop
                exitwhen i == 1000
                call this.sub() //執行 this.sub
                                //它必須存在結構中
                set i = i + 1
            endloop
    endmethod
endmodule

struct MyStruct
    method sub takes nothing returns nothing
        call BJDebugMsg("Hello world")
    endmethod

    implement MyModule //在此處匯入模塊
endstruct

function Test takes MyStruct ms returns nothing
    call ms.repeat1000() //ms.sub將會執行1000次
endfunction

它有個子關鍵字「optional」
使用它之後. 模板的存在就非必要
有點抽象... 比較白話一點就是如果模板存在就使用. 如果不存在就不使用
除了去拿別人的範例或系統以外.. 一般應該用不到
不過既然有這東西. 還是說明一下吧

例子:
module MyOtherModule
    method uhOh takes nothing returns nothing
    endmethod
endmodule

module MyModule

    implement optional MyOtherModule //模板MyOtherModule存在
                                     //匯入該模板

    implement optional OptionalModule //模板OptionalModule不存在
                                      //所以此行忽略 

    static method swap takes thistype A , thistype B returns nothing
        local thistype C = thistype.allocate()
            call C.copy(A)
            call A.copy(B)
            call B.copy(C)
            call C.destroy()
    endmethod
endmodule

struct MyStruct
    integer a
    integer b
    integer c

    method copy takes MyStruct x returns nothing
        set this.a = x.a
        set this.b = x.b
        set this.c = x.c
    endmethod

    implement MyModule
    implement MyOtherModule //此模板已經在MyModule內存在
                            //所以此行忽略
endstruct

function MyTest takes MyStruct A, MyStruct B returns nothing
    call MyStruct.swap(A,B)
endfunction

Array structs

<結構模塊>
這是一個很好用的結構用法
它提供了結構(structs) 的基礎框架
細部功能都可以自己寫入
使用方法很多..就不一一舉例了

例子:

struct playerdata extends array
    integer a
    integer b
    integer c
endstruct

function init takes nothing returns nothing
    local playerdata pd

        set playerdata[3].a = 12  //附帶的[]與原本的()意思一樣 且可以通用
        set playerdata[3].b = 34
        set playerdata[3].c = 500

        set pd=playerdata[4] //也可以先指定位置
        set pd.a=17
        set pd.b=111
        set pd.c=501
endfunction

function updatePlayerStuff takes player p returns nothing
    local integer i = GetPlayerId(p)

        set playerdata[i].a = playerdata[i].b
endfunction

效率派的通常會自己寫分配

例子:
struct point extends array
    private static integer       Index    = 0
    private static integer       Link     = 0
    private static integer array LinkList
    real x = 0 //錯誤:不可有動態初值
    real y     //正確

    static method create takes real tx, real ty returns point
        local integer this
            if .Link == 0 then
                //序號增加
                set .Index = .Index + 1
                set this = .Index
            else
                //使用回收號
                set this = .LinkList[.Link]
                set .Link = .Link - 1
            endif
            set this.x = tx //錯誤:一個小bug 填入this反而會造成誤判
            set .y = ty     //正確:不用填就可以解決了
        return this
    endmethod

    method destroy takes nothing returns nothing
        set .Link = .Link + 1
        set .LinkList[.Link] = this
        //.....
        //其他清除
        set this.x = 0
        set this.y = 0
        //.....
    endmethod
endstruct

如果要大量使用這樣的方法
可以使用模塊(module)
這邊就不再附例子了

Delegate

<代理>
此關鍵字會將處理中的結構類型換掉
如果聽不懂就算了..
這是個使用率極低的東西
如果你vJass語法檢查會出現不合你想要的執行類型的錯誤時
你可以試試看此關鍵字

例子:

struct A
    private real x
    private real y

    public method performAction takes nothing returns nothing
        call DestroyEffect( AddSpecialEffect("path\\model.mdl", this.x, this.y) )
    endmethod
endstruct

struct B
    delegate A deleg

    static method create takes nothing returns B
        local B b = B.allocate()
            set B.deleg = A.create()
    endmethod
endstruct

function testsomething takes nothing returns nothing
    local B myB = B.create()

        call myB.performAction()

        call myB.deleg.performAction()
endfunction

Loading structs from SLK files

<從slk檔案中讀取結構>
*AS紀錄 此功能實用性過低..有機會再補

回到頁頂

其他類型

Static if

<靜態if>
它使用在你想要接換不同結果時
與debug模式類似
使用方法請看例子

例子:

globals
    constant boolean MODE_TEST = true
endglobals

function MapInit takes nothing returns nothing
    static if ( MODE_TEST ) then
        call BJDebugMsg("Test模式") //編譯後留下此處 因為MODE_TEST為true
    else
        call BJDebugMsg("一般模式") //編譯後被砍掉
    endif
endfunction

它也可以在函數外部

例子:
globals
    constant boolean VER124 = true
endglobals

static if ( VER124 ) then
    function H2I takes handle v returns integer
        return GetHandleId( v )
    endfunction
else
    function H2I takes handle v returns integer
        return v
        return 0
    endfunction
endif

Text Macros

<文本巨集>
有些時候. 你可能需要不完全相同的函數. 又或者是一些部分的程式碼
這時候就可以使用它
可以省略很多需要複製貼上修改的部分

定義方式:

//! textmacro 名稱 takes 參數1, 參數2, 參數3 ....   //(開始錄製)
    //錄製的內容參數前後需要$標記
    //例如:
    function $參數1$ takes nothing returns $參數2$
        return $參數3$
    endfunction
//! endtextmacro    //(結束錄製)

//! runtextmacro 名稱("參數1","參數2","參數3" ....)    //(印出錄製的內容)

\\
例子:

//! textmacro Func_NullType takes Name, Type, Ret
    function $Name$ takes nothing returns $Type$
        return $Ret$
    endfunction
//! endtextmacro

//! runtextmacro Func_NullType("NullReal","real","0.0")
//! runtextmacro Func_NullType("NullUnit","unit","null")
//! runtextmacro Func_NullType("NullGroup","group","null")

編譯後會變這樣

    function NullReal takes nothing returns real
        return 0.0
    endfunction

    function NullUnit takes nothing returns unit
        return null
    endfunction

    function NullGroup takes nothing returns group
        return null
    endfunction

它沒有使用範圍的限制
只要你語法對就可以正確使用

Dynamic arrays

<動態列陣>
提供了全域變數的分配. 以及分組功能
這邊還是直接看例子吧..

例子:

type Index extends integer array [8]

function test takes nothing returns Index
    local Index n = Index.create()
    local integer i = 0
        loop
            exitwhen i == Index.size //動態列陣中.size代表它的分組數量
            set n[i]=i
            set i = i + 1
        endloop
    return r
endfunction

function test2 takes nothing returns Index
    local Index n = test()
    local integer i = 0
        loop
            exitwhen i == Index.size
            call BJDebugMsg(I2S(n[i])) //顯示數字1~8 一共8行
            set i = i + 1
        endloop
    return r
endfunction

它甚至可以互相延伸

例子:
type Index extends integer array[3]
type Index_Array extends Index array[3]

function test takes nothing returns Index
    local Index_Array na = Index_Array.create()
    local integer i = 0
    local integer n
        loop
            exitwhen i == Index_Array.size
            set na[i] = Index.create()
            set n = 0
            loop
                exitwhen n == Index.size
                set na[i][n] = n * i
                set n = n + 1
            endloop
            set i = i + 1
        endloop
    return n
endfunction

Functions as objects

<對象函數>
這只是一個共稱
詳細請往下看吧

注。以下關鍵字都只能在你的自訂地圖腳本中使用
  直接性的使用common.j、blizzard.j、natives都是不行的

Evaluate

<對象函數>
有的時候. 你可能會想使用後面的函數
但有"向前參照"機制的存在
所以你可能會需要分成兩段或用別的方法取代
但這個方法可以輕鬆解決你的問題
關鍵字「.evaluate」

例子:

function A takes real x returns real
    if GetRandomInt(0,1) == 0 then
        return B(x*0.02) //錯誤
    endif
    return x
endfunction

function B takes real x returns real
    if GetRandomInt(0,1) == 1 then
        return A(x*1000.)
    endif
    return x
endfunction

//放上關鍵字

function A takes real x returns real
    if GetRandomInt(0,1) == 0 then
        return B.evaluate(x*0.02) //正確
    endif
    return x
endfunction

function B takes real x returns real
    if GetRandomInt(0,1) == 1 then
        return A(x*1000.)
    endif
    return x
endfunction

Execute

<額外執行(函數)>
原本的"ExecuteFunc"使用上有必須填對正確的函數名稱與不能有參數的麻煩
但此功能將它改善了
直接看使用範例吧
關鍵字「.execute」

例子:

function DestroyEffectAfter takes effect fx, real t returns nothing
    call TriggerSleepAction(t)
    call DestroyEffect(fx)
endfunction

function test takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local effect f = AddSpecialEffectTarget("Abilities\\Spells\\Undead\\Cripple\\CrippleTarget.mdl",u,"chest")

        call DestroyEffectAfter.execute(f,3.0)

    set u = null
    set f = null
endfunction

Name

<函數名稱>
一個自動套用函數名稱的關鍵字
使用範圍很廣..就不一一說明了
關鍵字「.name」

例子:

scope ABC
    private function aa takes nothing returns nothing
        call BJDebugMsg(aa.name) //顯示: ABC___aa
    endfunction

    public function bb takes nothing returns nothing
        call BJDebugMsg(bb.name) //顯示: ABC_bb
    endfunction

    function cc takes nothing returns nothing
        call ExecuteFunc(aa.name)
        call ExecuteFunc(bb.name)
    endfunction
endscope

如果是模塊就必須這樣用

例子:
struct mystruct
    static method mymethod takes nothing returns nothing
        call BJDebugMsg("ABC")
    endmethod
endstruct

function myfunction takes nothing returns nothing
    call ExecuteFunc(mystruct.mymethod.name)
    call OnAbilityCast('A000',mystruct.mymethod.name)
endfunction

Keys

<key (沒適合的中文..)>
此關鍵字主要用於hashtable
每個key都會自動生成一個不重複的整數
對邏輯思考很有幫助

例子:

scope Tester initializer test

    globals
                 key AAAA
        private  key BBBB
        public   key CCCC

        constant key DDDD
    endglobals

    private function test takes nothing returns nothing
        local hashtable ht = InitHashtable()
            call SaveInteger(ht, AAAA, BBBB, 5)
            call SaveInteger(ht, AAAA, CCCC, 7)
            call SaveReal(ht, AAAA, DDDD, LoadInteger(ht,AAAA, BBBB) * 0.05 )
            call BJDebugMsg( R2S( LoadReal(ht,AAAA,DDDD) ) )

            call BJDebugMsg( I2S(BBBB) )
            call BJDebugMsg( I2S(CCCC) )
    endfunction
endscope

Typecast

<類型轉換>
它被頻繁用於語法與邏輯的判斷上

例子:

struct point
    static integer amount = 0
    real x = 0
    real y = 0
    boolean using = true

    static method create takes real tx, real ty returns point
        local point this = point.allocate()
            set .amount = .amount + 1
            set this.x = tx
            set this.y = ty

            call BJDebugMsg("創造新座標  編號="+I2S(integer(this)))
        return this
    endmethod

    method destroy takes nothing returns nothing
        set this.x = 0
        set this.y = 0
        set this.using = false

        loop
            exitwhen point(.amount).using == true
            set .amount = .amount - 1
        endloop

        call this.deallocate()
    endmethod
endstruct

function RandomMovePoint takes nothing returns nothing
    local integer n = GetRandomInt(1,8190)

        set point(n).x = GetRandomReal(-1000,1000)
        set point(n).y = GetRandomReal(-1000,1000)
endfunction

Function interfaces

<函數接口>
與結構的接口(interfaces)大同小異
就不再次說明了

例子:

function interface Arealfunction takes real x returns real

function double takes real x returns real
    return x*2.0
endfunction

function triple takes real x returns real
    return x*2.0
endfunction

function Test1 takes real x, Arealfunction F returns real
    return F.evaluate(F.evaluate(x)*F.evaluate(x))
endfunction

function Test2 takes nothing returns nothing
    local Arealfunction fun = Arealfunction.double //可以將"類型"視為一種常數

    call BJDebugMsg(R2S( Test1(1.2,fun)))

    call BJDebugMsg(R2S(Test1(1.2,Arealfunction.triple))) //常數可以直接輸入
endfunction

hook

<綁定>
屬於額外執行的一種用法
如果你執行的函數已經被綁定. 它會自動執行額外的函數 (執行原本函數前)
此功能的功能上有限制
因此應用範圍並不廣
且此關鍵字的原始代碼頗為沉長
請不要太貪心過於大量使用

例子:

function onRemoval takes unit u returns nothing
    call BJDebugMsg("一個部隊已經被移除!")
endfunction

struct err
    static method onrem takes unit u returns nothing 
       call BJDebugMsg("一個部隊已經被移除!")
    endmethod
endstruct

hook RemoveUnit onRemoval
hook RemoveUnit err.onrem

// 地圖中執行RemoveUnit就會自動執行 onRemoval 與 err.onrem

inject

<注入>
它可以直接修改地圖腳本main
如果你有什麼動作需要再VJ函數初始化前執行
那你就會需要使用此關鍵字

例子:

//! inject main
    //..自訂執行區1

    //! dovjassinit
    //這是一個必要的關鍵字
    //它代表你要初始化 vJass 的時機

    //..自訂執行區2

    call InitCustomTriggers()   //一些重要的關鍵字必須要自己填
                                //如果少填了可能會缺少部分功能
                                //詳細可以自己匯出地圖腳本檔案查詢
//! endinject

External Tools

<額外工具>
*AS紀錄 此功能實用性過低..有機會再補

Import external script files

<匯入額外自定檔案>
一個可以匯入你電腦存在的地圖腳本 (不含編譯)

例子:

//匯入預設路徑的scriptfile.j檔案
//預設路徑可以從NewGen\jasshelper.conf中修改 (預設為NewGen\Jass)
//! import "scriptfile.j"

//直接指定路徑也是可以的
//! import "C:\scriptfile.j"

回到頁頂

儲存增強

導言

*AS紀錄 此處待補
預防一些囧情況發生..只先說明請不要太貪心使用過多的分配量

Sized arrays

<列陣大小>
它可以正確的指定列陣的大小
請看例子

例子:

globals
    integer array myArray [500]
endglobals

function test takes nothing returns nothing
    local integer i = 0

        loop
            exitwhen i >= myArray.size //指定列陣大小會產生關鍵字.size
                                       //它代表你當初指定的大小
            set myArray[i] = i
            set i = i + 1
        endloop

        call BJDebugMsg(I2S(myArray.size)) //顯示: 500
endfunction

它也可以超過8191的限制

globals
    integer array myArray [15000]
endglobals

//或是這樣寫也是可以的

globals
    constant integer Q = 60000
    integer array myArray [Q]
endglobals

2D arrays

<二維列陣>
說明建議直接google查詢

例子:

globals
    integer array mat1 [100][1500]

    constant integer W = 100
    constant integer H = 1500
    integer array mat2 [W][H]
endglobals

function test takes nothing returns nothing
    local integer i = 0
    local integer j = 0
    local integer c = 0

        call BJDebugMsg(I2S(mat1.size)) //顯示: 15000 (100x1500)

        loop
            exitwhen i == mat1.width //二維列陣關鍵字.width 代表寬度 (x軸)
            set j = 0
            loop
                exitwhen j == mat1.height //二維列陣關鍵字.height 代表高度 (y軸)
                set c = c + 1
                set mat1[i][j] = c
                set j = j + 1
            endloop
            set i = i + 1
        endloop

        call BJDebugMsg(I2S(mat2.width)) //顯示: 100

        call BJDebugMsg(I2S(mat1[0][1])) //顯示: 2
endfunction

Structs with more index space

<增加結構分配量>
結構(structs)預設的分配量為8190
有的時候你可能會使用到更多
那此方法正符合你的需要

例子:

struct X [10000]  //分配10000組
    integer a
    integer b
endstruct

這不會影響動態變數的列陣
甚至也可以提升它們的分配最大值

例子:
struct X [10000]
    integer a[2]  //可以使用5000個  (10000/2)
    integer b[5]  //可以使用2000個  (10000/5)
endstruct

延伸的結構也會被設定相同的分配量

例子:
interface A [20000]
    method a takes nothing returns nothing
endinterface

struct B extends A
    method a takes nothing returns nothing
       call BJDebugMsg("...")
    endmethod
endstruct

struct C [20000]
    integer x
endstruct

struct D extends C
    integer y
endstruct

// 結構A、B、C、D都獲得20000的分配量

Dynamic arrays with more index space

<增加動態列陣分配量>
動態列陣(Dynamic arrays)也可以提升它的分配量

例子:

//原本
type myDyArray extends integer array [200] //預設8190分配量
                                           //每200為一組
                                           //總共可分配40組

//增加
type myDyArray extends integer array [200,40000] //提升分配量至40000
                                                 //每200為一組
                                                 //總共可分配200組

回到頁頂

Jass Syntax extensions

Colon

<克隆>
一個將列陣的寫法轉換的方式
通常用於排版

例子:

function test takes nothing returns nothing
    local integer a = 3
    local integer array X

    //以下2個為一組的code意思都是一樣的

    set X[a]=10
    set a:X =10

    set X[a] = X[a] + 10
    set a:X = a:X +10 

    set X[3]=1000
    set 3:X =1000
endfunction

Delimited comments

<分隔註解>
直接看例子吧

例子:

/*  只要再關鍵字中間的文本通通都會被刪除
    所以如此這般填入註解也是可以
*/

function test takes nothing returns nothing
    call Something( /*5*/ 66) /* 數字5已經被排除 所以只有66有效 */

    /* 這樣寫的話就是完全被刪除
    call Something( /*5*/ 66)
    */

    // 它甚至可以用來斷行
    call BJDebugMsg("Notice how the previous comment start was ignored" + /*
    */ +"because it was inside a 'normal' comment " + /*
    */ +"Also notice how we made the parser skipped the previous " + /*
    */ +"line breaks because they were inside a comment" + /*
    */ "These comments do not count if they are /*inside a string*/ ... ")
endfunction

回到頁頂

Zinc

※AS紀錄 有空再說..

回到頁頂

最後由 AppleSheep 於 2009年12月16日 3:09 am 編輯,總共編輯了 15 次。
線上MSN

精華文章:
流連版 遺失的記憶
蘋果UI 最新1.8.8
Apple NewGen 與蘋果UI同步更新 (支援1.24)
Visual Jass (vJass) 教學 (初步完成)

圖檔
圖檔
圖檔
圖檔
頭像
AppleSheep
騎士
騎士
 
文章: 267
註冊時間: 2008年03月06日 11:23 am
來自: 虛無

Re: [教學]Visual Jass (vJass) 教學(完成60%)

文章fennce » 2009年10月10日 12:24 pm

蘋果國慶日大放送?!!! :shock:




用力吃掉@@
頭像
fennce
路人
 
文章: 20
註冊時間: 2009年02月07日 8:09 pm

Re: [教學]Visual Jass (vJass) 教學(完成70%)

文章fishofsun » 2009年10月13日 4:46 pm

牛,這才是精華
fishofsun
路人
 
文章: 7
註冊時間: 2009年08月06日 5:55 pm

Re: [教學]Visual Jass (vJass) 教學(完成90%)

文章AppleSheep » 2009年10月13日 7:19 pm

這幾天在休息

估計後天或大後天會補完

關於vJass新的Zinc語法有可能不寫..

--------------------

剩下一點了

這幾天就會完成
線上MSN

精華文章:
流連版 遺失的記憶
蘋果UI 最新1.8.8
Apple NewGen 與蘋果UI同步更新 (支援1.24)
Visual Jass (vJass) 教學 (初步完成)

圖檔
圖檔
圖檔
圖檔
頭像
AppleSheep
騎士
騎士
 
文章: 267
註冊時間: 2008年03月06日 11:23 am
來自: 虛無

Re: [教學]Visual Jass (vJass) 教學(完成90%)

文章crassorz » 2009年10月14日 6:42 pm

AppleSheep 寫:code類型是沒有辦法列陣的
所以也不能動態使用
\\

原來如此
圖檔
我決定不再對伸手牌起反應
除非很有趣
頭像
crassorz
死亡騎士
死亡騎士
 
文章: 2338
註冊時間: 2008年04月06日 5:40 pm
來自: 什麼都有的雜物間

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章AppleSheep » 2009年10月16日 7:54 pm

初步完成

剩下少數無用功能沒寫與幾處待補

距離蘋果生日只剩下4小時又6分鐘

高呼蘋果之名就招待入蘋果鄉(誤很大

歡迎提供任何缺少的部份及說明或例子錯誤的部分
線上MSN

精華文章:
流連版 遺失的記憶
蘋果UI 最新1.8.8
Apple NewGen 與蘋果UI同步更新 (支援1.24)
Visual Jass (vJass) 教學 (初步完成)

圖檔
圖檔
圖檔
圖檔
頭像
AppleSheep
騎士
騎士
 
文章: 267
註冊時間: 2008年03月06日 11:23 am
來自: 虛無

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章AppleSheep » 2009年11月10日 3:39 am

補上介紹(謎:wiki抄很大

SC2的腳本語言不再是Jass2

而是新的Galaxy(銀河)語言

據編輯器製作人布雷特所提供的所有問答來看

銀河語法 使用上比較接近c語言 但是增加許多c++的東西

比較具體就是會新增library(庫) struct(結構) macros(替代)等觀念

已經會Jass的 不妨來試試vJass語法

相信會對SC2的來襲有不少幫助
最後由 AppleSheep 於 2009年11月10日 10:18 pm 編輯,總共編輯了 1 次。
線上MSN

精華文章:
流連版 遺失的記憶
蘋果UI 最新1.8.8
Apple NewGen 與蘋果UI同步更新 (支援1.24)
Visual Jass (vJass) 教學 (初步完成)

圖檔
圖檔
圖檔
圖檔
頭像
AppleSheep
騎士
騎士
 
文章: 267
註冊時間: 2008年03月06日 11:23 am
來自: 虛無

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章rexrainbow » 2009年11月10日 11:13 am

AppleSheep 寫:比較具體就是會新增library(庫) struct(結構) macros(替代)等觀念

macros(替代) -> macro(巨集)

只是慣用語不太一樣而已
Let's Do Something Interesting

圖檔
頭像
rexrainbow
冰霜翼龍
冰霜翼龍
 
文章: 1696
註冊時間: 2008年10月02日 3:33 pm
來自: Taipei, Taiwan

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章tv580025 » 2009年11月10日 9:21 pm

我就是喜歡SC2跟C差不多 :oops:

還有就是SC2內建垃圾回收系統 :D
圖檔
http://weo.sabi.tw/blog <= 這是我的部落格
http://plurk.com/Neo_Yang <= 噗浪請按我


圖檔  凡事不經思索便行動 一條腸子直通到底的笨蛋
頭像
tv580025
冰霜翼龍
冰霜翼龍
 
文章: 1644
註冊時間: 2006年02月09日 12:29 pm
來自: Matrix

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章AppleSheep » 2009年11月10日 9:41 pm

嚴格來說是c多個+ c++少個+

c+

要導向不導向的
線上MSN

精華文章:
流連版 遺失的記憶
蘋果UI 最新1.8.8
Apple NewGen 與蘋果UI同步更新 (支援1.24)
Visual Jass (vJass) 教學 (初步完成)

圖檔
圖檔
圖檔
圖檔
頭像
AppleSheep
騎士
騎士
 
文章: 267
註冊時間: 2008年03月06日 11:23 am
來自: 虛無

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章a15752468 » 2009年11月23日 7:29 pm

想請問一下
Struct的destroy那部分
我把那一整段複製貼上
< jass >

struct point
real x = 0
real y = 0

// create必須為靜態
static method create takes real tx, real ty returns point
local point this = point.allocate() //靜態的情況下
//使用this當名稱也是可以的
set this.x = tx
set this.y = ty
return this
endmethod

// destroy必須是動態 並且引數及傳回都必須為nothing
method destroy takes nothing returns nothing
//座標被刪除後就將座標移動到(0,0)吧
set this.x = 0
set this.y = 0

//因為原本的destroy被取代了 所以手動必須取消分配
call this.deallocate()
endmethod
endstruct
< /jass >


儲存後跳出錯誤..他說destroy重複宣告...

順便問一下..jass加亮語法我有打錯嗎@@?!↑↑↑↑..

在順便問一下
integer array int[50]
是可以用0~49還是0~50...
感謝回答

恩..謝謝
最後由 a15752468 於 2009年11月24日 8:27 pm 編輯,總共編輯了 1 次。
a15752468
村民
村民
 
文章: 48
註冊時間: 2009年08月29日 4:20 pm

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章AppleSheep » 2009年11月23日 10:10 pm

a15752468 寫:想請問一下
Struct的destroy那部分
我把那一整段複製貼上
< jass >

struct point
real x = 0
real y = 0

// create必須為靜態
static method create takes real tx, real ty returns point
local point this = point.allocate() //靜態的情況下
//使用this當名稱也是可以的
set this.x = tx
set this.y = ty
return this
endmethod

// destroy必須是動態 並且引數及傳回都必須為nothing
method destroy takes nothing returns nothing
//座標被刪除後就將座標移動到(0,0)吧
set this.x = 0
set this.y = 0

//因為原本的destroy被取代了 所以手動必須取消分配
call this.deallocate()
endmethod
endstruct
< /jass >


儲存後跳出錯誤..他說destroy重複宣告...

順便問一下..jass加亮語法我有打錯嗎@@?!↑↑↑↑..

在順便問一下
integer array int[50]
是可以用0~49還是0~50...
感謝回答


method destroy是比較後來開放的東西

需要比較新的JassHelper版本

你可以去這裡下載最新的JassHelper自己更新

或是到這裡直接下載最新的Apple NewGeb(已安裝完成)


可以用0~49
線上MSN

精華文章:
流連版 遺失的記憶
蘋果UI 最新1.8.8
Apple NewGen 與蘋果UI同步更新 (支援1.24)
Visual Jass (vJass) 教學 (初步完成)

圖檔
圖檔
圖檔
圖檔
頭像
AppleSheep
騎士
騎士
 
文章: 267
註冊時間: 2008年03月06日 11:23 am
來自: 虛無

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章a15752468 » 2009年11月25日 11:42 am

我下了新版的ASNewGen
可是觸發編輯器那邊...寫程式碼的時候
反白一段文字原本應該是藍底白字
我用新的NewGen反白的時候
變成白底白字...

也就是什麼都看不到...不過一樣可以複製貼上等等...

如果有把function縮起來..那看的到那條黑線...

應該只是單純的藍底變成白底..
舊版的不會..不知道該怎麼辦@@?
a15752468
村民
村民
 
文章: 48
註冊時間: 2009年08月29日 4:20 pm

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章AppleSheep » 2009年11月25日 12:53 pm

NewGen\tesh\底下

有個"舊版.rar"

按右鍵 解壓縮至此

然後取代檔案 就可以了
線上MSN

精華文章:
流連版 遺失的記憶
蘋果UI 最新1.8.8
Apple NewGen 與蘋果UI同步更新 (支援1.24)
Visual Jass (vJass) 教學 (初步完成)

圖檔
圖檔
圖檔
圖檔
頭像
AppleSheep
騎士
騎士
 
文章: 267
註冊時間: 2008年03月06日 11:23 am
來自: 虛無

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章a15752468 » 2009年12月11日 9:32 am

//! textmacro Func_NullType takes A, B, C
$A$, $B$, $C$
//! endtextmacro

//! runtextmacro Func_NullType("NullReal","real","0.0")
//! runtextmacro Func_NullType("NullUnit","unit","null")
//! runtextmacro Func_NullType("NullGroup","group","null")

用這個之後會cjass parser and optimizer會出現應該是Run Time Error的錯誤
a15752468
村民
村民
 
文章: 48
註冊時間: 2009年08月29日 4:20 pm

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章AppleSheep » 2009年12月11日 9:15 pm

或許你需要下載最新的Apple NewGen

應該是舊版的bug

剛剛測試沒這問題
線上MSN

精華文章:
流連版 遺失的記憶
蘋果UI 最新1.8.8
Apple NewGen 與蘋果UI同步更新 (支援1.24)
Visual Jass (vJass) 教學 (初步完成)

圖檔
圖檔
圖檔
圖檔
頭像
AppleSheep
騎士
騎士
 
文章: 267
註冊時間: 2008年03月06日 11:23 am
來自: 虛無

Re: [教學]Visual Jass (vJass) 教學(初步完成)

文章a15752468 » 2009年12月11日 10:44 pm

恩 謝謝
我用的是1.88版的..
上星期下載的...
不過TESH是舊版的..應該不會是TESH的問題吧...

因為新版的反白會全白的...
a15752468
村民
村民
 
文章: 48
註冊時間: 2009年08月29日 4:20 pm


回到 製圖資源區

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客