NUGANUGA Web SDK
เกมของคุณทำงานในไอเฟรมแบบแซนด์บ็อกซ์ที่ https://play.nuganuga.com SDK คือช่องทางเดียวที่เชื่อมกับแพลตฟอร์ม คุณไม่ต้องเขียนระบบยืนยันตัวตน อันดับ การแชร์ โฆษณา หรือการวิเคราะห์เอง
1. โหลด SDK
ใช้พาธสัมบูรณ์นี้เสมอ แพลตฟอร์มเป็นผู้ให้บริการและจัดการเวอร์ชัน
<script src="/sdk/nuga-sdk.js"></script>
<script src="./game.js"></script>2. สี่คำสั่ง
const ctx = await Nuga.ready(); // รอแพลตฟอร์ม
await Nuga.game.start(); // เมื่อผู้เล่นเริ่มเล่นจริง
await Nuga.score.submit({ score }); // หนึ่งรอบต่อหนึ่งคะแนนที่เป็นตัวเลข
await Nuga.game.finish(); // แพลตฟอร์มวาดหน้าผลลัพธ์อย่าวาดหน้าผล ปุ่มเล่นซ้ำ ปุ่มแชร์ หรือกระดานอันดับเอง แพลตฟอร์มจะวาดให้หลัง finish() เหมือนกันทุกเกม
3. ส่วนที่เหลือ
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. ไฟล์ประกาศ
nuga.json ที่รากของแพ็กเกจ:
{
"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개의 타겟을 빠르게 클릭하세요." }
}
}ประเภทอันดับ: HIGH_SCORE, LOW_SCORE, LOW_TIME, HIGH_TIME, CUSTOM หมวดหมู่: REACTION, TIMING, ACCURACY, MEMORY, PUZZLE, LUCK, ARCADE
5. กฎของแซนด์บ็อกซ์
การตรวจสอบแบบสถิตจะปฏิเสธแพ็กเกจที่ละเมิดข้อใดข้อหนึ่ง ก่อนถึงมือผู้เล่น:
- ห้ามใช้ URL ภายนอก ไม่ว่าจะเป็น CDN เว็บฟอนต์ หรือรูปจากที่อื่น รวมทุกอย่างไว้ในแพ็กเกจ
- ห้ามใช้
eval,new Function,document.writeหรือdocument.cookie - ห้ามเชื่อมต่อเครือข่ายเอง:
fetchไปยัง URL สัมบูรณ์,XMLHttpRequest,WebSocketและ service worker ถูกบล็อกทั้งจาก CSP และการตรวจสอบ - ห้ามเปลี่ยนหน้าระดับบนสุดและห้ามป็อปอัป
- แพ็กเกจไม่เกิน 5 MB เกมสั้น ๆ ควรอยู่ต่ำกว่า 1 MB
- ต้องเรียก
Nuga.score.submit()อย่างน้อยหนึ่งครั้ง เกมที่ไม่สร้างคะแนนจะขึ้นอันดับไม่ได้ - เชลล์ของแพลตฟอร์มถูกกำหนดตายตัว: index.html สไตล์ชีตของเชลล์ และฮาร์เนสใน game.js ต้องไม่ถูกแก้ไข แก้ได้เฉพาะเนื้อหาของ run() และสไตล์ #field
6. คะแนนถูกตรวจสอบ
ทุกรอบการเล่นจะได้เซสชันฝั่งเซิร์ฟเวอร์ เกมของคุณไม่เคยเห็นโทเค็นเซสชัน เปลือกของแพลตฟอร์มเก็บไว้และส่งแทนคุณ เซิร์ฟเวอร์จะเทียบคะแนนกับเวลาจริงและขอบเขตที่ประกาศไว้ก่อนขึ้นกระดานอันดับ
คุณทำได้ดีกว่านั้น ใช้ค่าสุ่มจากซีดที่เซิร์ฟเวอร์ให้ และบันทึกสิ่งที่เกิดขึ้นจริง เซิร์ฟเวอร์จะคำนวณคะแนนใหม่จากเหตุการณ์ของคุณแทนที่จะเชื่อตัวเลข คะแนนที่บันทึกไม่รองรับจะถูกปฏิเสธทันที
const rng = Nuga.random(); // ซีดจากเซิร์ฟเวอร์ ทำซ้ำได้ ต่างจาก Math.random()
const target = rng.int(0, 8);
Nuga.replay.record('hit', 172); // หนึ่งเหตุการณ์ที่เกี่ยวกับคะแนน สูงสุด 400 ต่อรอบประกาศกลไกใน nuga.json เพื่อเปิดใช้งาน ถ้าไม่ประกาศ เกมก็ยังขึ้นอันดับได้ แต่ตรวจแค่ระยะเวลาและขอบเขตเท่านั้น
"verification": { "kind": "REPLAY_V1", "mechanic": "REACTION",
"params": { "rounds": 5 } }7. ปล่อยเกม
บีบอัดที่รากของแพ็กเกจ (ไม่ใช่โฟลเดอร์) แล้วอัปโหลดในคอนโซลผู้สร้าง การตรวจสอบแบบสถิต การบิลด์ และชุดทดสอบรันไทม์ การตอบสนอง การเล่น และความปลอดภัย จะรันอัตโนมัติ เมื่อผ่านทั้งหมดจึงจะเผยแพร่ได้