[Thảo Luận] Topic thảo luận GameMaker Engine

2456714

Comments

  • [where?][where?] Posts: 149Registered
    @Vistrifa: Mình nghĩ chắc bạn xài GM8.1 nên thế, bạn xài GM8 sẽ không có vấn đề gì đâu. Khi bạn down về cũng chú ý down đúng bản dành cho phiên bản GM bạn xài nếu có nhiều bản. Về bên người dùng thì cơ bản 39dll và Faucet là na ná nhau nên những gì bạn đã tìm hiểu ở 39dll vẫn sẽ ứng dụng tốt cho Faucet nên cố chuyển sang Faucet đi, hiện tại thì phiên bản mới nhất của Faucet nhanh hơn nhiều phiên bản mới nhất của 39dll, dùng không hối hận đâu.
  • Focker_cFocker_c Posts: 1,577Registered
    @Vistrifa , @[where?] :
    Client - Server thì những thông tin cần bảo mật sẽ được xử lý ở server, giảm thiểu hoặc loại bỏ hoàn toàn khả năng clients can thiệp vào những dữ liệu quan trọng, còn Client - Client thì cheat tha hồ.
    Mình thấy là mấy game hot trên MAC hiện nay đề theo mô hình client-client mà. Nhưng chắc khả năng bảo mật của chúng nó ko có gì phải lo sợ. ^^
    Tương tự Client - Server thì có thể làm lobby để player tìm đến nhau, liệt kê danh sách room, thuận tiện cho player tìm kiếm người chơi với mình hơn. Theo như yêu cầu của bạn thì game là Room-Based MO vậy nên giờ bạn quyết định xem có nên làm lobby hay không.
    Ồ ! Thì ra là lobby là như vầy. Và chẳng phải đây là mô hình của Garena sao ? ^^
    Mình băn khoăn rằng : ta lại phải làm riêng một phần lobby riêng tác biệt với game phải ko ? (Garena là như vậy mà) Và để làm lobby thì chúng ta làm bằng gì ? C+ hay GML ?
    Cũng muốn biết mức độ kiến thức để làm đc lobby..

    port Player.IO hoặc Photon Cloud Server sang dll cho GM, dùng với gói free, tạm đủ để test game và chơi tầm mười mấy người 1 lúc. Nếu muốn làm cho anh em trên TTC chơi thì mình nghĩ gói 10$ / m (cả 2 thằng) là đủ. Lưu ý là Player.IO chỉ support TCP, Photon Cloud thì cả TCP lẫn UDP nhưng giá đắt hơn.
    Server thì mình chưa nghiên cứu nhiều ^^
    Nó hoạt động trên một cái host phải ko ?
    Có thể đưa ra thêm một số giá khác đc ko ?

    Muốn làm MMO cho tươm tất với GM thì bên server side phải viết bằng những ngôn ngữ nhanh và tối ưu cho phần mạng lẫn phần cứng server, thường thì người ta làm tương đối nghiêm túc sẽ chọn server viết bằng C++, client mới dùng GM. Build server bằng GM thì nặng phần cứng server và dễ nghẽn mạng lắm
    Và vì vậy thì Focker_C xin đưa ra một quyết định : VVTH sẽ thay đổi hệ thống giao đấu. Nhưng cũng ko phải đấu qua LAN, mà sẽ là 1 game PK 2 người chơi.
    Trước mắt là sẽ như vậy. Tuy sẽ bớt hay đi rất nhiều. Nhưng đây mới chỉ là phiên bản đầu. Nếu đc ủng hộ, sẽ tiếp tục phát triển thêm.


    _________


    P/S : Cũng muốn hóng chút về "Faucet Networking"
    Có gì khác biệt gì giữa Faucet Networking và 39dll ?
  • fight manfight man Posts: 73Registered
    1: mình muốn enemy bị dính đạn và đạn sẽ không bay tiếp thì làm thế nào
    2: mình muốn enemy di chuyển sang trái, sang phải thì làm thế nào
    3: mình muốn đạn bay theo hướng đứng của player và enemy có thể bắn khi thấy player thì làm thế nào
    đó là 1 số câu hỏi của mình
  • Focker_cFocker_c Posts: 1,577Registered
    @fight man :
    1: mình muốn enemy bị dính đạn và đạn sẽ không bay tiếp thì làm thế nào
    Các hạ mở object enemy lên. Trong event va chạm với đạn, thêm script:
    other.instance_destroy()
    
    2: mình muốn enemy di chuyển sang trái, sang phải thì làm thế nào
    Đơn giản, các hạ sử dụng và đặt giá trị cho hspeed.
    3: mình muốn đạn bay theo hướng đứng của player và enemy có thể bắn khi thấy player thì làm thế nào
    Việc này yêu cầu bạn cần làm thêm một số biến cùng với script.
    Lưu ý : Các hạ nên cố gắng đọc và hiểu chứ đừng copy và bê vào project. Nếu bạn hiểu, bạn có thể nâng cấp script hoặc sửa chữa nó khi gặp lỗi. Mình sẽ cố gắng chỉ dùng những script đơn giản, dễ hiểu.

    Những biến cần thêm: (thêm trong event create đó mà)
    [php]huong_nhin=0 // Trong đó : 0 là phải, 1 là trái[/php]

    Và ta phải sắp đặt huong_nhin theo hoạt động của nhân vật.
    Ở event bấm phím quay trái, thêm 1 dòng script:
    huong_nhin=1
    
    Còn ở event bấm phím quay trái, thêm 1 dòng script:
    huong_nhin=0
    

    Xong, như vậy việc "set up" hướng nhìn đã hoàn thành.
    Bây giờ đến phần sử dụng nó.
    Trước hết là bạn mở object đạn lên.
    Ta sẽ thêm script ở event step, ta sẽ "set up" hướng của viên đạn theo hướng đang nhìn của nhân vật.

    [php]
    if ob_player.huong_nhin=1 // bên phải
    {hspeed = 5}
    if ob_player.huong_nhin=0 // bên trái
    {hspeed = -5}[/php]
    Giải thích:
    Trong đó, ob_player là object nhân vật của các hạ.
    Script này chính là việc điểu chỉnh tốc độ và hướng của viên đạn thông qua hspeed.

    Xong rồi đấy ! "đạn bay theo hướng đứng của player" như các hạ nói.

    Còn vụ "enemy có thể bắn khi thấy player" thì nó là việc lập 1 cái AI (trí thông minh nhân tạo) cơ bản.
    Chắc là ngày mai mình sẽ nói.
    Bây giờ cũng hết giờ rảnh rỗi của mình rồi.
  • fight manfight man Posts: 73Registered
    code của gm cũng ghi bằng tiếng việt được à
  • Focker_cFocker_c Posts: 1,577Registered
    Ko viết đc tiếng việt đâu.
    Bần đạo viết như vầy cho chư vị hiểu đc đó mà.
  • fight manfight man Posts: 73Registered
    thực ra mình không có dự án nào cả
    mình chỉ làm 1 cái demo để hiểu rõ tác dụng của các code, event và object mà thôi và sau này mình có chút trình độ mới tiến tới làm dự án
  • Focker_cFocker_c Posts: 1,577Registered
    Thì đúng rồi !
    Đó là 1 phương pháp để học GML đó mà. Nhưng bạn cần phải có người để lời cho bạn nếu muốn học theo phương pháp này ^^
  • [where?][where?] Posts: 149Registered
    @fight_man:

    3: mình muốn đạn bay theo hướng đứng của player và enemy có thể bắn khi thấy player thì làm thế nào?

    Example: https://dl.dropboxusercontent.com/u/58156219/Linh Tinh/aiming.gmk

    Nhìn vào event Step của objEnemy:
    distanceToShoot = 250;
    
    if (canShoot)
    if (distance_to_object(objPlayer) < distanceToShoot) {
        bl = instance_create(x, y, objEneBullet);
        bl.direction = point_direction(x, y, objPlayer.x, objPlayer.y);
        bl.speed = 5;
        canShoot = false;
        alarm[0] = 30;
    }
    

    - Method distance_to_object(obj): Khi bạn gọi method này trong Object thì nó sẽ trả về khoảng cách giữa Object với obj. Trong demo mình đặt là khi objPlayer tới gần objEnemy trong phạm vi 250 thì objEnemy sẽ bắn.

    - Function point_direction(x1, y1, x2, y2): Function này trả về direction từ (x1, y1) đến (x2, y2). Bạn dùng cái này để tính direction cho objEneBullet.

    Ghi chú: Nếu bạn cho camera (view) chạy theo player thì bạn có thể check nếu objEnemy đi vào view thì cho nó bắn, sử dụng view_xport, view_yport, view_wport, view_hport, view border này nọ tùy setting của bạn.
    @Focker_c:
    1. Bạn lấy gì để chắc chắn? Ít nhất chúng nó có 2 lớp bảo mật cục bộ trên Client:
    - Obfuscation: Làm rối source, chặn được script kiddies chỉ biết dùng mấy tool như Art Money.
    - Message encryption : Mã hóa message được gửi và nhận để làm giảm khả năng dữ liệu bị detect, replicate và reproduce. Có thể phần nào ngăn chặn những người dùng tools như Symantec.

    Nhưng mình nói mình vẫn phá được. Ý là nếu bảo mật đến lớp 2 thì có lẽ mình không cheat theo đúng ý mình được nhưng vẫn có thể đón đầu, chỉnh sửa và làm giả các gói thông tin để phá game. Việc này rất dễ với bất cứ ai có tí kiến thức mạng. Lớp 1 thì hex edit hay speed gear cũng đủ để phá game nếu có kiến thức mod game nâng cao này nọ. Nói chung client - client thì để cheat game hoàn toàn chả cần những kiến thức cao xa gì, gặp script kiddies mà lanh lợi tí nó phá cho nát nếu nó muốn.

    2. Bạn tự xem xét khả năng bạn làm được gì rồi làm theo nhu cầu của bạn.

    3. Cái nào bạn chưa biết thì cứ tìm hiểu đi, mình đã nói rõ tên dịch vụ rồi bạn cứ lên trang chủ của nó mà đọc và đừng quên người thầy của bạn: Google.

    Thật lòng mà nói thì mình thấy những câu hỏi của bạn khá ngớ ngẩn nên mình cũng không biết trả lời thế nào cho phải. Hiện tại bạn cứ tìm hiểu, làm được tới đâu thì tới, sau này bạn sẽ hiểu ý mình chứ hiện tại thì mình có giải thích mấy cũng vậy thôi. Mình hint cả rồi nên bạn để Google làm phần việc còn lại.
  • fight manfight man Posts: 73Registered
    vậy có thể giải thích cho mình những code như:
    if, other,bl ...
    để ám chỉ những hành động nào của nhân vật không
  • Focker_cFocker_c Posts: 1,577Registered
    @fight man :
    vậy có thể giải thích cho mình những code như:
    if, other,bl ...

    Đây là những câu lệnh đó mà.

    -Câu lệnh về "if" thì mình đã nói trong guide rồi thì phải.

    [php]if [điều kiện]
    { [hành động sẽ xảy ra] }[/php]

    Ví dụ :

    [php]if het_tien = true
    { tien += 1000 }[/php]

    -Khi trong một event mà có sử dụng từ "other". Thì nó để ám chỉ đến object còn lại mà tham gia vào quá event đó. Thường thường nhất thì nó đc dùng trong event va chạm.
    Ví dụ : Đạn bay vào quái.Va chạm xảy ra.
    Trong event va chạm của obj quái, có dòng :
    [php]HP -= 10
    other.instance_destroy()[/php]
    Tức là HP của quái bị giảm 10.
    Và "other" bị destroy. "Other" là object còn lại trong sự kiện này, ở đây, "other" là viên đạn.


    -Còn [where?] sử dụng từ "bl" trong script thực ra là một cách đặt biến thôi.
    Như mình đã nói, thì việc tạo biến thường xảy ra ở event create. Nhưng có một số biến mà chúng ta chỉ sử dụng 1 lần rồi thôi, như vậy tạo ở create rất mất công. Ta có thể tạo luôn ở event khác.
    Ví dụ : Như trong script của [where?] :
    [php]bl = instance_create(x, y, objEneBullet);
    bl.speed = 5;[/php]
    Bạn ấy tạo ra biến có tên là "bl" (viết tắt của bullet đó mà ^^, nghĩ bậy bạ gì đây chứ hả?). "bl" chính là 1 object sẽ được tạo ra trong lệnh instance_create(x, y, objEneBullet) . Hay nói cách khác, "bl" là 1 object objEneBullet.
    Ở câu lệnh tiếp theo : bl.speed = 5
    Nghĩa là chúng ta đặt speed của biến "bl" vừa tạo ra bằng 5.


    Như vậy, bài học cho các bạn là:
    Khi gặp câu lệnh :
    [php]<m>.<x> = <k>[/php]
    (Lưu ý dấu chấm)
    Thì ta hiểu rằng đây là việc đặt giá trị cho biến x của object có tên là m một giá trị là k.

    Một số ví dụ :
    [php]ob_nguoi_choi.HP = 100
    ob_enemy.HP -= 70
    ob_hero.die = true
    ob_ten_dich.cau_noi = 'Ta ko so mi dau'[/php]

    Đây đã là phần mở rộng đôi chút của GML. Nếu bạn chưa hiểu đc ngay thì cũng ko sao. Mình đã từng trải qua. Cố gắng áp dụng nhiều thì bạn sẽ hiểu bản chất và sử dụng chúng hợp lý.
    Chúc bạn thành công.

    @[where?] : Thôi đc rồi, bỏ vụ online ^^ . Làm game 2players vậy.
  • fight manfight man Posts: 73Registered
    vậy ngoài những câu lệnh này ra còn những câu lệnh nào khác không
    trong script mình thấy có đoạn bỏ dòng... vậy đó có phải là chia khu vực hoạt động của script không
    và ngoặc [, {, ( có phải sử dụng để viết tên của sprite tronmg ngoặc không
  • [where?][where?] Posts: 149Registered
    Như bạn Focker_c đã giải thích khá chuẩn rồi, mình chỉ nói rõ thêm 1 chút để tránh bị bối rối sau này:

    Hàm instance_create sẽ trả về ID của instance được tạo, trong GML bạn có thể truy xuất vào các phần tử của instance thông qua ID của nó và toán tử ".". Mình gán giá trị của biến bl là ID của instance bullet được tạo và mình dùng nó để truy xuất vào properties của bullet như direction, speed, bạn cũng có thể truy xuất vào method ví dụ như "bl.destroy()". Tương tự như Focker_c đã giải thích, "other" là biến chỉ đọc được dựng sẵn trong GML mang ID của object còn lại tham gia vào event. Nói thêm GML mỗi object có còn "self" là biến dựng sẵn mang ID của chính object đó. '.' là toán tử mà trong GML dùng để truy xuất vào các phần tử thuộc object. "object.properties" hoặc "object.method".

    Nhấn mạnh lại bl không phải là object mà nó chỉ mang ID của object. Nếu bạn in bl ra như "show_message(bl)" bạn sẽ thấy giá trị của bl là 1 dãy số, nó chính là ID đấy. Giờ mình gán "abc = bl" thì "abc.speed = 5" tương đương "bl.speed = 5", cả 2 biến abc và bl đều cùng truy xuất vào 1 object duy nhất thông qua cùng 1 ID.

    GML hơi dở nên sau này nếu các bạn có học lập trình với những ngôn ngữ có khái niệm con trỏ thì những kiến thức ở trên sẽ phải hiểu laị, đừng ép bản thân hiểu theo như khi dùng GM.

    @fight man:
    Bạn mở GM, ấn F1, qua phần "The Game Maker Language (GML)" bạn xem tuần tự từng phần thuộc "GML Language Overview", trong đó có ví dụ và giải thích cho từng phần mà bạn thắc mắc đấy.@Focker_c:
    Thì bạn cứ làm đi, quan trọng là bạn làm với mục đích gì. Nếu chỉ làm để học thì như mình đã nói cứ làm được tới đâu thì làm, miễn sao học được những kiến thức mới. Post trước mình cũng bảo bạn cứ làm Client - Client đi nhưng bạn phải giảm bớt những yêu cầu mà bạn đã đặt ra.
  • Focker_cFocker_c Posts: 1,577Registered
    Nhấn mạnh lại bl không phải là object mà nó chỉ mang ID của object.
    File content help của Game Maker nói đi nói lại và khẳng định điều này ^^ . Nó cũng là sự khác biệt giữa instance và object.

    GML hơi dở nên sau này nếu các bạn có học lập trình với những ngôn ngữ có khái niệm con trỏ thì những kiến thức ở trên sẽ phải hiểu laị, đừng ép bản thân hiểu theo như khi dùng GM.
    Điều này thì mình hoàn toàn ko biết ^^
    @[where?] thử cho 1 ví dụ ngắn để xem nào ^^
  • fight manfight man Posts: 73Registered
    vậy mình muốn dùng chuột để chọn 1 đơn vị quân nào đó (như các game RTS) thì nó có hướng dẫn ở đó không nhỉ
Sign In or Register to comment.