Topic hỏi đáp về cách làm map | version 9

Status
Không mở trả lời sau này.
leak và lag
Leak như kiểu là cái đấy đáng ra không dùng nữa thì phải vất đi nhưng bạn quên mất Sau nhiều lần như thế sẽ thành đống rác dẫn đến lag map.
Lag là kết quả của việc giảm FPS (frame per second).Con số đó càng lớn thì tức là map càng nuột , mượt và Còn càng ít thì map càng giật, lag.

@tunghamtien:Tình hình là map em thường xuyên bị fatal error ,trong map có sử dụng system của EGUI , có phải map có nhiều trigger kiểu "Ever x sec làm gì đó " thì sẽ dễ bị fatal ko ?
Xin thưa là không, nếu fatal eror nghĩa là bạn code lỗi (trường hợp của bạn là system EGUI lỗi)

Còn việc giảm chỉ số FPS là do 2 vấn đề:
  1. Do bạn xử lý quá nhiều thứ cùng 1 lúc, ví dụ là những cái như kiểu tạo 100 unit cùng lúc hay nhiều hiệu ứng (Special effect) ... Nhiều cái "Ever x sec làm gì đó " rồi mỗi cái làm gì đó của bạn là 1 đống thứ nữa thì không lag hơi phí
  2. Hoặc vấn đề là do cái nêu trên, leak.
Nếu tốt tiếng Anh thì có thể đọc ở đây

@tunghamtien: Gần đây em thấy trong topic của PA và 1 số nguồn khác có nói về những system giảm leak như UnitClear ... Có ai có thể giải thích cơ chế hoạt động vào link down ko ?
ClearUnit á mình thấy bạn tự remove unit còn hơn ,system làm gì nữa.
Unit chỉ bị leak do 1 số trường hợp unit đấy chết mà model của nó vẫn tồn tại như tome (sách đó) hay doodads model. Còn unit bt có thời gian tối đa xác còn tồn tại trên map (để hồi sinh) rồi nó cũng tự mất đi thôi.

Cách giảm lag tốt nhất á
jass + system code, không biết nói gì hơn khi Tom đại ka đã công nhận jass nuột hơn GUI b-)

Note: trong bất kỳ map nào, gõ /fps ở chỗ chat để coi độ nuột của map đó :)
 
Chỉnh sửa cuối:
Mã:
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to |cffFFCCCCSlide Dancing|r 
    Actions
        Set SD_Unit = (Casting unit)
        Set SD_TempUnit = (Position of SD_Unit)
        Set SD_TempTarger = (Target point of ability being cast)
        Set SD_Distance = ((Real((Level of |cffFFCCCCSlide Dancing|r  for SD_Unit))) x 10.00)
        Set SD_Angle = (Angle from SD_TempUnit to SD_TempTarger)
        Trigger - Turn on Spell Slide Dancing Move <gen>
        [COLOR="Red"]Wait SD_Distance seconds[/COLOR]
        Trigger - Turn off Spell Slide Dancing Move <gen>
Mã:
    Events
        Time - Every 0.04 seconds of game time
    Conditions
    Actions
        Set SD_TempUnit = (Position of SD_Unit)
        Set SD_TempTarger = (SD_TempUnit offset by SD_Distance towards SD_Angle degrees)
        Unit - Move SD_Unit instantly to SD_TempTarger
Spell gốc Shockwave, hiệu ứng, chọn targer, move tới targer rồi dừng. Ai biết cách chỉnh dòng màu đỏ Wait đó ntn cho khi đến đúng chỗ targer thì Hero dừng lại lập tức ko, để như trên thì Hero nó move thêm 1 đoạn wa chỗ targer mới dừng.
 
Mã:
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to |cffFFCCCCSlide Dancing|r 
    Actions
        Set SD_Unit = (Casting unit)
        Set SD_TempUnit = (Position of SD_Unit)
        Set SD_TempTarger = (Target point of ability being cast)
        Set SD_Distance = ((Real((Level of |cffFFCCCCSlide Dancing|r  for SD_Unit))) x 10.00)
        Set SD_Angle = (Angle from SD_TempUnit to SD_TempTarger)
        Trigger - Turn on Spell Slide Dancing Move <gen>
        [COLOR="Red"]Wait SD_Distance seconds[/COLOR]
        Trigger - Turn off Spell Slide Dancing Move <gen>
