Thực ra làm như vầy là đã là 70% về phần move unit của 1 game RTS rồi mà. @[where?] có ý tưởng gì về phần sắp xếp đội hình khi di chuyển tới 1 vị trí ko?
Đơn cử là xếp thành đội hình có dạng hình chữ đi.
@Vistrifa:Mình nghĩ dùng 2D array được rồi, sắp đội hình tiện hơn và nhanh hơn. Mình nghĩ để giữ nguyên đội hình khi di chuyển chứ không chỉ sắp đội hình khi đến nơi thì cứ đếm số unit rồi sắp nó vào cái square 2D array rồi bê nguyên cái 2D array này cho nó di chuyển đến nơi cần đến, chứ không di chuyển riêng lẻ từng thằng. Nói nghe vậy chứ làm cũng mất công lắm nên lười, không có example. =]]
@Focker_c:
'=' là toán tử gán giá trị phải cho trái.
'==' là toán tử so sánh, trả về true nếu phải bằng trái.
Trong GML thì có thể dùng '=' thay cho '==' (ngược lại thì không).
Nhưng khuyên khi làm toán so sánh thì nên dùng '==', tại nhiều ngôn ngữ khác nó khắt khe chỗ này lắm.
Ví dụ trong C++ mà để: "if (a = b)" thì hầu hết các compiler đều báo lỗi.
Còn trong AS3 mà để "if (a = 5)" thì nó sẽ tương đương "a = 5; if (a)", gán 5 cho a xong rồi lại đi check nếu a (ở ví dụ này là true).
move_contract_solid(dir,maxdist): Di chuyển instance theo hướng dir cho trong phạm vi maxdist cho đến khi nó đụng vào 1 solid instance.
dir (direction): hướng di chuyển
maxdist (max distance): phạm vi di chuyển tối đa. Mặc định 0 hoặc -1 tương đương 1000 pixels.
2. move_contract_solid thì trong file content của game maker thì nói như ông @[where?] rồi. Nhưng ko hiểu tác dụng thực chất của nó là gì. Trong một số project mình thấy họ thêm cái này vào script va chạm với tường. Nhưng mình bỏ đoạn này đi vẫn hoạt động bình thường. Một dấu hỏi lớn đặt ra khi không ít project dùng nó mà mình chẳng hiểu là thêm nó vào để làm gì. (GME thôi. GMS đâu ^^)
Thì bạn tự nghĩ ra ứng dụng cho nó khi bạn cần đến nó chứ tác dụng thật chất là tác dụng gì. Giống như cos(a) biết để tính cos a, còn tính cos a làm gì thì chừng nào bạn cần thì bạn tự biết. =]]
Ví dụ bạn muốn viết cho 1 instance nó chạy đi đâu đó hết 500p, nếu gặp phải objWall thì dừng, thay vì phải:
Còn bạn bảo gỡ ra vẫn hoạt động bình thường, thì bạn nghĩ thế chứ trong 1 số trường hợp ít gặp nào đó nó lại bật lỗi. =]]
Còn sắp đội hình thì như ý trước của mình, cứ bỏ hết unit vô cái 2D array rồi di chuyển cả cái array 2D đi, cho unit bám theo vị trí của nó trong 2D array. Rõ hơn là:
- Units đi theo 2D array đội hình.
- Array đội hình được di chuyển tới đích.
Ý tưởng là vậy đấy nếu bạn hiểu. Unit chỉ di chuyển trong cái 2D array cốt là để giữ đội hình của nó, còn cái 2D array mới có nhiệm vụ để đi tới đích.
Thôi mình bỏ GM rồi, mà chắc cũng tạm thời bỏ làm game nên trả thread cho bạn. :D
Thì đừng dùng solid. Ý tưởng đơn giản là dùng bounding box để check collision giữa platform và player, trên players thì check chỉ khi bound bottom với platform thì mới chặn không cho velocity dương.
Nếu muốn sloping thì trước hết check collision bằng bounding box, chỉ khi nào bound tại bottom thì mới tiếp tục lấy pixel array của platform rồi giữ bottom y của player bằng pixel có y cao nhất hoặc pixel ở giữa thấp nhất và cao nhất.
Thôi mình bỏ GM rồi, mà chắc cũng tạm thời bỏ làm game nên trả thread cho bạn.
Lâu lâu vào reply mất ít phút thì còn siêng chứ bắt mình làm example nữa. =]]
Bounding box check 4 hướng có gì đâu mà phức tạp, cái này mình tin bạn ngồi nghĩ 1 hồi đi rồi sẽ ra. Lấy pixel array để làm sloping cũng vậy, khi nào bạn thử tìm hiểu các hàm làm việc với surface của GM thì bạn sẽ hiểu bạn cần làm gì.
Hồi trước mình học hoàn toàn không có đi hỏi ai 1 câu nào cả, toàn ngồi mò. Mà GM còn dễ đấy, lúc làm C++ còn phải tự code cái render, input, network, animation systems, event callback struct, etc hoàn toàn không hỏi ai câu nào luôn (để rồi có anh kia trên TTC ảnh bảo mình chỉ copy - past code có sẵn, hài vãi ra =]]). Nói không phải để khoe mà để bạn chịu khó. Sẵn tiện kể khổ luôn mới mấy năm trước mình còn phải xài con Celeron 700mhz, ram 128mb, vga 4mb chỉ chạy được cái GM 5.3 (trong khi ai cũng xài GM8, script bản này còn chưa có), RM thì lag thôi rồi mà còn cố học được. =]]
Bounding box là cái hình chữ nhật để check collision đấy và cũng là cái đơn giản nhất trong các loại collision detection. +_+
RAM nhiêu đó làm được nhiều thứ lắm chứ. Khổ ở cái CPU và VGU hơn. Ít ra cũng chạy fullspeed được cái engine của quake 1 và doom. =]] Lúc đó trong topic show desktop ở forum khác, mình post cái desktop mình lên mà không ai tin cái cấu hình của mình. Người ta xài vista thì mình mỗi lần cần học thì switch sang win 95, MS DOS. =]] Mình xài máy kĩ lắm, giống hiện tại máy có đỡ hơn nhưng vẫn yếu xìu, AV cũng tắt, dropbox cũng tắt, cần phải mở thì reset lại xài rồi sau đó tắt, đang ngồi code máy nóng quá tự động reboot hoặc blue screen là bình thường vẫn cố phải làm. =]] Làm kĩ năng kiếm tiền thì không thiếu, mà vào cái trang freelance thôi là lag ầm ầm rồi. Xài opera vào web nó lỗi nhưng chịu tại FF và nhất là chrome thì nặng. =]] Mà tới lúc kiếm được tiền thì cũng phải gửi lại cho nhà chứ không chi tiêu cá nhân để thay máy móc hay đầu tư làm ăn được, chứ đừng nói lấy tiền ăn chơi. =]] Ngồi máy làm kiêm chợ búa bếp núp, dọn dẹp nhà cửa, mà dạo này rảnh hơn nhiều rồi nên lên mạng tán dóc lại. :D Đã vậy nhiều khi còn bị người ngoài họ so sánh, nói này nói nọ nữa. =]] Mà ít bữa nữa thay máy mới rồi, đời xô đẩy nên phải buôn ma túy kiếm tiền, giàu rồi. :D =]]
=> Vậy nên mình có cái tính khinh người, hay kể lể, than thở và khá đàn bà. xD Nhiều khi ức chế quá đi phá nữa, phá TTC là điển hình. => Bị nhiều người ghét và nghĩ là thằng khìn dở hơi lắm. xD
giờ mình vẫn xài celeron đây này xD
hiện tại mình phải ôm chặt cái javascript kiếm thêm cái ngôn ngữ đa dạng này chứ gml thì mình thấy ko khả quan lắm $_$ (năm sau lên 12 rồi bị giảm ngồi máy)
lúc trước mình cũng dùng check collision = bounding box(circle) + surface + grids để làm destruct terrain :D
Comments
Bạn có thể dùng statement để check vị trí liên tục hoặc dùng Data structures để sắp xếp vị trí.
Ở đây mình dùng Data structures
lấy cái example của @[where?] vậy xD
https://drive.google.com/file/d/0Bxm-FFTO8gxbaVFhVlE5Si11UFU/edit?usp=sharing
example sắp xếp theo hình chữ nhật đơn giản hoặc muốn hình khác thì add thêm script ^^
Data structures là cái phần mà mình cũng có xem qua nhưng chưa từng áp dụng ^^
Đây là luật.
Ban nick cảnh cáo @nhoxboy74
Chắc hẳn @[where?] và @Vistrifa biết đây.
1. Sự khác biệt giữa "=" và "==". Equal và Double Equal
2. Ý nghĩa của function move_contract_solid(dir,maxdist)
@Focker_c:
'=' là toán tử gán giá trị phải cho trái.
'==' là toán tử so sánh, trả về true nếu phải bằng trái.
Trong GML thì có thể dùng '=' thay cho '==' (ngược lại thì không).
Nhưng khuyên khi làm toán so sánh thì nên dùng '==', tại nhiều ngôn ngữ khác nó khắt khe chỗ này lắm.
Ví dụ trong C++ mà để: "if (a = b)" thì hầu hết các compiler đều báo lỗi.
Còn trong AS3 mà để "if (a = 5)" thì nó sẽ tương đương "a = 5; if (a)", gán 5 cho a xong rồi lại đi check nếu a (ở ví dụ này là true).
move_contract_solid(dir,maxdist): Di chuyển instance theo hướng dir cho trong phạm vi maxdist cho đến khi nó đụng vào 1 solid instance.
dir (direction): hướng di chuyển
maxdist (max distance): phạm vi di chuyển tối đa. Mặc định 0 hoặc -1 tương đương 1000 pixels.
GMS hử?
2. move_contract_solid thì trong file content của game maker thì nói như ông @[where?] rồi. Nhưng ko hiểu tác dụng thực chất của nó là gì. Trong một số project mình thấy họ thêm cái này vào script va chạm với tường. Nhưng mình bỏ đoạn này đi vẫn hoạt động bình thường. Một dấu hỏi lớn đặt ra khi không ít project dùng nó mà mình chẳng hiểu là thêm nó vào để làm gì. (GME thôi. GMS đâu ^^)
Ví dụ bạn muốn viết cho 1 instance nó chạy đi đâu đó hết 500p, nếu gặp phải objWall thì dừng, thay vì phải:
Create:
Step:
Giờ chỉ việc 1 dòng duy nhất khi cần:
Còn bạn bảo gỡ ra vẫn hoạt động bình thường, thì bạn nghĩ thế chứ trong 1 số trường hợp ít gặp nào đó nó lại bật lỗi. =]]
Còn sắp đội hình thì như ý trước của mình, cứ bỏ hết unit vô cái 2D array rồi di chuyển cả cái array 2D đi, cho unit bám theo vị trí của nó trong 2D array. Rõ hơn là:
- Units đi theo 2D array đội hình.
- Array đội hình được di chuyển tới đích.
Ý tưởng là vậy đấy nếu bạn hiểu. Unit chỉ di chuyển trong cái 2D array cốt là để giữ đội hình của nó, còn cái 2D array mới có nhiệm vụ để đi tới đích.
Thôi mình bỏ GM rồi, mà chắc cũng tạm thời bỏ làm game nên trả thread cho bạn. :D
@[where?]
__
Có một cái này nữa gặp phải khi làm VVTH.
Game platform ấy mà.
Trong game Maple Story, hay Ghost ONL. Nhân vật có thể làm thế này:
Tức là nhảy qua wall rồi đứng đc ở trên đấy.
Lúc đầu mình nghĩ cũng đơn giản thôi. Ai ngờ bắt tay vào làm ko dễ tẹo nào.
Mình so sánh vị trí của ob_wall so với người chơi để quyết định solid của nó sẽ true hay false.
Step :
[php]if ob_player.vspeed<0 and y<ob_player.y
{solid=false}
else
{solid=true}[/php]
Nhưng nếu game 2 player thì so sánh vị trí kiểu này ko đc.
Cho mình xin cái ý tưởng khác với.
Nếu muốn sloping thì trước hết check collision bằng bounding box, chỉ khi nào bound tại bottom thì mới tiếp tục lấy pixel array của platform rồi giữ bottom y của player bằng pixel có y cao nhất hoặc pixel ở giữa thấp nhất và cao nhất.
"Phức tạp thế?"
Với lại toàn những phần mình chưa tìm hiểu.
Chân thành mong @[where?] làm dùm cái example !
Về phần cơ bản thôi là đc.
Lâu lâu vào reply mất ít phút thì còn siêng chứ bắt mình làm example nữa. =]]
Bounding box check 4 hướng có gì đâu mà phức tạp, cái này mình tin bạn ngồi nghĩ 1 hồi đi rồi sẽ ra. Lấy pixel array để làm sloping cũng vậy, khi nào bạn thử tìm hiểu các hàm làm việc với surface của GM thì bạn sẽ hiểu bạn cần làm gì.
Hồi trước mình học hoàn toàn không có đi hỏi ai 1 câu nào cả, toàn ngồi mò. Mà GM còn dễ đấy, lúc làm C++ còn phải tự code cái render, input, network, animation systems, event callback struct, etc hoàn toàn không hỏi ai câu nào luôn (để rồi có anh kia trên TTC ảnh bảo mình chỉ copy - past code có sẵn, hài vãi ra =]]). Nói không phải để khoe mà để bạn chịu khó. Sẵn tiện kể khổ luôn mới mấy năm trước mình còn phải xài con Celeron 700mhz, ram 128mb, vga 4mb chỉ chạy được cái GM 5.3 (trong khi ai cũng xài GM8, script bản này còn chưa có), RM thì lag thôi rồi mà còn cố học được. =]]
Mò từ từ đê.
_
Đành lại nghiên cứu vầy. Bounding box. Một phần mà mình phải đi từ khái niệm... Haiz...
_
À mà ram 128mb thì chạy đc cái gì ? :v
Có chạy đc word ko ?
_
@Vistrifa có rảnh thì làm dùm tôi cái example nói trên với !
RAM nhiêu đó làm được nhiều thứ lắm chứ. Khổ ở cái CPU và VGU hơn. Ít ra cũng chạy fullspeed được cái engine của quake 1 và doom. =]] Lúc đó trong topic show desktop ở forum khác, mình post cái desktop mình lên mà không ai tin cái cấu hình của mình. Người ta xài vista thì mình mỗi lần cần học thì switch sang win 95, MS DOS. =]] Mình xài máy kĩ lắm, giống hiện tại máy có đỡ hơn nhưng vẫn yếu xìu, AV cũng tắt, dropbox cũng tắt, cần phải mở thì reset lại xài rồi sau đó tắt, đang ngồi code máy nóng quá tự động reboot hoặc blue screen là bình thường vẫn cố phải làm. =]] Làm kĩ năng kiếm tiền thì không thiếu, mà vào cái trang freelance thôi là lag ầm ầm rồi. Xài opera vào web nó lỗi nhưng chịu tại FF và nhất là chrome thì nặng. =]] Mà tới lúc kiếm được tiền thì cũng phải gửi lại cho nhà chứ không chi tiêu cá nhân để thay máy móc hay đầu tư làm ăn được, chứ đừng nói lấy tiền ăn chơi. =]] Ngồi máy làm kiêm chợ búa bếp núp, dọn dẹp nhà cửa, mà dạo này rảnh hơn nhiều rồi nên lên mạng tán dóc lại. :D Đã vậy nhiều khi còn bị người ngoài họ so sánh, nói này nói nọ nữa. =]] Mà ít bữa nữa thay máy mới rồi, đời xô đẩy nên phải buôn ma túy kiếm tiền, giàu rồi. :D =]]
=> Vậy nên mình có cái tính khinh người, hay kể lể, than thở và khá đàn bà. xD Nhiều khi ức chế quá đi phá nữa, phá TTC là điển hình. => Bị nhiều người ghét và nghĩ là thằng khìn dở hơi lắm. xD
hiện tại mình phải ôm chặt cái javascript kiếm thêm cái ngôn ngữ đa dạng này chứ gml thì mình thấy ko khả quan lắm $_$ (năm sau lên 12 rồi bị giảm ngồi máy)
lúc trước mình cũng dùng check collision = bounding box(circle) + surface + grids để làm destruct terrain :D