Hướng dẫn làm game "Anh hùng huyền thoại"

Thảo luận trong 'Game Development' bắt đầu bởi orahermit, 28/3/07.

  1. orahermit

    orahermit Youtube Master Race

    Tham gia ngày:
    12/1/07
    Bài viết:
    21
    Game này mình làm có nhiều object lắm, khó có thể hướng dẫn chi tiết được tất cả, thế nên mình up file gốc gm6 lên để mọi người có thể tự nghiên cứu :D :;)
    Link file này: http://files.myopera.com/magclock/Legend/Anh hung huyen thoai ver0.04.gm6

    Bây giờ là hướng dẫn cho những object quan trọng:

    1. obj_hero:

    Object này là object gốc của các hero, các object khác như obj_fighter01, obj_hunter01... đều kế thừa object này.
    * Event step:
    Event này thực hiện nhiệm vụ tính toán các thông số cho nhân vật, đồng thời kiểm tra xem nhân vật đã lên lvl hay chưa.

    * Event left button:
    Khi bạn nhấn nút trái chuột vào nhân vật, nhân vật sẽ được chọn.
    Mình dùng biến global là global.choosing_hero để lưu địa chỉ của nhân vật đang được chọn.

    2. obj_fighter01: (giống với obj_hunter01 và obj_cleric01)
    Các object này kế thừa obj_hero, các bạn có thể thấy rõ điều đó qua event của chúng. Sở dĩ mình dùng obj_hero làm object gốc là vì mình muốn các nhân vật có thể được quản lý dễ dàng. Chẳng hạn, mình muốn tìm một nhân vật gần một quái vật nhất, nếu sử dụng tính kế thừa (như trên) mình sẽ chỉ cần dùng một lệnh rất đơn giản là:
    nếu không sử dụng obj_hero, mình sẽ phải dùng nhiều code hơn:
    và điều này thực sự vô cùng bất tiện X(

    Tất nhiên, các obj_fighter01, obj_hunter01 ... không thể không có những đặc điểm riêng.
    * Event Create:
    Sau khi kế thừa event create của obj_hero, các thông số, vật dụng của từng nhân vật sẽ được tạo trong event này.
    * Event Step:
    Event này chủ yếu thực hiện việc di chuyển (Move) của nhân vật. Khi bạn điều khiển nhân vật di chuyển đến một ô nào đó trên map, một loạt obj_find_way sẽ được tạo ra để dánh dấu đường, khi đã tạo xong đường, script move_the_hero sẽ lưu con đường vào mảng global.gridd[.,.]. Nhân vật sẽ dựa vào mảng trên để di chuyển.
    global.gridd[.,.] = {0,1,2,3} = {Left,Up,Right,Down}
    Để tạo delay cho việc di chuyển, mình dùng đồng hồ Alarm0 để dánh dấu. Nhân vật di chuyển một bước (1 ô) hết 8 nhịp đồng hồ nên sau mỗi lần di chuyển, mình đặt biến can_action của nhân vật là false, hẹn giờ Alarm0 là 8. Trong event Alarm0 mình sẽ đặt lại biến can_action của nhân vật thành true :D để nhân vật có thể xử lý típ :;)
    Thực sự với object nhân vật việc dùng Alarm0 giúp nhân vật di chuyển có lẽ là việc khiến mình phải suy nghĩ nhiều nhất ::(

    3. obj_monster:
    Cũng giống như obj_hero, obj_monster chủ yếu dùng để đơn giản hóa việc quản lý quái vật (khi bạn xem toàn bộ game, bạn sẽ thấy mình dùng các object gốc để quản lý rất nhiều)
    * Event step:
    Trong event này, quái vật sẽ được quản lý về lượng máu và quản lý việc tấn công nhân vật.
    Quản lý lượng máu:
    Nếu HP của quái vật giảm xuống 0, đương nhiên là nó phải die #>:) Khi quái vật chết, sẽ có một thông báo trên màn hình, đồng thới, nhân vật giết chết quái vật sẽ được cộng thêm một số điểm exp ứng với từng quái vật.

    Quái vật tấn công:

    Lện collision_point(...) sẽ tìm các nhân vật ở 8 ô xung quanh quái vật để tấn công (bạn thấy việc dùng obj_hero tiện lợi thế nào rồi chứ :;) ) Nếu tìm thấy bất cứ một nhân vật nào, quái vật sẽ tự động tấn công X(. Sau khi tấn công, quái vật sẽ hết lượt và chuyển lượt sang quái vật khác.

    Mình cũng dùng biến global.choosing_monster để quản lý quái vật đang được chọn. Nếu tất cả các quái vật đã hết lượt thì sẽ đến lượt người chơi.
    4.obj_monster01:
    Xét một cách khái quát thì obj_monster01 đối với obj_monster cũng giống như obj_fighter01 đối với obj_hero. Bạn có thể dễ dàng hiều được obj này :;)

    (Còn nữa...(nếu mọi người yêu cầu :D))
     
  2. ken10

    ken10 Programmer

    Tham gia ngày:
    10/1/04
    Bài viết:
    2,341
    Nơi ở:
    Ho Chi Minh city
    @orahermit: Bài viết khá lắm, Ken ủng hộ việc bạn viết tiếp ::D.
     
  3. orahermit

    orahermit Youtube Master Race

    Tham gia ngày:
    12/1/07
    Bài viết:
    21
    ** Trong obj_global_var mình đã khai báo phần lớn các biến global của game.

    5.obj_gamecontroller:
    Đây là một object rất quan trọng, nó có nhiệm vụ quản lý game đặc biệt là quản lý hành động của quái vật :;)
    Khi đang là lượt của nhân vật (tức là lượt đi của bạn)
    nếu là bắt đầu một lượt mới (được thiết lập bới obj_playerturn) các thông số của các nhân vật sẽ được cập nhật lại. Trong đó có số ô đi được, khả năng tấn công:
    Ngoài obj_hero, mình còn thêm vào obj_summon_hero, đó là object của những nhân vật được gọi ra bởi hero (phần này mình sẽ nói sau)

    Khi đang là lượt của quái vật
    cũng tương tự như trên, nếu là mới bắt đầu lượt thì object sẽ reset lại tất cả các thông số của quái vật :D
    Đồng thời, object sẽ tìm quái vật đầu tiên để thiết lập cho nó hành động
    Biến global.monster_quantity xác định số lượng quái vật có trong map.
    Biến global.monster_number giúp xác định quái vật đang hoạt động.

    Ngoài việc quản lý lượt, obj_gamecontroller còn giúp cho màn hình game luôn nằm trong một không gian xác định!! (Why?? Mình sẽ nói ngay ở dưới)
    Lý do: Độ phân giải của game là 640x480 và mình chỉ sử dụng một khoảng là 480x480 để hiển thị map, còn phần bên phải để hiển thị menu, thông số... do đó luôn cần phải giữ để màn hình ở đúng vị trí ^^ Còn một lý do nữa đó là do việc xây dựng "room" của mình.

    ** Mặc dù GameMaker hỗ trợ việc tạo nhiều room và cho phép di chuyển từ room này sang room khác nhưng ta không thể chuyển dữ liệu từ room này sang room khác. Ví dụ: Nhân vật kiếm khách khi ở room 1 đang có 50 máu, 10 mana, 1 cái kiếm .... thì bạn không thể chuyển tất cả những gì liên quan đến nhân vật này sang room 2!! (so hard to do this) Điều đó thực sự rất bất tiện. Do vậy, mình chỉ sử dụng room 1 để create bản đồ (bạn có thể xem file gốc) và các bản đồ được phân chia ở các vùng nhỏ :;). Làm như vậy, để dịch chuyển giữa các map, bạn chỉ việc thiết lập lại phạm vi hoạt động của màn hình (view[0]). Phạm vi hoạt động của màn hình chính là hình chữ nhật
    [(global.view_x1,global.view_y1) ; (global.view_x2,global.view_y2)] :D

    6.obj_message:
    Khi bạn lên lvl, khi bạn giết được một con quái vật... tất nhiên trò chơi phải thông báo với bạn :;) Trong game này mình cũng làm vậy nhờ vào obj_message. Object này rất đơn giản, ta chỉ việc gán một message cho nó, và bắt nó hiển thị trên màn hình :D Event Draw của object giúp ta làm việc này
    Để khi dịch chuyển map, dòng chữ vẫn ở vị trí tương đối so với khung hình, trong lệnh draw_text_color, ta phải để vị trí của nó là (x,y) ~ (view_xview[0]+pos_x,view_yview[0]+pos_y) với (pos_x,pos_y) được xác định ở event create.

    ** Khi một message được tạo ra, để nó không bị đè lên những message trước đó, mình dùng một tip rất đơn giản. Bạn hãy để ý trong event create:
    Dòng lệnh cuối cùng đã đẩy tất cả các dòng message đã tồn tại trước đó lên trên :;)

    * Event step:
    Hiệu ứng làm mờ dần dòng chữ rồi cho nó biến mất hẳn được mình ưa thích ;;) :x Mình dùng biến alpha để làm việc này. Ban đầu alpha=2.5 .
    Cứ sau 1 nhịp clock thì alpha lại giảm đi 0.01 đến khi alpha giảm xuống dưới 0 thì message sẽ tự động bị hủy. Như trên đã nói trong hàm draw_text_color(), bạn thấy có tham số alpha, nó có tác dụng lọc dòng text (khó nói quá :'>)

    7.obj_block:
    Cái nì mình học được nhờ vào tutorial của chính trang gamemaker.nl. Chắc không phải nói nhìu :D Bạn bật phần room lên, nhìn xung quanh bản đồ (phần mép nước) là thấy một đống obj_block. Mình dùng nó để giới hạn vùng hoạt động của nhân vật và quái vật!!:devil:

    (Còn nữa...)

    @Ken10: Thanks! :hug:
     
  4. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@:

    - Bạn xem thêm phần persistent để giải quyết vấn đề trên, bấm F1 -> search "persistent"

    - Uhm, xem project của bạn thì có thể thấy công sức của bạn như thế nào, cảm ơn vì đã chia sẽ.

    - Ngoài lề tí: Cho hỏi chuyên ngành bạn đang học là gì vậy, Y!M mình là zeroonea, có gì trao đổi thêm.

    Regards.

    :@}
     
  5. orahermit

    orahermit Youtube Master Race

    Tham gia ngày:
    12/1/07
    Bài viết:
    21
    Mình là dân Tự động hóa nhưng mà thích làm game ^^
    Hóa ra là chức năng persistent cho phép lưu giữ info của object, mình không để ý đến, thanks ^^
     
  6. Alone Beast

    Alone Beast C O N T R A

    Tham gia ngày:
    14/1/04
    Bài viết:
    1,607
    Nơi ở:
    ...
    Well done! Tiếp tục phát huy nhé bạn.
     
  7. XxKonanxX

    XxKonanxX Mario & Luigi

    Tham gia ngày:
    27/12/05
    Bài viết:
    883
    Nơi ở:
    _Rune Midgart_
    wow , lâu ngày mới thấy có người hướng dẫn GM đầy dủ và nhiều công sức thật .
    cho thảo luận 1 tí
    item còn có 2 kiểu , 1 kiểu là dạng số túc là có số lượng 50 bình máu
    còn kiểu 2 là nó nằm trong thùng đồ , khi đó các item còn bị quản lí chặt chẽ hơn về vị trí ..
    nếu dùng item kiểu thùng đồ thì tạo hẳn 1 room cho thùng đồ , rồi stranper nó

    còn đơn thuần item chỉ quản lí số lượng thì mình chỉ cần dùng : global.binhmau , global.binhmana ..
    khi đó thì đâu cần dùng tranper làm gì ???
     
  8. rongthanxx

    rongthanxx Mr & Ms Pac-Man

    Tham gia ngày:
    6/3/06
    Bài viết:
    210
    Nơi ở:
    ?
    làm bằng phần mêm nào thế cho em biết vơi em đang dùng RPG make game XP
     
  9. ken10

    ken10 Programmer

    Tham gia ngày:
    10/1/04
    Bài viết:
    2,341
    Nơi ở:
    Ho Chi Minh city
    @orahermit: Tiếp đi bạn ơi ! Bài viết công phu và bỗ ích lắm^^.
     
  10. orahermit

    orahermit Youtube Master Race

    Tham gia ngày:
    12/1/07
    Bài viết:
    21
    Thông cảm, mấy hôm nay đang rất bận, để 2 tuần nữa rồi mình post tiếp.
     
  11. doiloithoi

    doiloithoi Youtube Master Race

    Tham gia ngày:
    14/2/05
    Bài viết:
    44
    2 tuần nữa cơ à... híc... thôi thì đợi vậy. Cám ơn về bài hướng dẫn nhé bạn.
     
  12. Duong_de

    Duong_de Dragon Quest

    Tham gia ngày:
    14/2/05
    Bài viết:
    1,214
    Nơi ở:
    Hải Phòng
    Very tuyệt , vít típ đê ông oai !

    !
     
  13. orahermit

    orahermit Youtube Master Race

    Tham gia ngày:
    12/1/07
    Bài viết:
    21
    Sắp thi Robocon rồi, tuần sau thi xong viết tiếp ^^
     

Chia sẻ trang này