Mã:
    Events
        Time - Every 0.04 seconds of game time
    Conditions
    Actions
        Set SD_TempUnit = (Position of SD_Unit)
        Set SD_TempTarger = (SD_TempUnit offset by SD_Distance towards SD_Angle degrees)
        Unit - Move SD_Unit instantly to SD_TempTarger
Spell gốc Shockwave, hiệu ứng, chọn targer, move tới targer rồi dừng. Ai biết cách chỉnh dòng màu đỏ Wait đó ntn cho khi đến đúng chỗ targer thì Hero dừng lại lập tức ko, để như trên thì Hero nó move thêm 1 đoạn wa chỗ targer mới dừng.

xài Wait có tích họp Conditions trong wait có 3 loại 1 wait game 2 wait 3 wait conditions
sau đó đặt conditions cần yêu cầu là good :D
 
Mã:
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to |cffFFCCCCSlide Dancing|r 
    Actions
        Set SD_Unit = (Casting unit)
        Set SD_TempUnit = (Position of SD_Unit)
        Set SD_TempTarger = (Target point of ability being cast)
        Set SD_Distance = ((Real((Level of |cffFFCCCCSlide Dancing|r  for SD_Unit))) x 10.00)
        Set SD_Angle = (Angle from SD_TempUnit to SD_TempTarger)
        Trigger - Turn on Spell Slide Dancing Move <gen>
        [COLOR="Red"]Wait SD_Distance seconds[/COLOR]
        Trigger - Turn off Spell Slide Dancing Move <gen>
Mã:
    Events
        Time - Every 0.04 seconds of game time
    Conditions
    Actions
        Set SD_TempUnit = (Position of SD_Unit)
        Set SD_TempTarger = (SD_TempUnit offset by SD_Distance towards SD_Angle degrees)
        Unit - Move SD_Unit instantly to SD_TempTarger
Spell gốc Shockwave, hiệu ứng, chọn targer, move tới targer rồi dừng. Ai biết cách chỉnh dòng màu đỏ Wait đó ntn cho khi đến đúng chỗ targer thì Hero dừng lại lập tức ko, để như trên thì Hero nó move thêm 1 đoạn wa chỗ targer mới dừng.

Mấy tháng do có nhiều vấn đề trục trặc nên tới bây giờ mình mới onl được ^^ ( chắc bạn FlameDrake còn nhớ). Còn về cai spell của bạn mình thấy cái dòng: "Wait SD_Distance seconds" HOÀN TOÀN không có ý nghĩa gì cả vì nếu coi như spell lvl 1 thì SD_Distance sẽ là 10. Tốc độ 10 range/ 0.04 s như ở Trigger 2 cho thấy cũng ko phải là nhanh nhưng chờ tới 10s mới ngừng thi quãng đường đi được cũng ko phải là ngắn, đó là chưa kể ở lv 3,4 sẽ chờ 30s, 40s thì hỏng bét.

Đó là giải thích, còn về ý tưởng, mình có công thức tính :lấy khoảng cách giữa Caster và Target chia cho tốc độ ra thời gian cần phải WAIT (ở đây tốc độ = 1/0.04 x SD_Distance : nghĩa là 0.04s đi đc SD_Distance thì 1s sẽ đi được ngần đó).

Thật ra cách đơn giản hơn là có thể dùng IF khoảng cách của Caster đến Target chưa đạt tới 0 THEN tiếp tục Move Caster ELSE Caster dừng lại.

---------- Post added at 22:31 ---------- Previous post was at 22:23 ----------

Ah mình cũng có vấn đề cần giải đáp: mình đã ADD Custom Hero vào trong Game Play Constant rồi mà khi thử Test vẫn mua được 3 Custom Hero đó như thường (những Standard Hero kia đương nhiên chỉ mua đc 1 lần).
 
