Bỏ qua tới nội dung
Các trang tài liệu

Nhà phát triển · Hướng dẫn

Quảng cáo

Interstitial và rewarded — khi nào nên gọi, cooldown, xử lý reason, tạm dừng và tắt tiếng, chỉ cấp thưởng khi người chơi xem hết.

Trên trang này

Game không tự nhúng mạng quảng cáo nào. Bạn chỉ gọi WSG.ads.interstitial() hoặc WSG.ads.rewarded(); portal quyết định có hiện quảng cáo không, hiện gì, và trả kết quả về cho game.

Hai loại quảng cáo

InterstitialRewarded
Là gìQuảng cáo toàn màn hình ở điểm nghỉ tự nhiênQuảng cáo người chơi chủ động chọn xem để nhận thưởng
Người chơi chọn?KhôngCó, bằng một nút rõ ràng
Giới hạn tần suấtPortal ép tối thiểu 60 giây giữa hai lần hiệnKhông có
Kết quả cần đọcKhông cần làm gì thêmChỉ thưởng khi rewarded === true

Hiện portal dùng quảng cáo giả lập: interstitial hiện 3 giây rồi mới có nút Đóng; rewarded chạy 5 giây và tự kết thúc, người chơi bấm Esc để bỏ ngang. Khi portal chuyển sang mạng quảng cáo thật, API giữ nguyên nên game không phải sửa.

Khi nào nên gọi

Nên:

  • Gọi interstitial ở điểm nghỉ: sau màn game over, trước khi chơi lượt mới, khi chuyển màn.
  • Giãn tần suất, ví dụ một interstitial sau mỗi hai lần game over như template Phaser.
  • Nộp điểm trước, rồi mới gọi quảng cáo.
  • Chỉ gọi rewarded khi người chơi bấm nút, và nói rõ họ nhận được gì ("Xem quảng cáo để hồi sinh").

Không nên:

  • Gọi quảng cáo giữa lúc đang chơi, hay ngay khi game vừa tải xong lần đầu.
  • Gọi chồng lên một quảng cáo đang hiện (bạn sẽ nhận not_available).
  • Đếm trên cooldown của portal để quyết định nhịp quảng cáo; cooldown chỉ là ngưỡng tối thiểu.

Interstitial giữa các lượt

JavaScript
let gameOvers = 0;

async function onGameOver(score) {
  WSG.gameplayStop();
  await WSG.leaderboard.submit(score); // nộp điểm trước
  gameOvers += 1;
  if (gameOvers % 2 === 0) {
    await WSG.ads.interstitial({ placement: 'between_rounds' });
    // shown hay không (cooldown, unfilled...) thì cũng chơi tiếp bình thường
  }
  showGameOverButtons();
}

Kết quả của interstitial chỉ để thống kê; game không cần rẽ nhánh theo nó.

Rewarded và cấp thưởng

JavaScript
function canOfferRevive(run) {
  return !run.revived && WSG.isAvailable('ads.rewarded') && !WSG.ads.isBlocked();
}

async function onReviveButton(run) {
  reviveButton.disabled = true;
  const result = await WSG.ads.rewarded({ placement: 'revive' });
  if (result.rewarded !== true) {
    // dismissed, unfilled, lỗi hệ thống... đều không có thưởng
    reviveButton.disabled = false;
    showToast('Chưa xem hết quảng cáo, chưa hồi sinh được');
    return;
  }
  run.revived = true; // một lần mỗi lượt
  WSG.track('revive_used', { score: run.score });
  resumeRun(run);
  WSG.gameplayStart(); // SDK đã gọi gameplayStop() trước quảng cáo
}
  • Chỉ tin rewarded. shown: true không có nghĩa là người chơi đã xem hết: rewarded bị đóng sớm trả { shown: true, rewarded: false, reason: 'dismissed' }.
  • Gọi lại gameplayStart() sau khi hồi sinh, vì SDK đã dừng gameplay khi quảng cáo bắt đầu.
  • Hồi sinh làm mốc tính thời gian chơi của server bị đặt lại; nộp điểm ở lần chết trước khi mời hồi sinh để kỷ lục chắc chắn được ghi. Chi tiết ở Điểm và bảng xếp hạng.

Tạm dừng và âm thanh quanh quảng cáo

Khi bạn gọi quảng cáo, SDK tự lo trình tự:

  1. Nếu gameplay đang chạy: gameplayStop().
  2. Phát pause và audio(false).
  3. Portal hiện quảng cáo phủ lên game.
  4. Quảng cáo đóng: phát audio(true) và resume.
  5. Promise resolve với AdResult.

Game chỉ cần nghe sự kiện, như khi tab bị ẩn:

JavaScript
WSG.on('pause', () => {
  loop.stop();
  sound.suspend();
});
WSG.on('resume', () => {
  loop.start();
  if (!settings.muted) sound.resume();
});
WSG.on('audio', (enabled) => {
  sound.setMasterVolume(enabled && !settings.muted ? 1 : 0);
});

Đừng chỉ dựa vào await của quảng cáo để tạm dừng: game cũng phải dừng khi tab bị ẩn, và portal phát cùng các sự kiện đó.

Xử lý reason

reasonInterstitialRewarded
(không có)Chơi tiếpThưởng nếu rewarded === true
cooldownChơi tiếpKhông xảy ra với rewarded
dismissed—Không thưởng; cho bấm lại nếu muốn
unfilledChơi tiếpKhông thưởng; có thể ẩn nút một lúc
adblockChơi tiếpKhông thưởng; isBlocked() thành true, ẩn nút
not_availableĐang có quảng cáo khác; bỏ quaNhư bên trái
disabled, errorChơi tiếpKhông thưởng

Bảng đầy đủ nằm ở Tham chiếu SDK. Quảng cáo không bao giờ làm Promise reject vì sự cố, trừ khi gọi trước init().

Kiểm thử quảng cáo

  • Standalone: mọi quảng cáo chờ 1 giây rồi trả shown: true (rewarded có thêm rewarded: true), không có cooldown. Dùng để kiểm luồng pause/resume và tắt tiếng.
  • Trong portal: gọi interstitial hai lần liên tiếp sẽ thấy lần hai trả reason: 'cooldown'; bấm Esc trong lúc rewarded chạy sẽ thấy dismissed. Game _conformance làm sẵn cả hai bước này.