Chế độ đa người chơi không đồng bộ

Với mô-đun ysdk.multiplayer, bạn có thể tạo chế độ cạnh tranh giống như nhiều người chơi trực tuyến. Khi đó, bạn không cần phải:

  • viết và duy trì giải pháp máy chủ của riêng mình;
  • có đủ khối lượng người chơi cần thiết để tìm kiếm đối thủ nhanh chóng.

Các thể loại game mà bạn có thể thực hiện cốt lõi thông qua SDK:

  • Trò chơi giải đố: các phiên chơi không đồng bộ có thể được phát trên bảng trò chơi lân cận, có thể thêm sự cạnh tranh về thời gian hoặc điểm số. Ví dụ về các trò chơi phù hợp: Solitaire Online! (của KosmosGames), Match Arena - Ba trong Một! (của PecPoc Piggy).
  • Chạy nhảy và đua xe: các phiên của đối thủ có thể được hiển thị dưới dạng “bóng mờ”, di chuyển qua cấp độ đồng thời với người chơi (cơ chế ghost driver). Ví dụ về các trò chơi phù hợp: Xe điên 2 (của JL studio) ở chế độ “Đua tốc độ”, Mô tô điên (của haoda games).
  • Chiến thuật và autobattle: bạn có thể thực hiện các trận đấu chống lại chiến thuật của các người chơi khác. Ví dụ về các trò chơi phù hợp: Ludus (của Positron Dynamics), Like a King (của Vladimir Saponenko), TOYS: Crash Arena (của Mad Pixel).

Khái niệm

  1. Người dùng A chơi, SDK ghi lại các sự kiện chính (nhấn phím, thay đổi trạng thái) và ghi nhận thời gian của chúng.
  2. Các sự kiện này được lưu trữ trên máy chủ dưới dạng timeline (danh sách giao dịch).
  3. Khi người dùng B khởi động trò chơi, đối thủ trong phiên của họ sẽ được tải từ các timeline đã được lưu trữ.
  4. SDK phát lại các hành động của đối thủ theo thời gian thực, tạo cảm giác như đang chơi cùng lúc.

Khởi tạo và tải các phiên

Để bắt đầu với chế độ multiplayer không đồng bộ, hãy gọi phương thức ysdk.multiplayer.sessions.init(). Trong phương thức này, việc khởi tạo ban đầu và tải các phiên chơi của đối thủ được thực hiện.

Phương thức trả về mảng các phiên đã tải.

Tham số count xác định số lượng phiên cần tải. Số phiên tối đa trong phản hồi là 10.

Các tham số meta1, meta2, meta3 được sử dụng để lựa chọn. Chúng có dạng các đối tượng { min: %number%, max: %number% } và được thiết lập khi lưu phiên. Ví dụ, nếu meta1 chứa điểm số trong trò chơi và meta2 chứa cấp độ của người chơi, bạn có thể tải các phiên đã lưu gần với người dùng hiện tại theo các tham số này.

Cảnh báo

Để tải phiên, cần thiết lập ít nhất một trong ba tham số meta và giá trị tham số count lớn hơn không. Nếu không, chế độ multiplayer sẽ chỉ được khởi tạo để ghi lại.

ysdk.multiplayer.sessions.init({
  count: 2, // Số lượng phiên đối thủ để tải (tối đa 10).
  isEventBased: true, // Cờ để khởi tạo hoạt động thông qua sự kiện.
  maxOpponentTurnTime: 200, // Giới hạn thời gian lượt đi của đối thủ (ms).
  meta: {
    meta1: {
      min: 0,
      max: 6000,
    },
    meta2: {
      min: 2,
      max: 10,
    },
  },
}).then(opponents => console.log(opponents));
const work = async () => {
  const opponents = await ysdk.multiplayer.sessions.init({
    count: 2, // Số lượng phiên đối thủ để tải (tối đa 10).
    isEventBased: true, // Cờ để khởi tạo hoạt động thông qua sự kiện.
    maxOpponentTurnTime: 200, // Giới hạn thời gian lượt đi của đối thủ (ms).
    meta: {
      meta1: {
        min: 0,
        max: 6000,
      },
      meta2: {
        min: 2,
        max: 10,
      },
    },
  });

  console.log(opponents);
}

work();

Định dạng câu trả lời

[
  {
    id: string;
    meta: {
      meta1: number;
      meta2: number;
      meta3: number;
    };
    player: {
      avatar: string;
      name: string;
    };
    timeline: [
      {
        id: string;
        payload: object | string | undefined;
        time: number;
      },
      ...
    ];
  },
  ...
]