1/0.04 x SD_Distance
Sửa theo Boy luôn rồi, nhưng lần này nó bay còn gê hơn @@ cả ra phần đen, Boy chỉnh lại trong phần trigger dùm luôn đi :D
P/s: Tiện thể mình hỏi luôn, trigger nào làm cho màn hình rung lên như động đất, như map Lac Viet , mỗi khi đánh sập nhá, dất màn hình nó rung chuyển lên
 
Chỉnh sửa cuối:
Sửa theo Boy luôn rồi, nhưng lần này nó bay còn gê hơn @@ cả ra phần đen, Boy chỉnh lại trong phần trigger dùm luôn đi :D

Demo Map đây:

Hì Hì, ngồi 1 lúc thì mình cũng mợi nhận ra là cái cách tính đó chỉ tương đối đúng: bạn cứ để ý khi Slide ở khoảng cách vừa thì ko sao, còn ngắn wa' thì tự nhiên chưa đến đã dừng, dài wa' thì lại trượt wa'. Mình đã tăng thêm 1 tẹo thời gian Wait nhưng cũng không thấy chính xác hơn, nói chung bạn nên dùng lệnh if như mình bảo thì hay hơn, cái đó mai mình sẽ pót sau.
Còn về cái Code của bạn thì mình nghĩ sai ở Trigger 2, ban phải gán 2 biến khác thay cho 2 biến "Temp_Unit" và "Temp_Target" để làm việc ở Trigger 2 (2 biến "Temp_Unit" và "Temp_Target" quan trọng khi dùng Spell, ko riêng gì spell này những spell khác bạn cũng nên làm vậy, phải để những biến đó tồn tại đến khi hết spell chứ đừng đem ra thay đổi).
 
@BooyViip:Ah mình cũng có vấn đề cần giải đáp: mình đã ADD Custom Hero vào trong Game Play Constant rồi mà khi thử Test vẫn mua được 3 Custom Hero đó như thường (những Standard Hero kia đương nhiên chỉ mua đc 1 lần)
Bạn muốn tất cả các hero chỉ mua được 1 lần thì dùng cái này
Melee Game - Limit Heroes to 1 per Hero-type (for all players)
Còn muốn chỉnh giới hạn chỉ train 1 số hero cho 1 player thì
Player - Limit training of Heroes to 3 for Player 1 (Red)
Còn nếu muốn xác định giới hạn của 1 hero cụ thể cho 1 player cụ thể thì
Player - Limit training of Footman to 1 for Player 1 (Red)

@FlameDrake:trigger nào làm cho màn hình rung lên như động đất, như map Lac Viet , mỗi khi đánh sập nhá, dất màn hình nó rung chuyển lên
Có phải là cái này Camera - Shake the camera for Player 1 (Red) with magnitude 3.00 hoặc Camera - Sway the camera target for Player 1 (Red) with magnitude 10.00 and velocity 0.10
Rồi dùng cái này để ngưng động đất Camera - Stop swaying/shaking the camera for Player 1 (Red)
Còn chỉ muốn rung đất 1 vùng thì tạo dummy rồi cast Earthquake (chỉnh area effect để xác định độ rộng vùng động đất)

Note:
Đừng dùng wait để tạo slide vì wait là không chuẩn đâu và nhất là với cái này sẽ gặp lỗi nếu muốn MUI

Slide à. Hỏi làm gì. Không chịu nghe giáo sư Tom giảng bài rồi. Bài giảng về slide đây
 
Chỉnh sửa cuối:
Ai trả lời giúp với. Reply lần 1.

Vì dmg hiện lên là số máu mất đi của con quái sau hit của mình , vì thế cách làm như sau :
sad.gif

bất kì 1 spell gây dmg của bạn cũng phải có thêm những bước này :
- tạo biến a lưu số máu kẻ địch hiện có.
- gây dmg của spell cho địch.
- lấy số máu hiện tại của địch - a. dùng hàm abs của math ( absolute - lấy số nguyên ) gán vào biến b.
ví dụ ban đầu địch có 300 máu, dam spell là 100 , giảm , kháng gì đó thì sau khi gây dmg địch còn 230. nó lấy 230 - 300 = abs(-70) = 70 .
-dùng floating text cho bay trên đầu kẻ địch , giá trị là b ( là 70 ).

