[Tutorial] Tạo các hiệu ứng skill

Thảo luận trong 'World Editor' bắt đầu bởi Evil_Hunter, 31/10/12.

  1. bgcy_ro002

    bgcy_ro002 Youtube Master Race

    Tham gia ngày:
    27/12/11
    Bài viết:
    41
    Nơi ở:
    ???
    Giờ mình mới hiểu chức năng của cái "Custom script: call RemoveLocation" rồi.
    Đối với dân CNTT mà nói: ko tiết kiệm bộ nhớ hay ko dọn dẹp bộ nhớ ko cần thiết thì ... :((
    Mình vừa đọc xong cái này mình mới biết còn nhiều thứ chưa biết tưởng chừng như mình biết.

    Phải thay đổi ngay mới đc.

    Evil_Hunter -> Bạn cũng đọc đi, mình thấy bạn cũng mắc lỗi giống mình đó.
    Bạn thử tạo nhiều Special Effect rồi sử dụng Ability nhiều lần mà ko dùng "Special Effect - Destroy (Last created special effect)" thử xem, rồi bạn sẽ thấy điều đó.
    Đó là những thứ ta có thể thấy bằng mắt thường.
    Và còn những thứ ta không thể thấy bằng mắt thường nữa.
     
  2. LeoNguyen112

    LeoNguyen112 Dragon Quest

    Tham gia ngày:
    22/5/10
    Bài viết:
    1,438
    Nơi ở:
    TP.HCM
    @Dh-g: sao cái func for t = 1 to [integer] mình dùng không được nhỉ? Copy vào nó báo lỗi unexpected "t"?
     
  3. vuongkkk

    vuongkkk T.E.T.Я.I.S

    Tham gia ngày:
    22/5/10
    Bài viết:
    588
    Nơi ở:
    Hà Nội
    Last edited by a moderator: 31/12/12
  4. LeoNguyen112

    LeoNguyen112 Dragon Quest

    Tham gia ngày:
    22/5/10
    Bài viết:
    1,438
    Nơi ở:
    TP.HCM
    Effect hình bát quái - Trigrams

    Code khá rắc rồi vì dùng point chứ không dùng tọa độ x , y, nhưng đại khái là hoạt động tốt, không leak

    [​IMG]

    ____JASS Code:
    [spoil]
    PHP:
    scope Trigrams initializer init
        globals
            string SFX 
    "Abilities\\Spells\\Orc\\HealingWave\\HealingWaveTarget.mdl"
            
    real RADIUS 400
            real DISTANCE 
    25
            integer SPELLID 
    'ANcl'
        
    endglobals
        
        
    private function Trig_Con takes nothing returns boolean
            
    return ( GetSpellAbilityId() == SPELLID )
        
    endfunction
        
        
    private function Trig_Create takes nothing returns nothing
            local unit u 
    GetTriggerUnit()
            
    local integer i 1
            local integer t 
    1
            local location uloc 
    GetUnitLoc)
            
    local location p
            local location q
            local real a 
    = (DISTANCE 180) / ((RADIUS/2) * 3.14)
            
    local real b = (DISTANCE 180) / (RADIUS 3.14)
            
    loop
                exitwhen t 
    2
                set p 
    PolarProjectionBJuloc RADIUS/270 180 )
                
    loop
                    exitwhen i 
    180
                    set q 
    PolarProjectionBJRADIUS/+ (270 180) )
                    
    call DestroyEffectAddSpecialEffectLocSFX ) )
                    
    call RemoveLocation(q)
                    
    set i 1
                endloop
                call DestroyEffect
    AddSpecialEffectLocSFX ) )
                
    call RemoveLocation(p)
                
    set i 1
                set t 
    1
            endloop
            loop
                exitwhen i 
    >= 360
                set p 
    PolarProjectionBJuloc RADIUS )
                
    call DestroyEffectAddSpecialEffectLocSFX ) )
                
    call RemoveLocation(p)
                
    set i 1
            endloop
            call RemoveLocation
    (uloc)
        
    endfunction
        
        
    private function init takes nothing returns nothing
            local trigger t 
    CreateTrigger()
            
    call TriggerRegisterAnyUnitEventBJEVENT_PLAYER_UNIT_SPELL_EFFECT )
            
    call TriggerAddConditionCondition(function Trig_Con) )
            
    call TriggerAddAction, function Trig_Create )
        
    endfunction
    endscope
    [/spoil]

    ____GUI Code:
    [spoil]
    Mã:
    GUI Trigrams
        Events
            Unit - A unit Starts the effect of an ability
        Conditions
            (Ability being cast) Equal to Channel
        Actions
            Set TRIG__DISTANCE = 50.00
            Set TRIG__RADIUS = 400.00
            Set TRIG__SFX = Abilities\Spells\Orc\HealingWave\HealingWaveTarget.mdl
            Set Trig_RealA = ((TRIG__DISTANCE x 180.00) / ((TRIG__RADIUS / 2.00) x 3.14))
            Set Trig_RealB = ((TRIG__DISTANCE x 180.00) / (TRIG__RADIUS x 3.14))
            Set TempPoint = (Position of (Casting unit))
            Set Trig_Center[1] = (TempPoint offset by (TRIG__RADIUS / 2.00) towards 90.00 degrees)
            Set Trig_Center[2] = (TempPoint offset by (TRIG__RADIUS / 2.00) towards 270.00 degrees)
            For each (Integer Trig_LoopA) from 1 to 2, do (Actions)
                Loop - Actions
                    Special Effect - Create a special effect at Trig_Center[Trig_LoopA] using TRIG__SFX
                    Special Effect - Destroy (Last created special effect)
                    For each (Integer Trig_LoopB) from 1 to (Integer((180.00 / Trig_RealA))), do (Actions)
                        Loop - Actions
                            Set Trig_SFXPoint = (Trig_Center[Trig_LoopA] offset by (TRIG__RADIUS / 2.00) towards ((Trig_RealA x (Real(Trig_LoopB))) + (270.00 + (180.00 x (Real(Trig_LoopA))))) degrees)
                            Special Effect - Create a special effect at Trig_SFXPoint using TRIG__SFX
                            Special Effect - Destroy (Last created special effect)
                            Custom script:   call RemoveLocation( udg_Trig_SFXPoint )
            For each (Integer Trig_LoopB) from 1 to (Integer((360.00 / Trig_RealB))), do (Actions)
                Loop - Actions
                    Set Trig_SFXPoint = (TempPoint offset by TRIG__RADIUS towards (Trig_RealB x (Real(Trig_LoopB))) degrees)
                    Special Effect - Create a special effect at Trig_SFXPoint using TRIG__SFX
                    Special Effect - Destroy (Last created special effect)
                    Custom script:   call RemoveLocation( udg_Trig_SFXPoint )
            Custom script:   call RemoveLocation( udg_Trig_Center[1] )
            Custom script:   call RemoveLocation( udg_Trig_Center[2] )
            Custom script:   call RemoveLocation( udg_TempPoint )
    
    [/spoil]
    Download map
     
    Chỉnh sửa cuối: 1/1/13
  5. NguLongHaKhac

    NguLongHaKhac T.E.T.Я.I.S

    Tham gia ngày:
    5/2/11
    Bài viết:
    653
    Nơi ở:
    MC

    cho mình hỏi,mình định chuyển code của bạn sang trigger code vì mình không quen dùng jass mấy :2cool_sexy_girl: nhưng có vài chỗ mình không biết
    PHP:
    scope Trigrams initializer init
        globals
            string SFX 
    "Abilities\\Spells\\Orc\\HealingWave\\HealingWaveTarget.mdl"
            
    real RADIUS 400
            integer SPELLID 
    'ANcl'
            
    integer DENSITY 10
        endglobals
        
        
    private function Trig_Con takes nothing returns boolean
            
    return ( GetSpellAbilityId() == SPELLID )
        
    endfunction
        
        
    private function Trig_Create takes nothing returns nothing
            local unit u 
    GetTriggerUnit()
            
    local integer i 1
            local integer t 
    1
            local location uloc 
    GetUnitLoc)
           
    " local location p mình không hiểu là gì"
           " local location q cả cái này nữa"
            
    local real a = (DENSITY * (RADIUS/2) * 3.14)/180
            local real b 
    = (DENSITY RADIUS 3.14)/180
           
    " loop (Loop integer hay loop gì vậy bạn hay là real a đến"
               " exitwhen t > 2 (If t>2??) thì set p"
                
    set p PolarProjectionBJuloc RADIUS/270 180 
               
    " loop [loop này mình chịu]"
                    
    exitwhen i a
                    set q 
    PolarProjectionBJRADIUS/* (180 a) + (270 180) )
                    
    call DestroyEffectAddSpecialEffectLocSFX ) )
                    
    call RemoveLocation(q)
                    
    set i 1
                endloop
                call DestroyEffect
    AddSpecialEffectLocSFX ) )
                
    call RemoveLocation(p)
                
    set i 1
                set t 
    1
            endloop
           
    " loop [đây nữa ]"
                
    exitwhen i b
                set p 
    PolarProjectionBJuloc RADIUS * (360 b) )
                
    call DestroyEffectAddSpecialEffectLocSFX ) )
                
    call RemoveLocation(p)
                
    set i 1
            endloop
            call RemoveLocation
    (uloc)
        
    endfunction
        
        
    private function init takes nothing returns nothing
            local trigger t 
    CreateTrigger()
            
    call TriggerRegisterAnyUnitEventBJEVENT_PLAYER_UNIT_SPELL_EFFECT )
            
    call TriggerAddConditionCondition(function Trig_Con) )
            
    call TriggerAddAction, function Trig_Create )
        
    endfunction
    endscope

     
  6. LeoNguyen112

    LeoNguyen112 Dragon Quest

    Tham gia ngày:
    22/5/10
    Bài viết:
    1,438
    Nơi ở:
    TP.HCM
    PHP:
    local location p
    local location q
    Dùng để khởi tạo biến local, type là location (point). Nếu chuyển qua GUI thì chỉ cần tạo 2 cái biến point là được.
    PHP:
    exitwhen t 2
    Đây là điều kiện để loop 2 lần, nếu t > 2 thì kết thúc vòng loop.
    Còn về mấy cái loop:
    - Đầu tiên là tạo effect vòng tròn lớn ở ngoài, cách tạo GUI thi page 1. Còn trong code của mình thì là đoạn này
    PHP:
            loop 
                exitwhen i 
    b
                set p 
    PolarProjectionBJuloc RADIUS * (360 b) )
                
    call DestroyEffectAddSpecialEffectLocSFX ) )
                
    call RemoveLocation(p)
                
    set i 1
            endloop
            call RemoveLocation
    (uloc)
    - Kế đến là tạo hình chữ S ở giữa. Nếu bạn để ý kĩ, thì chữ S đó là kết hợp bởi 2 nửa vòng tròn, có tâm là 2 cái chấm tròn đấy, rồi thay vì tạo cả vòng tròn thì chỉ tạo 1 nửa, cái trên tạo nửa bên trái, cái dưới tạo nửa bên phải.
    PHP:
    loop [loop này tạo 2 tâm hình tròn]
                
    exitwhen t 2
                set p 
    PolarProjectionBJuloc RADIUS/270 180 )
                
    loop [loop này tạo hình chữ S]
                    
    exitwhen i a
                    set q 
    PolarProjectionBJRADIUS/* (180 a) + (270 180) )
                    
    call DestroyEffectAddSpecialEffectLocSFX ) )
                    
    call RemoveLocation(q)
                    
    set i 1
                endloop
                call DestroyEffect
    AddSpecialEffectLocSFX ) )
                
    call RemoveLocation(p)
                
    set i 1
                set t 
    1
            endloop
     
  7. Evil_Hunter

    Evil_Hunter Mario & Luigi

    Tham gia ngày:
    18/9/11
    Bài viết:
    786
    Nơi ở:
    Evil Forest
    Mình bị gì cơ?
    Destroy SE, remove location rồi mà?
    Trong map demo thôi, còn trên này chưa change, lười mà :D
     
  8. NguLongHaKhac

    NguLongHaKhac T.E.T.Я.I.S

    Tham gia ngày:
    5/2/11
    Bài viết:
    653
    Nơi ở:
    MC
    Mình dịch được ra như thế này không biết có đúng không ? còn 1 phần nữa nhưng sợ sai nên không làm
    Mã:
    Untitled Trigger 001
        Events
        Conditions
        Actions
            Set TempUnit = (Triggering unit)
            Set i = 1
            Set t = 1
            Set TempLoc = (Position of (Triggering unit))
            Set a = ((((Real(Destiny)) x (Radius / 2.00)) x 3.14) / 180.00)
            Set b = ((((Real(Destiny)) x Radius) x 3.14) / 180.00)
            If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                If - Conditions
                    t Greater than 2
                Then - Actions
                    Set p = (TempLoc offset by (Radius / 2.00) towards ((270.00 + (Real(t))) x 180.00) degrees)
                Else - Actions
    
     
  9. LeoNguyen112

    LeoNguyen112 Dragon Quest

    Tham gia ngày:
    22/5/10
    Bài viết:
    1,438
    Nơi ở:
    TP.HCM
    ^ Không cần tạo 2 biến t và i đâu, trong GUI có sẵn Loop Integer A và B đó, dùng luôn đỡ tốn bộ nhớ.

    P/s: Làm thì làm đi, sai thì có người sửa, sao phải sợ?
     
  10. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    mỗi lần sử dụng "Integer A" là một lần gọi hàm, mà hàm này chỉ làm một việc là trả về biến integer A => vô dụng, dùng biến luôn thì tốt hơn
     
  11. NguLongHaKhac

    NguLongHaKhac T.E.T.Я.I.S

    Tham gia ngày:
    5/2/11
    Bài viết:
    653
    Nơi ở:
    MC
    Mình làm ở đoạn :
    PHP:
    loop (Loop integer hay loop gì vậy bạn hay là real a đến"
               " 
    exitwhen t "
                set p = PolarProjectionBJ( uloc , RADIUS/2 , 270 + t * 180 ) 
               " 
    loop [loop này mình chịu]"
                    exitwhen i > a
                    set q = PolarProjectionBJ( p , RADIUS/2 , i * (180 / a) + (270 + t * 180) )
                    call DestroyEffect( AddSpecialEffectLoc( SFX , q ) )
                    call RemoveLocation(q)
                    set i = i + 1
                endloop
                call DestroyEffect( AddSpecialEffectLoc( SFX , p ) )
                call RemoveLocation(p)
                set i = 1
                set t = t + 1
            endloop
           " 
    loop [đây nữa ]"
                exitwhen i > b
                set p = PolarProjectionBJ( uloc , RADIUS , i * (360 / b) )
                call DestroyEffect( AddSpecialEffectLoc( SFX , p ) )
                call RemoveLocation(p)
                set i = i + 1
            endloop
            call RemoveLocation(uloc)
        endfunction
    ở chỗ
    Mã:
    loop
               " exitwhen t > 2 "
                set p = PolarProjectionBJ( uloc , RADIUS/2 , 270 + t * 180 ) 
               " loop]
    thì mình tạo ra lệnh If,then,Else như vậy có phải không và cái loop ở dưới nữa cũng vậy ak??,hay là 1 biến check t>2 nào đó ??
     
  12. LeoNguyen112

    LeoNguyen112 Dragon Quest

    Tham gia ngày:
    22/5/10
    Bài viết:
    1,438
    Nơi ở:
    TP.HCM
    ^ Mình update lại rồi, fix cái lỗi tính toán và thêm GUI version, bạn xem lại phần GUI code ở #24 sẽ rõ
     
  13. YAN[asian]

    YAN[asian] Mario & Luigi

    Tham gia ngày:
    27/3/07
    Bài viết:
    812
    Đc thế thì tốt :), nhưng giá mà có cả GUI code thì còn tốt hơn nữa! Anh chẳng biết gì về Jass cả...
     
  14. Jolli Sheny

    Jolli Sheny Donkey Kong

    Tham gia ngày:
    26/12/12
    Bài viết:
    315
    dg-g share thuật toán + demo hình lun càng tốt (:))
    không cần map, chủ yếu học hỏi thuật toán :D
     
  15. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM

    vì tớ cảm thấy jass có thể thay đổi thông số thuật toán 1 cách đơn giản chỉ là còn GUI thì bắt click :-ss
    quan trọng rằng thuật toán tớ đang sở hữu là từ google :-? nhưng tớ nói thật rằng tớ hầu như hok có kiến thức gì về thuật toán :-s
     
  16. NguLongHaKhac

    NguLongHaKhac T.E.T.Я.I.S

    Tham gia ngày:
    5/2/11
    Bài viết:
    653
    Nơi ở:
    MC
    Yeah . mình hiểu rồi tks bạn.:9cool_haha:
    Vậy bạn chỉ cho mình đường link với :9cool_haha:
     
  17. LeoNguyen112

    LeoNguyen112 Dragon Quest

    Tham gia ngày:
    22/5/10
    Bài viết:
    1,438
    Nơi ở:
    TP.HCM
    @Dh-g: ờ, share link đi, ai làm được gì thì làm rồi share lại cho mọi người. Cậu đỡ tốn time hơn =)
     
  18. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    hok phải mình 0 có ý share. mà là cái đó quên link rồi và lại còn là tiếng trung sợ các cậu hok ai wan tâm :-< và nếu có ai wan tâm thì đọc tại đây vậy :-?

    http://www.mediafire.com/view/?zxbqcc69f4n1z5q
     
  19. bgcy_ro002

    bgcy_ro002 Youtube Master Race

    Tham gia ngày:
    27/12/11
    Bài viết:
    41
    Nơi ở:
    ???
    Mình khoái cái link rồi đó. Cám ơn dh-g. :2cool_burn_joss_sti

    - - - Updated - - -

    Link có tọa độ Oxyz luôn, liệu có làm đc Effect cho Oxyz được không nhỉ ? Hấp dẫn quá
     
  20. NguLongHaKhac

    NguLongHaKhac T.E.T.Я.I.S

    Tham gia ngày:
    5/2/11
    Bài viết:
    653
    Nơi ở:
    MC
    quả nhiên bạn nói đúng thật :2cool_sexy_girl: đọc chẳng hiểu cái gì nhìn được mỗi mấy phép tính toán và chẳng hiểu cái gì :6cool_beat_shot:
     

Chia sẻ trang này