Tham số

Kiểu

Mô tả

id

string

Định danh phiên.

meta

object

Các tham số tùy chỉnh meta1, meta2, meta3. Ví dụ: điểm số trong trò chơi hoặc cấp độ của người chơi.

player

object

Thông tin về đối thủ:

  • avatar: string — URL của ảnh đại diện người dùng;
  • name: string — tên người chơi.

timeline

array

Mảng các sự kiện có thời gian, mô tả phiên chơi:

  • id: string — định danh duy nhất của sự kiện;
  • payload — dữ liệu sự kiện, thông tin phản ánh bản chất, lý do thay đổi trong thế giới trò chơi (ví dụ: tọa độ mới của nhân vật hoặc nhấn nút chuột);
  • time: number — thời gian từ khi bắt đầu trò chơi có tính cả khoảng dừng (ms).

Ghi lại phiên chơi game

Hạn chế

Tối đa kích thước của một phiên ghi lại là 200 KB.

Sử dụng SDK để ghi lại các phiên chơi game của người dùng (chuỗi sự kiện kèm theo dấu thời gian). Các sự kiện có thể là di chuyển các quân cờ trên bàn cờ trong trò chơi giải đố hoặc nhấn các phím của bàn phím hoặc chuột trong các trò chơi chạy không ngừng.

Trong các trò chơi mà đầu vào của người dùng là liên tục, ví dụ như trong các trò chơi chạy không ngừng, các sự kiện có thể được tạo ra một cách nhân tạo trong một khoảng thời gian quy định, ghi lại trạng thái của nhân vật — tọa độ, mức năng lượng, v.v. Điều này cũng có thể là các sự kiện ngẫu nhiên trong trò chơi — phần thưởng, động đất.

Các sự kiện diễn ra trong trò chơi được lưu trữ dưới dạng giao dịch. Mỗi giao dịch có:

  • id — định danh duy nhất của sự kiện;
  • payload — dữ liệu sự kiện: thông tin phản ánh bản chất, lý do thay đổi trong thế giới trò chơi (ví dụ, tọa độ mới của nhân vật hoặc nhấn nút chuột);
  • time — thời gian kể từ khi bắt đầu trò chơi với sự điều chỉnh cho việc tạm dừng.

Trong suốt trò chơi, lưu trữ payload bằng phương thức commit(). Điều này sẽ hình thành danh sách các giao dịch — dòng thời gian của phiên chơi game (timeline).

Cuối trò chơi, lưu trữ phiên chơi trên máy chủ bằng phương thức push(). Sau khi lưu trữ, phiên chơi có thể được tải và phát lại trong trò chơi tiếp theo.

ysdk.multiplayer.sessions.commit()

Phương thức commit() xác định các giao dịch của phiên chơi hiện tại. Dữ liệu sự kiện (payload) được truyền vào phương thức này.

Cảnh báo

Các tham số khác của giao dịch – mã định danh (id) và thời gian từ khi bắt đầu trò chơi (time) – được tính trong SDK, do đó việc gửi payload kịp thời là rất quan trọng.

Ví dụ sử dụng

// Giao dịch đầu tiên.
ysdk.multiplayer.sessions.commit({ x: 1, y: 2, z: 3, health: 67 });

// .......

// Giao dịch tiếp theo.
ysdk.multiplayer.sessions.commit({ x: 4, y: -2, z: 19, health: 15 });

// .......

ysdk.multiplayer.sessions.push()

Phương thức push() được sử dụng để lưu trữ timeline lên máy chủ từ xa. Phương thức này được gọi khi trò chơi kết thúc.

Các giá trị meta1, meta2, meta3 được thiết lập khi lưu phiên làm việc. Ít nhất một trong các tham số meta phải được xác định rõ.

Ví dụ sử dụng

ysdk.multiplayer.sessions.push({ meta1: 12, meta2: -2 });

Làm việc với phiên

Để chọn cách làm việc với các phiên đã tải của đối thủ, trong phương thức init(), truyền giá trị cần thiết của cờ isEventBased:

  • true — làm việc thông qua sự kiện;
  • false — tự xử lý.

Khách hàng đăng ký sự kiện multiplayer-sessions-transactionmultiplayer-sessions-finish thông qua ysdk.on(), và SDK tự tải phiên chơi chung và đưa ra sự kiện theo dấu thời gian được chỉ định trong đó:

  • Trong thời gian trò chơi, các giao dịch của đối thủ sẽ đến bộ xử lý multiplayer-sessions-transaction vào thời điểm ghi nhận từ khi bắt đầu phiên, nhưng có tính đến giới hạn thời gian nước đi của đối thủ (maxOpponentTurnTime, tham số của phương thức init()).

  • Khi phiên kết thúc, bộ xử lý multiplayer-sessions-finish sẽ được gọi với định danh của đối thủ có trò chơi đã kết thúc.