Vậy dmg mình đánh trúng hiện đúng 70 chứ ko phải damage spell là 100.
trans.gif
 
Đừng dùng wait để tạo slide vì wait là không chuẩn đâu và nhất là với cái này sẽ gặp lỗi nếu muốn MUI

Slide à. Hỏi làm gì. Không chịu nghe giáo sư Tom giảng bài rồi. Bài giảng về slide đây

Mà sao Cái "SlideTick" trong đó chưa được Set bằng cái gì cả? Đồng ý là phải = (Distance giữa Caster và Target)/SD_Distance nhưng mình nghĩ độ chính xác chắc cũng tương đối cái Wait thôi (có thể chính xác trong Distance thấp nhưng Trung Bình hoặc Cao sẽ sai lệch nhiều)
 
sao trong game interface của mình không có cái dòng font nhỉ? Chỉ có icon, image, text, model, path, sound.

Cái đó bạn phải dùng đến jassnewgen bạn à
Rồi mở map mình ra rồi tim chữ UMSWE đánh dấu Enable UMSWE
Tắt jassnewgen rồi mở lại jassnewgen load map mình lần nữa vào game interface sẽ thấy chữ font
 
Trigger 1
Mã:
Events
    Unit - A unit Starts the effect of an ability
Conditions
    (Ability being cast) Equal to Slide Dancing 
Actions
    Set SD_Caster = (Casting unit)
    Set SD_CasterPoint = (Position of SD_Caster)
    Set SD_Point[1] = (Position of SD_Caster)
    Set SD_TargetPoint = (Target point of ability being cast)
    Set SD_Angel = (Angle from SD_CasterPoint to SD_TargetPoint)
    Set SD_Distance = (5.00 x (Real((Level of Slide Dancing  for SD_Caster))))
    Trigger - Turn on Slide Dancing 2 <gen>
Trigger 2
Mã:
Events
    Time - Every 0.02 seconds of game time
Conditions
Actions
    If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        If - Conditions
            (Distance between SD_Point[1] and SD_TargetPoint) Greater than or equal to (SD_Distance / 2.00)
        Then - Actions
            Set SD_Point[2] = (SD_Point[1] offset by SD_Distance towards SD_Angel degrees)
            Unit - Move SD_Caster instantly to SD_Point[2]
            Set SD_Point[1] = SD_Point[2]
        Else - Actions
            Trigger - Turn off (This trigger)

Dùng IF như vậy là chính xác đến tuyệt đối :D !
 
Đúng là chính xác thật @@ Đúng chỗ targer là stop liền :))
P/s: Mình để ý có 1 vấn đề khi làm spell ko biết là do leak hay do Dummy, hễ là spell nào mà create nhìu Dummy 1 lượt mà có set dame group, dù remove leak và dummy nhưng sài nhìu lần spell đó, là bắt đầu có triệu chứng lag :| ( mọi thứ trong map cà dựt cà dựt). Ai biết vụ này là do nguyên nhân gì ko :|
Thanks all rất nhìu vì triggger và HD.
 
@BooyViip:Mà sao Cái "SlideTick" trong đó chưa được Set bằng cái gì cả?
Cái bạn muốn đây hửm, có trong tut rồi mà: "Set SlideTick = 20 //tick = 20, mỗi tick là 0.04 (xem event của trigger Slide) -> cần 20 * 0.04 = 0.8 giây để move xong, tương đương với 0.8s stun ::)"

