SDK Web NUGANUGA
Trò chơi của bạn chạy trong iframe cách ly tại https://play.nuganuga.com. SDK là kênh duy nhất tới nền tảng — bạn không bao giờ phải tự làm xác thực, xếp hạng, chia sẻ, quảng cáo hay phân tích.
1. Nạp SDK
Luôn dùng đúng đường dẫn tuyệt đối này. Nền tảng lo việc phân phối và phiên bản.
<script src="/sdk/nuga-sdk.js"></script>
<script src="./game.js"></script>2. Bốn lệnh gọi
const ctx = await Nuga.ready(); // chờ nền tảng
await Nuga.game.start(); // khi người chơi thực sự bắt đầu một lượt
await Nuga.score.submit({ score }); // đúng một điểm số dạng số cho mỗi lượt
await Nuga.game.finish(); // nền tảng vẽ màn hình kết quảĐừng tự vẽ màn hình kết quả, nút chơi lại, nút chia sẻ hay bảng xếp hạng — nền tảng vẽ chúng sau finish(), giống hệt nhau cho mọi trò chơi.
3. Mọi thứ khác
Nuga.game.getContext();
Nuga.player.get();
Nuga.challenge.get();
Nuga.storage.get(key);
Nuga.storage.set(key, value);
Nuga.audio.setMuted(true);
Nuga.locale.get(); // 'en' | 'ko' | ...
Nuga.event.track('level_up', { level: 3 });
Nuga.on('pause', () => pauseLoop());4. Tệp kê khai
nuga.json ở thư mục gốc của gói:
{
"schemaVersion": 1,
"name": "Reaction Hunter",
"slug": "reaction-hunter",
"description": "Click 10 targets as fast as possible.",
"rule": "Tap every target as fast as you can.",
"category": "REACTION",
"orientation": "PORTRAIT",
"duration": { "min": 5, "max": 30 },
"input": ["POINTER", "TOUCH"],
"ranking": { "type": "LOW_TIME", "unit": "ms" },
"entry": "index.html",
"locales": {
"ko": { "name": "리액션 헌터", "description": "10개의 타겟을 빠르게 클릭하세요." }
}
}Kiểu xếp hạng: HIGH_SCORE, LOW_SCORE, LOW_TIME, HIGH_TIME, CUSTOM. Thể loại: REACTION, TIMING, ACCURACY, MEMORY, PUZZLE, LUCK, ARCADE.
5. Quy tắc vùng cách ly
Kiểm tra tĩnh sẽ từ chối gói vi phạm bất kỳ điều nào dưới đây, trước khi nó tới tay người chơi:
- Không URL bên ngoài — không CDN, không phông chữ web, không ảnh từ xa. Hãy đóng gói tất cả.
- Không dùng
eval,new Function,document.writehaydocument.cookie. - Không tự kết nối mạng:
fetchtới URL tuyệt đối,XMLHttpRequest,WebSocketvà service worker đều bị CSP lẫn kiểm tra tĩnh chặn. - Không điều hướng cấp cao nhất và không cửa sổ bật lên.
- Gói dưới 5 MB; trò chơi siêu nhỏ nên dưới 1 MB.
- Ít nhất một lệnh gọi
Nuga.score.submit()— trò chơi không tạo ra điểm thì không thể lên bảng xếp hạng. - Vỏ nền tảng là cố định: index.html, bảng kiểu của vỏ và khung trong game.js phải giữ nguyên. Chỉ thân run() và kiểu #field là của bạn.
6. Điểm số được xác minh
Mỗi lượt chơi được cấp một phiên phía máy chủ. Trò chơi của bạn không bao giờ thấy mã phiên — lớp vỏ nền tảng giữ nó và gửi thay bạn — và máy chủ đối chiếu điểm với thời lượng thực tế cùng giới hạn khai báo trong tệp kê khai trước khi đưa lên bảng xếp hạng.
Bạn có thể làm tốt hơn. Lấy tính ngẫu nhiên từ hạt giống do máy chủ cấp và ghi lại những gì thực sự đã xảy ra: máy chủ sẽ tính lại lượt chơi từ các sự kiện của bạn thay vì tin vào con số. Điểm mà bản ghi không chứng minh được sẽ bị từ chối thẳng.
const rng = Nuga.random(); // gieo hạt từ máy chủ — tái lập được, khác với Math.random()
const target = rng.int(0, 8);
Nuga.replay.record('hit', 172); // một kết quả liên quan tới điểm, tối đa 400 mỗi lượtKhai báo cơ chế trong nuga.json để bật tính năng này. Không khai báo thì trò chơi vẫn lên bảng xếp hạng, chỉ với kiểm tra thời lượng và giới hạn.
"verification": { "kind": "REPLAY_V1", "mechanic": "REACTION",
"params": { "rounds": 5 } }7. Phát hành
Nén thư mục gốc của gói (không phải thư mục bao ngoài) rồi tải lên trong bảng điều khiển nhà sáng tạo. Kiểm tra tĩnh, dựng, cùng các bộ kiểm thử runtime, đáp ứng, lối chơi và bảo mật đều chạy tự động; nút xuất bản mở khi tất cả đều đạt.