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"?
^làm sao chạy được! Cái đó cần jasshelper 2012 của cohadar mà TOM: download JNGP mới này: http://wc3modding.info/4263/the-jass-newgen-pack-jngp-1-5e/
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 ____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
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 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 ) endfunctionendscope
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 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à
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ợ?
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õ
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
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à gõ còn GUI thì bắt click 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
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
Mình khoái cái link rồi đó. Cám ơn dh-g. - - - 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á
quả nhiên bạn nói đúng thật đọ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ì