[Thảo Luận] cách làm cho monster đuổi theo nhân vật

iluvgmliluvgml Posts: 2Registered
edited August 2019 in Game Maker: Studio
Như tiều đề thôi ai giúp mình, chứ để bọn nó như tượng game mất phần hay
«1

Comments

  • TobiTobi Posts: 92Registered
    Để ý lại, đây là game maker :-s *Đi ra ngoài*
  • slucis7593slucis7593 Posts: 544Registered
    Game Maker thì bạn lấy tọa độ nhân vật rồi cho monster đi đến tọa độ đó, cứ update liên tục như vậy
  • Focker_cFocker_c Posts: 1,577Registered
    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.
  • iluvgmliluvgml Posts: 2Registered
    Cảm ơn bạn :)
  • kumuzukumuzu Posts: 669Registered
    hết trò phải giở cái trò clone này :dodgy:
  • Focker_cFocker_c Posts: 1,577Registered
    clone tức là sao? Từ này mới gặp ^^
  • fight manfight man Posts: 73Registered
    bạn có thể giải thích rõ hơn cách thức được không
  • Focker_cFocker_c Posts: 1,577Registered
    Ok !

    [/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
    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}
    

    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 ^^
  • fight manfight man Posts: 73Registered
    lỗi script rồi bạn
  • Focker_cFocker_c Posts: 1,577Registered
    Đ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ì ^^
  • fight manfight man Posts: 73Registered
    không có báo lỗi ở đoạn nào nhưng vào test nó báo lỗi ở đâu đó nên mình đã thử sửa 1 vài chỗ nhưng vẫn vậy
  • Focker_cFocker_c Posts: 1,577Registered
    Chụp cho mình xem cái lỗi coi. Nhớ up ảnh lên face nha ^^
    Mấy trang up ảnh free rẻ tiền chán lắm ^^
  • [where?][where?] Posts: 149Registered
    +_+"
    Để 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;
    


    @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)
  • Focker_cFocker_c Posts: 1,577Registered
    Nếu gặp 1 đống solid trước mặt thì object sẽ ko biết "né" thế nào mà ^^
    Đây là điểm yếu của cái action này ^^
  • [where?][where?] Posts: 149Registered
    ^ 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.
Sign In or Register to comment.