Nếu bạn muốn nói đến Game Maker thì ...
Mình là MOD đây. ^^
Để 1 object đuổi theo 1 object khác là một chuỗi câu lệnh rất phức tạp cho newbie bạn à ^^
Thực ra, về căn bản ko khó. Cái khó ở đây là trên đường đuổi theo, object sẽ gặp các trướng ngại vật và ko biết phải đi làm sao.
Còn để 1 object lao đến 1 object khác theo 1 đườn thẳng thì có 2 cách mà nảy ngay ra trong đầu mình
À mà 2 cách này mình đã viết guide rồi đấy. Bạn tìm đọc trong box
Căn bản là object này sẽ liên tục di chuyển đến tọa độ của object kia.
Đoạn script trên hoàn toàn cơ bản. Không hề có lỗi.
Bạn xem đã sử dụng đúng chưa.
Bạn xem Object Người chơi của bạn có tên là "obj_player". Nếu nó ko có tên như vậy thì dùng làm sao đc.
Bạn nên tập làm. Copy script làm gì ^^
Để 1 object đuổi theo 1 object khác là một chuỗi câu lệnh rất phức tạp cho newbie bạn à ^^
Thực ra, về căn bản ko khó. Cái khó ở đây là trên đường đuổi theo, object sẽ gặp các trướng ngại vật và ko biết phải đi làm sao.
1 câu lệnh nhé bạn. Mà chả cần lệnh, trong đống action kéo thả có sẵn rồi đó. +_+
if x < obj_player.x
{hspeed=3}
if x > obj_player.x
{hspeed=-3}
if y < obj_player.y
{vspeed=3}
if y > obj_player.y
{vspeed=-3}
Làm thế này rất dở. Bạn nghĩ đi, đối tượng đuổi theo sẽ không stop hẳn khi đã đuổi kịp nên nhiều khi nó giật qua giật lại liên tục xung quanh đích, nhất là ở tốc độ cao. Nếu bạn có muốn làm chay thì ít ra cũng như này:
//Bỏ phần else đi nếu không muốn nó đuổi dí sát, đè lên player.
var runSpeed = 5;
if (x < objPlayer.x - runSpeed) x += runSpeed; else x = objPlayer.x;
if (x > objPlayer.x + runSpeed) x -= runSpeed; else x = objPlayer.x;
if (y < objPlayer.y - runSpeed) y += runSpeed; else y = objPlayer.y;
if (y > objPlayer.y + runSpeed) y -= runSpeed; else y = objPlayer.y;
Trong event Step của 1 object bạn dùng hàm action_potential_step để cho object đó liên tục di chuyển theo 1 tọa độ nào đó. Hàm này cho phép object tự tìm đường đi qua các chướng ngại để đến đích.
action_potential_step(desX, desY, stepSize, avoidAll)
desX: Hoành độ của đích.
desY: Tung độ của đích.
stepSize: Có thể hiểu là tốc độ di chuyển, nhưng chính xác là giá trị để update x và y của object sau mỗi lần hàm này được gọi.
avoidAll: true nếu né tất cả các object, false nếu chỉ né solid object.
Mỗi khi hàm này được gọi nó sẽ thay đổi vị trí của object gọi nó theo tham số stepSize hướng theo tọa độ đích được nhập vào và né các đối tượng chắn đường.
Mình đang bận và không muốn làm rối example nên coi như player đi xuyên tường nhé.
Lưu ý dù là có set né hay không né solid object khi dùng hàm action_potential_step thì các vật thể về bản chất vật lý là cứng và không chuyển động như tường thì bạn nên chuyển nó thành solid (tick vào ô solid).
Và 1 điều nữa là bạn không cần script cũng được, tại bên action phần Move / Steps có cái action thứ 2 bên trái sang. Cứ kéo thả nó vô rồi xài thôi, các tham số như cái hàm action_potential_step cả trừ 1 cái option là relative. Tick nó vào thì desX và desY sẽ trở thành vị trí tương đối với x, y của object. Đại khái khi bạn tick vào nó thì nó sẽ tương đương thế này:
action_potential_step(x + desX, y + desY, stepSize, avoidAll)
^ Muốn AI thông minh hơn thì vẫn có thể dùng thằng action_potential_step thôi nhưng trước tiên phải hiểu bản chất cái action_potential_step đã. Thằng action_potential_step nó không dùng thuật toán pathfinding đúng nghĩa, nó chỉ check kiểu như mình dùng place_meeting nếu thấy có chướng ngại thì thay đổi hướng di chuyển từng chút 1 theo cung tròn đến khi tìm được vị trí có thể di chuyển, kết quả là nó sẽ di chuyển bám sát theo cạnh vật cản nhưng có thể mắc kẹt vào tình huống cứ di chuyển vòng vòng hoài. Cách khắc phục là check liên tục từng step để thấy nếu thằng action_potential_step nó cứ nhả hướng vòng vòng thì giảm stepSize cũng như thay đổi desX, desY lệch khỏi player từng chút 1 cho đến khi thoát khỏi tình trạng bị mắc kẹt. Bạn muốn tìm đường hoàn hảo thì phải sắp các object vào grid mà check, rồi tìm path đúng nghĩa theo grid, nhưng như thế không phù hợp cho action game mà player cần sự thông thoáng, tự do trong chuyển động. Quan trọng là để xây dụng 1 game hay, vừa ý thì phải kết hợp nhiều yếu tố, phải mapping sao cho phù hợp. Với AI tìm đường trung bình mà mapping khôn ngoan thì AI ấy vẫn sẽ hoạt động tốt, còn đưa bạn perfect AI mà mapping bậy bạ thì AI cũng chịu thua thôi. Cũng như khi dựng AI tìm đường, khi học và làm phải tìm cách thoát khỏi bế tắc, phải đi vào cái trọng tâm là "làm sao để làm được", "làm sao để làm tốt" chứ đừng vòng vo. Điểm mạnh yếu gì thì nêu lên cách khai thác và khắc phục chứ đừng nói khơi khơi cho có, không mang tính xây dựng. Trước khi reply trả lời cho người mới thì bạn cũng đừng khẳng định điều gì mà bạn chưa biết, chưa rõ, làm vậy là hướng họ đi sai đường, làm họ nản 1 cách không cần thiết.
Comments
Mình là MOD đây. ^^
Để 1 object đuổi theo 1 object khác là một chuỗi câu lệnh rất phức tạp cho newbie bạn à ^^
Thực ra, về căn bản ko khó. Cái khó ở đây là trên đường đuổi theo, object sẽ gặp các trướng ngại vật và ko biết phải đi làm sao.
Còn để 1 object lao đến 1 object khác theo 1 đườn thẳng thì có 2 cách mà nảy ngay ra trong đầu mình
À mà 2 cách này mình đã viết guide rồi đấy. Bạn tìm đọc trong box
Căn bản là object này sẽ liên tục di chuyển đến tọa độ của object kia.
[/b]Bài toán : [/b]Hãy di chuyển obj Quái đến vị trí của obj Player.
(Mình sẽ đưa cho bạn cách làm mà bạn có thể hiểu đc)
Hướng làm : Xác định vị trí của obj Player , từ đó điểu chỉnh tốc độ và hướng đi của Obj Quái với vspeed và hspeed.
Cách làm :
Chắc chắn là xài event Step của Obj Quái
Ta đặt ra các giả định xem obj_player đang ở đâu so với obj Quái. Từ đó, ta đặt tốc độ và hướng cho obj Quái.
Chúc bạn thành công !
___
Hô hô ! Bây giờ thì mình là MOD duy nhất hoạt động trên forum ^^
Bạn xem đã sử dụng đúng chưa.
Bạn xem Object Người chơi của bạn có tên là "obj_player". Nếu nó ko có tên như vậy thì dùng làm sao đc.
Bạn nên tập làm. Copy script làm gì ^^
Mấy trang up ảnh free rẻ tiền chán lắm ^^
1 câu lệnh nhé bạn. Mà chả cần lệnh, trong đống action kéo thả có sẵn rồi đó. +_+
Làm thế này rất dở. Bạn nghĩ đi, đối tượng đuổi theo sẽ không stop hẳn khi đã đuổi kịp nên nhiều khi nó giật qua giật lại liên tục xung quanh đích, nhất là ở tốc độ cao. Nếu bạn có muốn làm chay thì ít ra cũng như này:
@iluvgml
@fight man:
Trong event Step của 1 object bạn dùng hàm action_potential_step để cho object đó liên tục di chuyển theo 1 tọa độ nào đó. Hàm này cho phép object tự tìm đường đi qua các chướng ngại để đến đích.
action_potential_step(desX, desY, stepSize, avoidAll)
desX: Hoành độ của đích.
desY: Tung độ của đích.
stepSize: Có thể hiểu là tốc độ di chuyển, nhưng chính xác là giá trị để update x và y của object sau mỗi lần hàm này được gọi.
avoidAll: true nếu né tất cả các object, false nếu chỉ né solid object.
Mỗi khi hàm này được gọi nó sẽ thay đổi vị trí của object gọi nó theo tham số stepSize hướng theo tọa độ đích được nhập vào và né các đối tượng chắn đường.
File example, các bạn mở ra xem là tiện nhất:
https://dl.dropboxusercontent.com/u/58156219/Linh Tinh/following.gmk
Mình đang bận và không muốn làm rối example nên coi như player đi xuyên tường nhé.
Lưu ý dù là có set né hay không né solid object khi dùng hàm action_potential_step thì các vật thể về bản chất vật lý là cứng và không chuyển động như tường thì bạn nên chuyển nó thành solid (tick vào ô solid).
Và 1 điều nữa là bạn không cần script cũng được, tại bên action phần Move / Steps có cái action thứ 2 bên trái sang. Cứ kéo thả nó vô rồi xài thôi, các tham số như cái hàm action_potential_step cả trừ 1 cái option là relative. Tick nó vào thì desX và desY sẽ trở thành vị trí tương đối với x, y của object. Đại khái khi bạn tick vào nó thì nó sẽ tương đương thế này:
action_potential_step(x + desX, y + desY, stepSize, avoidAll)
Đây là điểm yếu của cái action này ^^