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:
mò để học...http://forums.gamevn.com/showthread.php?485055-Tutorial-GUI-to-JASS #1: ý bác bảo giống như tương tác Xe đụng người? Người đẩy thùng gỗ,v.v...? vjass: Timer system... maybe!
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.
- 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]
^ 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 ạ?
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
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?
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 :)
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.
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 )
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)...
đú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]
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: COnvert to custom text: - Ở đây có hai biến unit là Dive và Dive 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á)
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ứ?
@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
- 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"