Làm spell có tác động vật lý bằng Vjass thế nào?

Thảo luận trong 'World Editor' bắt đầu bởi Judash137, 1/4/12.

  1. Judash137

    Judash137 Donkey Kong

    Tham gia ngày:
    24/8/09
    Bài viết:
    467
    Các spell có giá trị tương tác vật lý là các spell tạo hứng thứ cho người chơi map nhất. Ví dụ như 1 spell bắn ra lốc xoáy là unit gần đấy xoay quanh cơn lốc và bị hút dần vào tâm.
    - Các dạng tương tác cũng ko nhiều lắm:
    + 1 Dummy unit có khả năng hút các unit vào gần nó (phép hố đen)
    + 1 Dummy unit vừa hút kẻ thù vào gần, vừa làm các chúng xoay xung quanh nó ( bão lốc)
    + 1 Dummy unit vừa di chuyển vừa đầy kẻ thù trước mặt lùi lại (ko giống knock back mà giống như 1 con tê giác đang chạy và húc vào 1 người, người đó sẽ dính vào sừng con tê giác lúc nó đáng tiến tới phía trước)
    Nếu có bạn nào muốn giúp nhưng vẫn chưa hiểu các tương tác trên thì có thể download map này về để cảm nhận:
    http://www.mediafire.com/?hr3hzc822lf5jjh
    Mình làm map này bằng Trigger, nên sẽ nhiều leak.

    - Mình lập topic này để mong các bạn giỏi Vjass vào đây giúp đỡ và giải thích cách để làm các tương tác vật lý trên:
    [​IMG]
     
    Chỉnh sửa cuối: 2/4/12
  2. fantom2409

    fantom2409 Mr & Ms Pac-Man

    Tham gia ngày:
    15/8/11
    Bài viết:
    194
    Vjass là gì thế anh? Làm sao để học?
     
  3. Daric™

    Daric™ C O N T R A

    Tham gia ngày:
    7/3/12
    Bài viết:
    1,853
    Nơi ở:
    Porizon
  4. Judash137

    Judash137 Donkey Kong

    Tham gia ngày:
    24/8/09
    Bài viết:
    467
    Thật ra còn có 1 kiểu tương tác nữa là dùng 1 dummy unit như là 1 quả rocket:
    - Làm 1 trigger để slide quả rocket mỗi 0.1 giây, cái này thì ko gây lag nhưng làm trên Vjass hẳn quả tên lửa đi sẽ mượt hơn.
    - Gom tất cả các unit dạng rocket và xác định xem quả rocket có va chạm với unit kẻ thù nào ko trong mỗi 0.05 giây, nếu có thì cho nổ quả rocket, cái này làm trên trigger gây nhiều lag và leak, nên có ai giúp mình làm cái này trên VJass ko?
    - Nếu bác nào muốn giúp mà chưa hiểu cách mà trigger của của mình làm việc thì có thê mở map trên ra, xem ở Catelogy "Abilities" trong phần Trigger Editor.
     
  5. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    - 0.1s thì không thể mượt được, kể cả vJass, phải dùng ít nhất là 0.04 (25 interval/s tuy nhiên với một số người, từng này vẫn chưa đủ) nên dùng 0.03125 (32 interval/s), có thể dùng tới 0.025 (40 interval/s) tuy nhiên phải cẩn thận, có thể gây lag
    - việc xác định rocket trúng unit nào chả qua là: group pick, rõ ràng group pick ở GUI có leak nên... có lag. Trong vJass thì cách làm cũng vậy, chỉ là dùng script sao cho tối ưu hơn nhưng tùy vào việc ta làm gì, lag thì vẫn có lag.

    trong demo map tôi gửi kèm có spell Rocket Launcher
    [spoil]
    bắn một quả rocket theo hướng chỉ định, chạm vào enemy thì nổ, gây damage AoE.
    bán kính để chạm là 50, bán kính nổ là 200

    giải thích thêm về group pick trong map thì xem ảnh.

    ---
    filter mà tôi nói trong trigger đó là một condition function (hàm điều kiện) dùng để "lọc" các unit khi group pick (cái condition cho "matching conditions" ấy)
    [/spoil]
     

    Các file đính kèm:

  6. Daric™

    Daric™ C O N T R A

    Tham gia ngày:
    7/3/12
    Bài viết:
    1,853
    Nơi ở:
    Porizon
    ^
    Tom-sama ơi
    đa số các hàm để check tương tác đó ta thường dùng Group
    vậy thì ta sử dụng Group Utils để NewGroup() thì library đó có giảm bớt phần nào Group leak không ạ?
     
  7. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    GroupUtils chỉ là tái sử dụng group, thay vì Create/Destroy thì New/Release

    nếu trong quá trình dùng có New (Create) mà không Release (Destroy) thì leak vẫn là leak thôi

    cái quan trọng là quá trình dùng ra sao.

    tái sử dụng tốt hơn tạo mới nên mới có library này
     
    Chỉnh sửa cuối: 2/4/12
  8. Judash137

    Judash137 Donkey Kong

    Tham gia ngày:
    24/8/09
    Bài viết:
    467
    Thật ra hình như trong Vjass, mọi thứ đều đã là local sẵn hay sao ý? Mà tìm mãi cũng chả thấy topic nào hướng dẫn Vjass cả
    Mình dùng 0.1 giây là có lý do cả, mình ko move unit mà để tự unit di chuyển, 0.1 giây là khoảng thời gian ra lệnh cho unit để nó ko xao nhãng đường di chuyển, cách này tránh đc lag.
    - Nhân tiện cho mình hỏi luôn, trong trigger mình hay thường dùng 1 cái trigger đc tắt sắn, mỗi lần bật trigger này lên nó sẽ thực hiện lệnh mỗi 0.05 giây chẳng hạn. Khi đưa vào Jass mình biết là tất cả sẽ bị gom chung vào duy nhất 1 trigger nhưng: >>Giả dụ bây giờ mình muốn làm 1 Jass trigger kiểu thực hiện lệnh mỗi 0.05 giây chẳng hạn, nhưng mình muốn bật tắt cái trigger này bằng 1 trigger GUI khác( chứ ko phải jass) thì làm thế nào? Lệnh turn on , turn off trigger của GUI ko xài đc lên 1 trigger Jass khác thì phải?
     
    Chỉnh sửa cuối: 2/4/12
  9. Daric™

    Daric™ C O N T R A

    Tham gia ngày:
    7/3/12
    Bài viết:
    1,853
    Nơi ở:
    Porizon
    Vjass làm hiệu quả nhất các tương tác vật lý này em thường dùng xe của Vexorian, bác có thể tìm hiểu trong spell demo của library này :)
     
  10. Judash137

    Judash137 Donkey Kong

    Tham gia ngày:
    24/8/09
    Bài viết:
    467
    Cái spell rocket launcher ở trên mở map ra xong, ko save lại đc, cứ save là nó tự động đóng World Editor.
     
  11. Nakomuru Jaina

    Nakomuru Jaina Youtube Master Race

    Tham gia ngày:
    2/4/12
    Bài viết:
    7
    đã update jasshelper chưa ? Hoặc xem lại tùy chỉnh jasshelper ở editor
     
  12. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    Phải dùng JassNewGenPack và update JassHelper
     
  13. Nakomuru Jaina

    Nakomuru Jaina Youtube Master Race

    Tham gia ngày:
    2/4/12
    Bài viết:
    7

    Xin lỗi..Map đã bị crash ( lỗi này hầu hết gặp ở các spell dạng slide này ) . cậu thử bắn nó ra khỏi area map 1 thời gian xem ." Fatal Error ". ( bắn thử lâu lâu và liên tục nhanh nhá.vài lần thì không bị đâu )
     
  14. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    ờ ?
    [spoil]
    [/spoil]
     
  15. _Wild__Wolf_

    _Wild__Wolf_ Youtube Master Race

    Tham gia ngày:
    4/8/11
    Bài viết:
    80
    cho em hỏi: vjass có hay jass có thật sự mượt hơn GUI k0?? theo em nghĩ thì tùy cách code của mình thôi chứ nhỉ? cái nào mà chả như nhau, trăm hay k0 bằng tay quen thôi chứ nhỉ????(em còn gà lắm)...
     
  16. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    đúng, tùy theo cách code.

    tuy nhiên ở GUI có những leak không tránh được, ví dụ:
    [spoil]
    đây là: Units In Region Matching Conditions ở GUI, đây là code JASS:

    Mã:
    function GetUnitsInRectMatching takes rect r, boolexpr filter returns group
        local group g = CreateGroup()
        call GroupEnumUnitsInRect(g, r, filter)
        call DestroyBoolExpr(filter)
        return g
    endfunction
    variable g là local, một kiểu handle và không được null sau khi kết thúc hàm => leak

    còn group được tạo ra ở hàm này được cho vào biến, dùng xong thì xóa.

    leak ở đây không phải là cái group kia mà leak cái biến local chứa group

    nói thật cái leak này chả đáng mấy nhưng nếu nhiều thì sao? ví dụ dùng timer, mỗi giây vài chục lần pick group như vậy?

    nếu dùng hàm JASS thay thế thì không còn gọi là GUI nữa, nhỉ?
    [/spoil]
     
  17. Judash137

    Judash137 Donkey Kong

    Tham gia ngày:
    24/8/09
    Bài viết:
    467
    Thật ra thì có làm Jass thì vẫn phải tạo local group, vậy trên Jass xóa variable local group bằng cách nào?
    Nhân tiện đây là trigger trong map tank, tác dụng làm 1 cái xe húc về phía và gây damage cho những xe nào va chạm phải, nhưng này sinh 1 vấn đề đang cần người giải đáp:
    [​IMG]
    COnvert to custom text:
    [​IMG]
    - Ở đây có hai biến unit là DiveDive Victim, trigger này gom hết các unit đang dùng phép rồi gán cho Dive (các unit dùng spell) và với mỗi unit Dive nó lại gom các unit đứng gần để gán Dive_Victim (các unit dính damage)
    - Trong đoạn text, vấn đề phát sinh khi thay cái Dive số 1 bằng 1 biến local tên "DC" thì chỉ có thể dùng nó ngay tại cái funtion đấy,
    - khi xuống các funtion dưới thì cái biến Dive số 2 ở dưới sẽ ko thể thay thế bằng biến local DC vừa tạo ở trên đc
    - Nếu tạo thêm local unit DC thay cho Dive ở funtion dưới thì lại có vấn đề khác: cả Dive và Dive_Victim đều là GetEnumUnit (picked unit) sẽ bị lẫn.
    Vậy giải quyết vấn đề này thế nào (ko dùng udg_variable nhá)
     
  18. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    dùng một biến global thay local là giải quyết được leak local đã nói
    Mã:
    function GetUnitsInRectMatchingEx takes rect r, boolexpr filter returns group
        set bj_lastCreatedGroup = CreateGroup()
        call GroupEnumUnitsInRect(bj_lastCreatedGroup, r, filter)
        call DestroyBoolExpr(filter)
        return bj_lastCreatedGroup
    endfunction
    biến bj_lastCreatedGroup có sẵn và là global nên không cần null
    -----------
    local chỉ dùng cho hàm đã khai báo nó.

    muốn truyền dữ liệu giữa các hàm vẫn phải dùng global (udg_variable)

    trong GUI, các "if" hay "filter" (mấy cái conditions để pick unit ấy) hay "loop - actions" đều được cho vào hàm nên việc dùng local là điều... không thể
    ---
    sang JASS thì không tạo hàm mới cho "if" và "loop - actions" nhưng với "filter" thì vẫn phải dùng global
    ---
    đoạn code trên viết thành JASS cũng được nhưng... tôi cần đoạn text trên vì có phần thay đổi nhưng phần cần giữ nguyên thì phải giữ chứ? =))
     
  19. 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
    @Tom_Kazansky:

    em thấy jass có 2 kiểu pick group. mình sử dụng cách nào hay hơn ?

    Mã:
        local unit e
        local group g = CreateGroup()
    
    
        call GroupEnumUnitsInRange(g, X, Y, R, Condition(function GetFilter))
        call ForGroup(g, callback)
        call DestroyGroup(g)
        set e = null
    
    hoặc

    Mã:
    local unit e
    local group g = CreateGroup()
    
    call GroupEnumUnitsInRange(g, X, Y, R, null)
    
    loop
        set e = FirstOfGroup(g)
        exitwhen null == e
        call GroupRemoveUnit(g, e)
        if GetFilter(e) == true then
    //acton
        endif
    endloop
    call DestroyGroup(g)
    set e = null
    
     
  20. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    - cách thứ 1:
    dùng ForGroup khi ta cần dùng lại group vì sau khi lặp qua group thì các unit trong group không mất.

    với code trên:
    có dùng "e" đâu, khai báo làm gì?
    "g" không null? leak



    - cách thứ 2:
    với cách này, sau khi lặp, group sẽ trống, sau khi lặp không dùng group này nữa thì nên dùng cách này.

    với code trên:
    sau khi thoát khỏi vòng lặp, "e" là null rồi (exitwhen e==null) đâu cần null nữa?
    "g" không null, leak

    ------
    về việc dùng hàm filter hay dùng một "if" thì nên dùng hàm filter
    tôi không thể giải thích rõ điều này nhưng tôi có nghe: "trigger condition" nhanh hơn "trigger action" nên nghĩ "condition function" nhanh hơn "function"
     
    dh-g thích bài này.

Chia sẻ trang này