@BooyViip:Đồng ý là phải = (Distance giữa Caster và Target)/SD_Distance nhưng mình nghĩ độ chính xác chắc cũng tương đối cái Wait thôi (có thể chính xác trong Distance thấp nhưng Trung Bình hoặc Cao sẽ sai lệch nhiều)
Bạn của tôi ơi, quên mất vài thứ rồi.
Thứ nhất là bạn không nên dùng cách đó vì quả thật không chính xác. Thế nên trong tut anh Tom cách ảnh dùng cách tính là "khoảng cách slide = khoảng cách knockback / số tick" vì khoảng cách là real (số thực) nên chả có sai lệch nào ở đây cả.
Thứ 2 là nếu bạn muốn slide mượt thì sẽ không nên để "khoảng cách slide" cao, nó sẽ tạo cảm giác unit bị giật và di chuyển như thế đồng nghĩa là di chuyển tốc độ cao đó bạn ạ
Thứ 3 là nếu bạn vẫn dùng cách đó thì cũng chả sao cả, đừng để SD_Distance cao là được, chính bạn cũng biết để cao thì không chuẩn mà ;))
Còn bạn muốn là slide nuột hơn (với cách anh Tom nhé) thì hãy điều chỉnh cái "SlideTick" để đếm số lần di chuyển đó. Số càng cao nghĩa là càng nhiều bước di chuyển và bước di chuyển càng ngắn tức unit di chuyển càng mượt

Note:
theo kinh nghiệm cá nhân thì:
Với khoảng thời gian giữa các lần di chuyển trong 1 lần slide < 0.3
Với khoảng cách giữa các bước di chuyển < 30 (dù bất kể cách tính nào thì cố gắng sao cho được như thế này)
Thì đảm bảo di chuyển sẽ mượt


@FlameDrake: hễ là spell nào mà create nhìu Dummy 1 lượt mà có set dame group, dù remove leak và dummy nhưng sài nhìu lần spell đó, là bắt đầu có triệu chứng lag :| ( mọi thứ trong map cà dựt cà dựt). Ai biết vụ này là do nguyên nhân gì ko :|
Sau nhiều lần cast và càng ngày càng lag hơn thì đó chắc chắn là leak. Bạn chỉ nói vậy mà không có trigger hay code thì khó ai giúp được
 
Chỉnh sửa cuối:
[DemonPrince];18450878 nói:
Vì dmg hiện lên là số máu mất đi của con quái sau hit của mình , vì thế cách làm như sau: bất kì 1 spell gây dmg của bạn cũng phải có thêm những bước này :
- tạo biến a lưu số máu kẻ địch hiện có.
- gây dmg của spell cho địch.
- lấy số máu hiện tại của địch - a. dùng hàm abs của math ( absolute - lấy số nguyên ) gán vào biến b.
ví dụ ban đầu địch có 300 máu, dam spell là 100 , giảm , kháng gì đó thì sau khi gây dmg địch còn 230. nó lấy 230 - 300 = abs(-70) = 70 .
-dùng floating text cho bay trên đầu kẻ địch , giá trị là b ( là 70 ).

Vậy dmg mình đánh trúng hiện đúng 70 chứ ko phải damage spell là 100.

Cái hiện Dam mình hỏi nhiều lần rồi nhưng cuối cùng cũng chỉ kết luận là KO có cách nào hiện Dam chính xác cả.
Cách của bạn nghe thì thấy đúng nhưng nếu Target bị nhiều Unit đánh cùng 1 lúc thì Dam hiện lên sẽ là Dam tổng của Các Unit đó. Hơn nữa hiện 70 dam lên cũng là sai vì tất cả những dam hiện lên ở Spell hay dam vật lý ở Critical Strike đều là giá trị mặc định, chưa tính đến chuyện kháng gì cả.
 
Cái bạn muốn đây hửm, có trong tut rồi mà: "Set SlideTick = 20 //tick = 20, mỗi tick là 0.04 (xem event của trigger Slide) -> cần 20 * 0.04 = 0.8 giây để move xong, tương đương với 0.8s stun ::)"

Cách đó chỉ đảm bảo Target bị Stun đúng 0.8s chứ ko đảm bảo khoảng cách Target bị Knockback, đương nhiên với 0.8s Slide thì khoảng cách đều là 1 giá trị nhất định nhưng cái mà bạn FLAMEDRAKE muốn là khi thay đổi khoảng cách Slide thì Spell vẫn đúng.
 
Status
Không mở trả lời sau này.
Back
Top