Multiplayer với GameMaker nào

Thảo luận trong 'Game Development' bắt đầu bởi bullno1, 27/8/06.

  1. bullno1

    bullno1 Mr & Ms Pac-Man

    Tham gia ngày:
    22/4/06
    Bài viết:
    221
    Game mạng với GameMaker
    Download hai cái này

    example trong bài:http://forums.gamevn.com/attachment.php?attachmentid=44227&stc=1&d=1156673354

    39dll:http://forums.gamemaker.nl/index.php?showtopic=90437
    Extract hai cái vào cùng một thư mục


    Trước đây bullno1 đã từng nói “bâng quơ” là sẽ hướng dẫn mọi người làm multiplayer với GM,một số người cũng giục làm đi.Tục ngữ có câu “bullno1 ko nói chơi” thế nên trước khi ra đi,phải thực hiện lời nói đó.
    GameMaker bản thân nó đã hỗ trợ multiplayer,(ở đây hiểu là qua mạng,chứ ko phải hai thằng chơi một máy).Nó có 4 kiểu kết nối
    -IPX: cái này lỗi thời,chả thấy dùng,chả thấy tài liệu hướng dẫn nữa -> vứt đi
    -Serial connection:Kết nối qua cổng serial,chả lẽ cứ chơi game là phải cầm dây nối vào máy đối thủ? -> vứt đi
    -Modem connection:Kết nối nhờ modem,tức là truyền dữ liệu qua đường điện thoại bằng modem
    -> vừa chậm vừa tốn tiền,vứt đi
    -TCP/IP: Kiểu này đc,game thời nay toàn dùng kiểu này.Nhưng mà GM chơi direct play T_T ,đơn giản thì có đơn giản,nhưng :
    1)Chậm,khi tìm server thì còn tưởng là game treo -> gây bực mình
    2)Dùng quá nhiều cổng
    ->cũng nên vứt đi.

    Thế thì học cái *** gì?
    Có thể bài hướng dẫn này hơi cắt bớt giai đoạn,nhưng thực ra làm multiplayer với mấy lệnh bắt đầu bằng chữ mplay_ thì trên web của GM đã có rồi,tôi chả hơi đâu mà dịch và cũng ghet cái mplay đấy lắm.Chúng ta sẽ làm bằng socket,bằng 39dll.dll .Tuy hơi khó hơn,nhưng có tốc độ,khả năng tùy biến cao.Ko gây bực mình cho người chơi :P .Và thực ra tôi học về socket trước khi biết đến GM nên chắc mọi người cũng học đc.

    Thế socket là cái *** gì?
    Từ điển dịch là ổ cắm.Ổ cắm cắm vào lỗ để truyền điện,thì trong máy tính socket cắm vào port để truyền dữ liệu.Tạm thời chỉ cần biết sơ sơ về hai loại socket
    -TCP :Tranmission control protocol, hiểu là nó truyền dữ liệu tuy chậm,nhưng chính xác.Trong game thì những dữ liệu ít truyền,đòi hỏi chính xác như dữ liệu về đồ,chat thường đc dùng cái này
    -UDP:User defined packet ,nhỏ hơn và nhanh hơn TCP,đương nhiên là kém chính xác.Nên những dự liệu lặp nhiều,ko cần chính xác lắm thì hay dùng cái này vd: tọa độ người chơi.

    Socket nó còn kiểu chia nữa là:
    -Blocking socket: socket sẽ block(nghĩa là dừng) chương trình khi chưa có dữ liệu đc truyền
    -Non-blocking socket: ko thèm block,ko quan tâm là có dữ liệu hay ko

    Do Gamemaker ko có khả năng về lập trình socket,nên có các dll để bổ trợ về socket như
    -39
    -SOC
    -GMsock
    3 dll trên thực ra là cũng gần như nhau,nhưng nhiều người thích 39 và SOC hơn.
    Tôi chỉ hướng dẫn về 39.

    Chú ý về sử dụng
    -Các dll viết ra cho gm đều đi cùng wrapper script(script để sử dụng nó) và hướng dẫn,phải RTFM(read the fu***ing manual -> đọc kỹ hướng dẫn sử dụng :P )
    -Cần có file dll đó ở cùng thư mục với file gm6 để test game.
    -Khi chuyển thành exe thì cũng cần file dll đó đi kèm.
    Chú ý về làm game multiplayer:
    -Đây là công việc ko đơn giản,đòi hỏi kiên nhẫn,code viết ra phải áp dụng đc cho mọi người chơi.
    -Kinh nghiệm của tôi là khi test game,tạo một excutable rồi chạy nó,và chạy debug mode trong GM.
    -Cần có một sniffer vì nhiều khi mình ko biết chương trình nó send cái quái gì.
    Bắt đầu về 39:
    Hướng dẫn sơ sơ một số lệnh trong 39(dịch từ hướng dẫn chính gốc của nó)
    -dllinit(path,use file?,use ultilites?):cần gọi một lần trước khi sử dụng mọi lệnh khác trong 39.
    Path là đường dẫn đến file 39dll,cứ cho một con số bất kì vào là nó tự tìm trong thư mục hiện tại,đỡ mệt
    Usefile:true hoặc false: có sử dụng chức năng đọc ghi file của 39 ko.Chức năng của nó khá tốt,hay hơn GM nên bạn nên dùng
    Use ultilité:true hoặc false: có sử dụng các tiện ích khác như mã hóa,tìm ip … ko? Nên dùng
    -> trong game start event hoặc create event của một object có chức năng điều khiển chung,ta dùng lệnh: dllinit(1,1,1);
    -dllfree:cần gọi khi game kết thúc để giải phóng tài nguyên.
    -> trong game end event ta dùng dllfree();
    -tcpconnect(ip,port,blocking mode):tạo kết nối đến địa chỉ ip,và cổng port và trả về mã số của nó.Nếu mã số <=0 là ko kết nối đc.IP là địa chỉ để xác định máy tính trong mạng.Port: là cái ổ để mà socket nó cắm vào.Bịa ra một con số vd: 1234 chẳng hạn.Lưu ý là cần tránh một số cổng đặc biệt như 139,80,23… vì bị sử dụng rồi.Giá trị của port có thể trong khỏang 1->65536( 2^16) .Cần lưu giá trị trả về vào 1 biến global để sử dụng sau này
    Blocking mode là chế độ blocking/non-blocking đã nói ở trên,nhận các giá trị 0->2
    0:blocking
    1:non-blocking(nhưng khi đang thực hiện kết nối thì vẫn block,nên sử dụng loại này)
    2:non-blocking++,chương trình chạy tiếp tục ngay,kể cả khi chưa kết nối xong hoặc kết nối hỏng.
    -tcplisten(port,max,mode):lắng nghe trên một cổng để chờ kết nối.Bạn chỉ kết nối đc vào một cổng của máy tính nếu máy đó đã lắng nghe trên cổng đó. Port:cổng để nối.Max:số người tối đa đc chờ kết nối,chú ý là đc chờ chứ ko phải là đc kết nối.Giống như khi xếp hang,cho tối đa là 5 thằng đứng trong hàng nhưng bao nhiêu thằng vào cũng đc.Mode :blocking,non blocking ,nên để giá trị 1.
    -tcpaccept(listening socket,blocking mode): chấp nhận một kết nối khách (đc tạo bằng tcpconnect) vào kết nổi chủ(đc tạo bằng tcplisten) và trả lại mã số của nó để liên lạc sau này.Việc này giống như cho thằng đang xếp hàng vào nhà mình.Blocking mode: thôi ko nói nữa,dùng 1.
    -setnaggle(socket,mode) :chỉ dùng cho tcp socket,nếu để mode là 1 thì tốc độ truyền dữ liệu trên socket đó sẽ nhanh hơn,cứ hiểu đơn giản là vậy.

    -udpconnect(port,mode) :cũng giống tcp connect,nhưng ko cần ip vì udp là một connectionless protocol,nghĩa là thực ra nó ko kết nối gì sất.

    -closesocket(socket): ngắt kết nối

    Về việc truyền dữ liệu:
    39 dùng buffer để truyền dữ liệu.Nó giống như viết thư vào giấy(buffer) rồi gửi tờ giấy đi.
    Để gửi thì có:
    sendmessage(socket,[ip],[port]) gửi nội dung trong buffer qua một socket.ip và port chỉ cần thiết khi đó là udp,vì udp như đã nói,nó vốn ko kết nối.Trả lại dung lượng đã gửi,<=0 là gửi bị lỗi.
    receivemessage(socket) trả lại dung lượng nhận đc và copy nó và buffer để đọc.Nếu <=0 là ko nhận đc gì.
    Buffer:
    Buffer như đã nói là dùng để ghi ,nhận dữ liệu.Sử dụng nó cũng giống như sử dụng file.Có các lệnh:
    clearbuffer():xóa hết nội dung trong đó,đưa con trỏ về 0.Rất cần khi phải gửi dữ liệu mới
    writebyte,writestring,writeshort....:các lệnh để viết dữ liệu với các kiểu khác nhau vào buffer.Chính vì vậy mà 39 nhanh hơn mplay vì mplay chỉ có 2 kiểu dữ liệu là real và string-> rất tốn bandwidth.
    readbyte,readstring,readshort: đọc dữ liệu với các kiểu tương ứng.

    Bây giờ chúng ta chỉ cần vài lệnh đó đã,nâng cao mới cần hơn.Bắt đầu ví dụ:

    Chương trình chat dành cho hai người. :x


    Tạo một project mới trong GM,merge nó với file 39.gm6 rồi save vào cùng thư mục với file 39dll.dll .
    Tạo một object,đặt tên là chat.
    Trong create event gõ đoạn lệnh:

    dllinit(0,1,1);
    ishost=show_question(“Do you want to host?”);//hỏi xem có muốn host ko,nếu ko là join
    if ishost //nếu host
    {
    global.server=tcplisten(12345,1,1)//lắng nghe cổng 12345
    global.client=-1;//chưa có ai connect
    }
    else
    global.client=tcpconnect(get_string(“Connect to”,’’),12345,1);//join

    Trong step event:
    if ishost and global.client<=0 //nếu mình host và chưa có ai connect
    global.client=tcpaccept(global.server,1)//chấp nhận kết nối,non-blocking socket
    if global.client//nếu đã kết nối
    {
    if receivemessage(global.client) //nếu nhận đc thông điệp
    show_message(readstring());//đọc thông điệp rồi báo
    }

    Trong draw event:
    draw_text(x,y,keyboard_string);//viết ra nội dung chat
    Trong keypress enter event:
    clearbuffer();//xóa hết nội dung trong buffer
    writestring(keyboard_string,1);//viết nội dung vào buffer
    sendmessage(global.client);//gửi đi
    keyboard_string=’’;//xóa hết dòng chat cũ
    Trong game end event:
    dllfree();

    Vứt object chat vào một cái room.Tạo một excutable,chạy nó,đồng thời chạy game bằng gm.Một cái chọn host(yes) cái kia chọn join(no),địa chỉ là 127.0.0.1,bạn đang chat một mình :) .
    Nếu định phát hành cái chương trình chat này thì hãy mở game information ra và gõ vào đó
    Credit:
    -39ster(39dll)


    Phần một dừng ở đây,dự kiến các phần sau là:
    -Chat nhiều người
    -Game đơn giản,có mấy hình tròn hình vuông chạy lung tung
    -Broadcast,server list,lobby
    -Game online

    Bài tập về nhà =)) =)) mọi người thử làm thêm mấy cái sau.
    -Nickname,gợi ý: chỉ cần thêm vào đầu message
    -Giao diện đẹp hơn
    -Chức năng buzz(dùng một message đặc biệt chẳng hạn)
     

    Các file đính kèm:

    • tut1.zip
      Kích thước:
      7.2 KB
      Đọc:
      74
  2. ogizine

    ogizine Mr & Ms Pac-Man

    Tham gia ngày:
    19/6/04
    Bài viết:
    227
    sao lâu rồi chưa viết tiếp thế ?
     
  3. XxKonanxX

    XxKonanxX Mario & Luigi

    Tham gia ngày:
    27/12/05
    Bài viết:
    883
    Nơi ở:
    _Rune Midgart_
    ừ viết tiếp đi bullno1 . tui hỏi 1 tí nè .??
    ông có thể làm game :

    online máy chủ , máy khách ..
    mỗi người chơi có khả năng tạo room để chờ người khác vào ...
    chiến đấu với nhau 1 lúc nhiều người .( chiến đâu ko quan trọng , quan trọng là có tương tác được với nhau ko )
    lưu trữ nickname, password và các thông số của người chơi .vd: máu , tiền , các đồ vật , cấp độ .

    nếu làm được thế thì share luôn đi , chứ bày dạy khó học lắm . nếu đủ các phần trên thì có thể làm 1 game online được( tựa gunbound ) nếu thế thì VD tui làm thì ông là người có công lập trình đó .cradit ...
     
  4. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: ong bull di du ho.c roi, 10 nam sau mo'i ve^` vie^'t tie^'p duo.c :@}
     
  5. ogizine

    ogizine Mr & Ms Pac-Man

    Tham gia ngày:
    19/6/04
    Bài viết:
    227
    ??? bộ du học ở nơi ko co internet hay sao ?
     
  6. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: cậu nhóc bảo vậy ai biết được :@}
     
  7. ogizine

    ogizine Mr & Ms Pac-Man

    Tham gia ngày:
    19/6/04
    Bài viết:
    227
    10 nam sau sợ GM ra ban 1x.x rồi ,những gì hắn viết chả còn dùng được gì nua~ quá ^^!
     
  8. bullno1

    bullno1 Mr & Ms Pac-Man

    Tham gia ngày:
    22/4/06
    Bài viết:
    221
    Có internet,nhưng internet của ký túc xá thì cấm sex và game. :( :(
    Dùng proxy cũng đc nhưng sợ thằng quản lý nó bắt thì mệt.

    Đang dùng lậu máy của ngee ann poly vì ở đây ko firewall gì hết.
    Tuần này mua laptop rồi :D

    Edit: Tranh thủ teacher chưa vào, vào gamevn thêm phát nữa.
    @Konnan:
    Làm server cho game online bằng GM có vẻ ko đc thiết thực cho lắm. Vì nhiều lý do lắm, có thời gian sẽ nói sau vì sắp phải học tiếp rồi.Client thì làm bằng GM đc.Game chạy trên LAN nhu kiểu worm hay warcraft...
    Tương tác đc hay ko là do người lập trình và thể loại game vd: mario thì nhảy lên đầu, cs thì bắn đạn ...

    Hiện giờ bull đang làm một cái project gọi là bullnet:
    http://forums.gamemaker.nl/index.php?showtopic=238358&hl=bullnet
    Mục tiêu của nó là một hệ thống gần như mplay của GM nhưng với tốc độ cao hơn, update server list mà ko làm game dừng lại và làm game multiplayer theo phương pháp drag&drop(tức là ko cần động đến tí script nào)
     
  9. XxKonanxX

    XxKonanxX Mario & Luigi

    Tham gia ngày:
    27/12/05
    Bài viết:
    883
    Nơi ở:
    _Rune Midgart_
    bullno1 cho xin cái réoure game megaman online sẻver của ông đi , cái đó good đó , nó gần đầy đủ các yêu cầu của tui đó .
    thực ra thì chỉ cần làm 1 game online khoảng vài chục người kết nối băng 39dll là good rồi .
    cho hỏi thêm các game online nào trên GMC open resoure ,cho xin link lun
    thank
     
  10. >VoDich<

    >VoDich< Legend of Zelda

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

    vào GMC search với từ khóa MMORPG engine -> ra hàng đống

    :@}
     
  11. XxKonanxX

    XxKonanxX Mario & Luigi

    Tham gia ngày:
    27/12/05
    Bài viết:
    883
    Nơi ở:
    _Rune Midgart_
    điên lắm rồi , lúc này post được bên này giờ lại ko post được bên kia .
    bàn luận tiếp nhá bullno1 , hay cho yahoo đi
    tui xem cái example có mấy khối vông chạy chạy nhưng ko biết làm sao để có thể bắn đạn và chuyển thông tin đến cho máy khác .

    còn về vụ example chat thì thôi khỏi ,nó dễ quá , thực ra tui nghiên cứu khá nhiều ,giờ đang đâu đầu vụ tạo đạn bắn nhau và tạo room mới thôi . bác chio cái example megaman đi chứ 3 cái chat nhảm ruồi lắm .
    thank
     

Chia sẻ trang này