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

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.
 
@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"?
 
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

Trigrams_zps13a0a8f2.jpg


____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( u )
        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 = PolarProjectionBJ( uloc , RADIUS/2 , 270 + t * 180 )
            loop
                exitwhen i * a > 180
                set q = PolarProjectionBJ( p , RADIUS/2 , i * 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
            exitwhen i * b >= 360
            set p = PolarProjectionBJ( uloc , RADIUS , i * b )
            call DestroyEffect( AddSpecialEffectLoc( SFX , p ) )
            call RemoveLocation(p)
            set i = i + 1
        endloop
        call RemoveLocation(uloc)
    endfunction
    
    private function init takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ( t , EVENT_PLAYER_UNIT_SPELL_EFFECT )
        call TriggerAddCondition( t , Condition(function Trig_Con) )
        call TriggerAddAction( t , 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:
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



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( u )
       " 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 = 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
    
    private function init takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ( t , EVENT_PLAYER_UNIT_SPELL_EFFECT )
        call TriggerAddCondition( t , Condition(function Trig_Con) )
        call TriggerAddAction( t , function Trig_Create )
    endfunction
endscope
 
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:
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 = PolarProjectionBJ( uloc , RADIUS , i * (360 / b) )
            call DestroyEffect( AddSpecialEffectLoc( SFX , p ) )
            call RemoveLocation(p)
            set i = 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 = PolarProjectionBJ( uloc , RADIUS/2 , 270 + t * 180 )
            loop [loop này tạo hình chữ S]
                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
 
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.

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
 
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 = PolarProjectionBJ( uloc , RADIUS , i * (360 / b) )
            call DestroyEffect( AddSpecialEffectLoc( SFX , p ) )
            call RemoveLocation(p)
            set i = 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 = PolarProjectionBJ( uloc , RADIUS/2 , 270 + t * 180 )
            loop [loop này tạo hình chữ S]
                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
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
 
^ 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ợ?
 
^ 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ợ?

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
 
Mình làm ở đoạn :
PHP:
loop (Loop integer hay loop gì vậy bạn hay là real a đến"
           " exitwhen t > 2 "
            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 đó ??
 
^ 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õ
 
P/S: mình còn đến 96 thuật toán hiệu ứng có nhịp sẽ share tiếp cho mọi người vậy :">

Đ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ả...
 
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
 
YAN[asian];22629215 nói:
Đ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ả...


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
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

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
 
@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 =)
 
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á
 
Back
Top