ysdk.multiplayer.sessions.init({
  count: 2, // Số lượng phiên đối thủ để tải (tối đa 10).
  isEventBased: true, // Cờ để khởi tạo hoạt động thông qua sự kiện.
  maxOpponentTurnTime: 200, // Giới hạn thời gian lượt đi của đối thủ (ms).
  meta: {
    meta1: {
      min: 0,
      max: 6000,
    },
    meta2: {
      min: 2,
      max: 10,
    },
  },
});

// Ở đây đến một mảng giao dịch để thực hiện tại thời điểm hiện tại:
// giao dịch hiện tại, cùng với các giao dịch bị trì hoãn do trò chơi có thể bị đóng băng.
ysdk.on('multiplayer-sessions-transaction', ({ opponentId, transactions }) = > {
  console.log(opponentId, transactions);
  // Áp dụng dữ liệu transaction.payload trên sân chơi.
});

ysdk.on('multiplayer-sessions-finish', (opponentId) => console.log(opponentId));

Khởi động và tạm dừng chế độ nhiều người chơi được quản lý bởi các phương thức đánh dấu sự kiện trò chơi:

// Bắt đầu chế độ nhiều người chơi.
ysdk.features.GameplayAPI.start();

// Tạm dừng chế độ nhiều người chơi.
ysdk.features.GameplayAPI.stop();

Phương thức khởi tạo chế độ nhiều người chơi init() trả về một mảng các phiên đã tải của đối thủ, chứa các dòng thời gian với các giao dịch.

Nhận dữ liệu và xử lý chúng một cách riêng biệt:

const start = (opponent) => {
  console.log('player', opponent.player);
  console.log('timeline', opponent.timeline);

  // Triển khai cơ chế sử dụng dữ liệu dòng thời gian và người chơi.
}

const work = async () => {
  const opponents = await ysdk.multiplayer.sessions.init({
    count: 2, // Số lượng phiên đối thủ để tải (tối đa 10).
    isEventBased: false, // Cờ để khởi tạo hoạt động thông qua sự kiện.
    maxOpponentTurnTime: 200, // Giới hạn thời gian lượt đi của đối thủ (ms).
    meta: {
      meta1: {
        min: 0,
        max: 6000,
      },
      meta2: {
        min: 2,
        max: 10,
      },
    },
  });

  console.log('opponents', opponents);

  for (let i = 0; i < opponents.length; i++) {
    start(opponents[i]);
  }
}

work();

Ghi chú

Nhân viên hỗ trợ sẽ giúp bạn đăng bài trò chơi đã hoàn thiện lên nền tảng trò chơi của Yandex. Để đặt các câu hỏi về việc phát triển và kiểm thử, các nhà phát triển khác sẽ trả lời chuyên sâu trong Kênh Discord.

Nếu bạn đang gặp phải vấn đề hoặc có câu hỏi liên quan đến việc sử dụng Yandex Games SDK, vui lòng liên hệ với bộ phận hỗ trợ:

Viết trong mục trò chuyện

Mã định danh phiên.

Tham số tùy chỉnh meta1, meta2, meta3 được thiết lập khi lưu phiên. Chẳng hạn, điểm số trò chơi hoặc cấp độ của người chơi.

Thông tin về đối thủ người chơi:

  • avatar: string — URL của ảnh đại diện người dùng;
  • name: string — tên người chơi.

Mảng sự kiện có thời gian, mô tả phiên chơi trò chơi:

  • id: string — mã định danh sự kiện duy nhất;
  • payload — dữ liệu sự kiện: thông tin phản ánh bản chất, lý do thay đổi trong thế giới trò chơi (ví dụ, tọa độ mới của nhân vật hoặc lần nhấp chuột);
  • time: number — thời gian kể từ khi bắt đầu trò chơi có điều chỉnh thời gian tạm dừng (ms).

Mã định danh sự kiện duy nhất.

Dữ liệu sự kiện: thông tin phản ánh bản chất, lý do thay đổi trong thế giới trò chơi (ví dụ, tọa độ mới của nhân vật hoặc lần nhấp chuột).

Thời gian từ khi bắt đầu trò chơi có điều chỉnh thời gian tạm dừng.