ডেভেলপার গাইড

W3 Games-এর জন্য গেম বানান ও প্রকাশ করুন

এই গাইডে আছে একটা HTML5 গেম বানানো থেকে শুরু করে W3 Games-এ আপলোড, রিভিউ ও লাইভ হওয়া পর্যন্ত সবকিছু: কী নিয়ম মানতে হবে, গেম কোন সীমার মধ্যে চলে, স্কোর কীভাবে পাঠাবেন, বিজ্ঞাপন কীভাবে পড়বেন আর কোথায় সবচেয়ে বেশি ভুল হয়। নিচের সংখ্যাগুলো প্ল্যাটফর্মের বর্তমান সীমা থেকে নিজে থেকেই আসে।

১এক নজরে

W3 Games-এ গেম মানে একটা স্ট্যাটিক HTML5 গেম: HTML, JavaScript (বা WebAssembly), CSS, ছবি, শব্দ ইত্যাদি ফাইল, যা ব্রাউজারে চলে। প্ল্যাটফর্ম আপনার ZIP নিরাপদে রাখে, রিভিউয়ের পর একটা আলাদা ফ্রেমে চালায় এবং প্লে গণনা, লিডারবোর্ড, রিভিউ-রেটিং ও বিজ্ঞাপনের ব্যবস্থা নিজেই করে।

অ্যাকাউন্ট খুলুন অ্যাডমিন অনুমোদন গেমের তথ্য ও থাম্বনেইল ZIP আপলোড রিভিউ প্রকাশ
50 MBসর্বোচ্চ ZIP সাইজ
2,000সর্বোচ্চ ফাইল সংখ্যা
100 MBZIP খোলার পর মোট সাইজ
2 MBথাম্বনেইলের সর্বোচ্চ সাইজ

সবচেয়ে দ্রুত শুরু করতে স্টার্টার কিট নামিয়ে নিন। এটা একটা পুরো কাজ-করা গেম, যেখানে স্কোর পাঠানো, নিরাপদ স্টোরেজ ও বিজ্ঞাপন পড়ার কোড তৈরি আছে।

২অ্যাকাউন্ট ও অনুমোদন

  1. ডেভেলপার রেজিস্ট্রেশন ফর্মে নিজের ও স্টুডিওর তথ্য দিন। পাসওয়ার্ড কমপক্ষে ১০ অক্ষর, অক্ষর ও সংখ্যা মিশিয়ে। শর্তে নিশ্চিত করতে হবে যে আপনি যে গেম আপলোড করবেন তার অধিকার আপনার আছে।
  2. আবেদন জমা হলে আপনি লগইন করতে পারবেন, কিন্তু গেম বানানো ও আপলোড বন্ধ থাকবে যতক্ষণ না অ্যাডমিন আপনার প্রোফাইল অনুমোদন করেন।
  3. অনুমোদনের পর "Developer portal" খুলে যাবে: ড্যাশবোর্ড, My games, Create game ও Analytics। আবেদন প্রত্যাখ্যাত হলে কারণসহ আপনার স্ট্যাটাস পেজে দেখাবে।

৩গেমের ফাইল ও ZIP

ZIP-এর কাঠামো

আপনার গেমের সব ফাইল একটা ZIP-এ দিন। প্রবেশ-ফাইল (entry file) হলো যে HTML ফাইলটা গেম খোলে, সাধারণত index.html। এটা ZIP-এর একদম উপরের স্তরে রাখুন; একটা ফোল্ডারের ভেতরে রাখলে আপলোড ফর্মে সেই পথ লিখতে হবে (যেমন build/index.html)।

my-game.zip
 ├─ index.html        ← entry file
 ├─ game.js
 ├─ style.css
 ├─ guide.html        ← ঐচ্ছিক ইউজার গাইড
 └─ assets/
     ├─ sprites.png
     └─ music.mp3

HTML-এর ভেতরে সব ফাইল সম্পর্কিত (relative) পথে লিখুন: assets/sprites.png, ./game.js। /assets/... (স্ল্যাশ দিয়ে শুরু) লিখবেন না, কারণ গেমটা সাইটের একটা উপ-পথ থেকে চলে।

সীমা (বর্তমান মান)

  • ZIP সর্বোচ্চ 50 MB।
  • ZIP-এর ভেতরে সর্বোচ্চ 2,000টি ফাইল।
  • খোলার পর মোট সাইজ সর্বোচ্চ 100 MB।
  • ভার্সন নম্বর 1.0.0 ধরনের হতে হবে (1.2.0-beta.1-ও চলে)। একই গেমে একই ভার্সন দুবার দেওয়া যায় না।
  • প্রবেশ-ফাইলের নামে শুধু ইংরেজি অক্ষর, সংখ্যা, . _ / - চলে এবং শেষে .html বা .htm থাকতে হবে।

যা ZIP-এ থাকলে আপলোড বাতিল হয়

  • সার্ভার-সাইড বা চালানোর মতো ফাইল: .php, .php3, .php4, .php5, .php7, .phtml, .phar, .cgi, .pl, .py, .sh, .exe, .dll, .so, .bat, .cmd।
  • .htaccess, .user.ini, web.config।
  • পথে .. বা পুরো পথ (/etc/.., C:\...), symbolic link, একই নামের দুই ফাইল।
  • সীমার বেশি ফাইল বা সাইজ।

সব ফাইলের ধরন চলে না। প্ল্যাটফর্ম শুধু এই এক্সটেনশনের ফাইল গেম থেকে পাঠায়: .html .htm .js .mjs .css .json .png .jpg .jpeg .webp .gif .svg .ico .mp3 .ogg .wav .mp4 .webm .woff .woff2 .ttf .otf .wasm .txt .xml .md .glb .gltf .bin .hdr। অন্য কিছু চাইলে (যেমন .data, .unityweb, .gz, .br) প্লেয়ার 415 ত্রুটি পাবে। Unity, Godot, Construct ইত্যাদির এক্সপোর্টে compression বন্ধ রাখুন এবং .data ফাইলের নাম .bin করে লোডারে সেই নাম দিন।

ফাইল ব্রাউজারে ৫ মিনিট পর্যন্ত ক্যাশ হতে পারে (HTML ছাড়া)। নতুন ভার্সনে JS, CSS বা ছবি বদলালে ফাইলের নামে ভার্সন রাখুন (game.1.0.1.js) বা লিংকে ?v=1.0.1 দিন, নইলে কিছু প্লেয়ার কয়েক মিনিট পুরোনো ফাইল দেখবে।

৪Sandbox ও নিরাপত্তা

প্লেয়ারের নিরাপত্তার জন্য আপনার গেম পেজের ভেতরের একটা sandboxed iframe-এ চলে (sandbox="allow-scripts allow-pointer-lock") এবং আপনার HTML ফাইলের সাথে একটা কড়া Content-Security-Policy পাঠানো হয়। এর মানে গেমটা এমন একটা "অচেনা উৎস" থেকে চলে যার কাছে সাইটের কোনো তথ্যে প্রবেশাধিকার নেই।

বিষয়চলে?বিস্তারিত
JavaScript, ES modules, WebAssembly, evalহ্যাঁinline script ও style চলে।
Canvas, WebGL, Web Audio, Gamepad, Fullscreen, Pointer Lockহ্যাঁFullscreen বোতাম গেম পেজেই আছে।
নিজের ZIP-এর ফাইল লোড (fetch, ছবি, শব্দ, মডেল)হ্যাঁশুধু একই গেমের ফাইল, সম্পর্কিত পথে।
data: ও blob: ঠিকানাহ্যাঁWeb Worker (blob) সহ।
বাইরের CDN, ওয়েব ফন্ট, বাইরের API, analytics, বিজ্ঞাপন নেটওয়ার্কনাসব লাইব্রেরি ও ফন্ট ZIP-এর ভেতরে দিন। বাইরে সংযোগ ব্লক।
localStorage, sessionStorage, cookie, IndexedDBনাব্যবহার করলে SecurityError আসে। try/catch দিন বা স্টার্টার কিটের storage হেল্পার ব্যবহার করুন; এটা শুধু ওই সেশনের জন্য মেমরিতে রাখে।
alert(), confirm(), prompt()নানিজের গেম-ভেতরের ডায়ালগ বানান।
নতুন ট্যাব/পপআপ (window.open), ফর্ম জমা, পেজ ছেড়ে অন্য সাইটে যাওয়া, ডাউনলোডনাবাইরের লিংকের দরকার হলে বিজ্ঞাপনের "লিংক" ফিল্ড ব্যবহার করুন (প্ল্যাটফর্ম সেটা নিয়ন্ত্রণ করে)।
ক্যামেরা, মাইক্রোফোন, লোকেশননাঅনুমতি দেওয়া হয় না।
বহু-থ্রেড WebAssembly (SharedArrayBuffer)নাcross-origin isolation নেই। single-thread বিল্ড বানান।

ফাইলের সাথে যে হেডার যায়

Content-Security-Policy (শুধু HTML ফাইলে):
  default-src 'self' data: blob:;
  script-src 'self' 'unsafe-inline' 'unsafe-eval' blob:;
  style-src 'self' 'unsafe-inline';
  img-src 'self' data: blob:;  media-src 'self' data: blob:;
  font-src 'self' data:;       connect-src 'self' data: blob:;
  object-src 'none'; base-uri 'none'; form-action 'none';
  sandbox allow-scripts allow-pointer-lock

এই নিয়মগুলো সব গেমের জন্য সমান। এগুলো না মানলে আপনার গেম W3 Games-এ চলবে না, তাই লোকালি টেস্ট করার সময় একই sandbox ব্যবহার করুন।

৫স্কোর ও লিডারবোর্ড

গেম নিজে সার্ভারে কিছু পাঠায় না। গেম পেজকে postMessage দিয়ে স্কোর জানায়; পেজ সেটা প্ল্যাটফর্মের API-তে জমা দেয়। আপনাকে শুধু একটা বার্তা পাঠাতে হবে, যখন একটা রান শেষ হয়:

window.parent.postMessage(
    { type: 'W3_GAME_SCORE', score: 1250, mode: 'classic' },
    '*'
);
ফিল্ডনিয়ম
typeঅবশ্যই 'W3_GAME_SCORE'।
scoreপূর্ণসংখ্যা, ০ বা তার বেশি। দশমিক সংখ্যা বা ঋণাত্মক হলে বার্তা বাতিল। সর্বোচ্চ ৯,০০০,০০০,০০০,০০০।
modeঐচ্ছিক ছোট লেবেল (সর্বোচ্চ ৪০ অক্ষর), যেমন easy, level-3।

স্কোর কীভাবে লিডারবোর্ডে যায়

  1. স্কোর জমা হলে সেটা "পেন্ডিং" থাকে। ক্লায়েন্টের পাঠানো সংখ্যা কখনো সরাসরি বিশ্বাস করা হয় না।
  2. অ্যাডমিন যাচাই করে "verified" করলে তবেই গেম পেজের লিডারবোর্ডে আসে।
  3. লিডারবোর্ড বড় স্কোর আগে সাজায়। প্রতি প্লেয়ারের (লগইন না থাকলে প্রতি সেশনের) শুধু সেরা স্কোর দেখায়।

ভালো স্কোর ডিজাইনের টিপস

  • বড় = ভালো হতে হবে। সময়-ভিত্তিক গেমে (কম সময় ভালো) স্কোর বানান এভাবে: Math.max(0, 600000 - timeInMs)।
  • রান শেষে একবার পাঠান, প্রতি সেকেন্ডে নয়। প্ল্যাটফর্ম প্রতি আইপি থেকে মিনিটে প্রায় ১০টা স্কোর নেয়, বেশি পাঠালে বাকিগুলো বাদ যায়।
  • স্কোর শুধু তখনই নেওয়া হয় যখন প্লেয়ারের সেশন সচল (গেম পেজ প্রতি 30 সেকেন্ডে নিজে নিজে সংকেত পাঠায়, আপনাকে কিছু করতে হয় না)।
  • সহজে ঠকানো যায় এমন স্কোর (যেমন শুধু ক্লিক গণনা) রাখলে অ্যাডমিন বেশি স্কোর বাতিল করবেন। যতটা পারেন গেমের ভেতরের যুক্তি দিয়ে স্কোর হিসাব করুন।
  • গেম আলাদা করে খুললে (লোকাল টেস্টে) window.parent === window হয়। তখন বার্তা পাঠানো বন্ধ রাখুন, স্টার্টার কিটের submitScore() সেটা নিজে সামলায়।

৬প্লে ট্র্যাকিং ও অ্যানালিটিক্স

এর জন্য আপনার গেমে কোনো কোড লাগে না। প্ল্যাটফর্ম নিজে গণনা করে:

  • গেম পেজ খুললে একটা প্লে গোনা হয়।
  • পেজ বন্ধ বা ছাড়লে সেশন সম্পন্ন হয় এবং খেলার সময় যোগ হয়।
  • স্কোর জমার সংখ্যাও দৈনিক হিসাবে থাকে।

"Developer portal" → Analytics ও আপনার গেমের পেজে মোট প্লে, গত ৩০ দিনের দৈনিক হিসাব, গড় রেটিং ও রিভিউ সংখ্যা দেখতে পাবেন। প্লেয়াররা গেম পেজে ১–৫ স্টার ও মন্তব্য দেয়; অ্যাডমিন অনুমোদন করলে তা প্রকাশ হয়।

৭ইন-গেম বিজ্ঞাপন

গেমের ভেতরে যে বিজ্ঞাপন দেখান (রাস্তার পাশের বিলবোর্ড, গাড়ির গায়ের ব্যানার, লোডিং স্ক্রিনের স্পনসর ইত্যাদি) তা কোডে বসাবেন না। "Developer portal" → আপনার গেম → In-game ads থেকে বিজ্ঞাপন যোগ, বদল, বন্ধ বা মুছতে পারবেন; অ্যাডমিনও পারেন। নতুন ভার্সন আপলোড না করেই গেম পরেরবার লোড হলে বদল দেখাবে।

আপনার গেম বিজ্ঞাপনের তালিকা এই সম্পর্কিত ঠিকানা থেকে পড়ে:

const response = await fetch('w3/sponsors.json', { cache: 'no-store' });
const data = await response.json();
// data.sponsors : চালু বিলবোর্ডের তালিকা (ক্রম অনুযায়ী)
// data.truck    : একটা বিশেষ ব্যানার (বা null)
{
  "sponsors": [
    { "name": "Fresh Tyres", "tagline": "Grip in the rain",
      "background": "#112233", "color": "#ffffff",
      "logo": "https://.../games/my-game/content/w3/sponsor-logo/12",
      "link": "https://example.com" }
  ],
  "truck": null
}
  • তালিকা খালি থাকলে কোনো বিজ্ঞাপন দেখাবেন না; আর fetch ব্যর্থ হলে (লোকাল টেস্টে) কোনো সমস্যা ছাড়াই চালিয়ে যান।
  • লোগো ছবি লোড করার সময় আগে image.crossOrigin = 'anonymous' দিন, তারপর image.src। নইলে ছবি canvas বা WebGL টেক্সচারে বসাতে গেলে sandbox-এ ত্রুটি হয়।
  • প্রতিটি বিজ্ঞাপনে নাম (৮০ অক্ষর), ট্যাগলাইন (১২০ অক্ষর), বোর্ডের ও লেখার রং, লোগো (PNG, JPG, WebP; সর্বোচ্চ 2 MB), লিংক ও ক্রম থাকে।

৮ইউজার গাইড

প্লেয়ারদের জন্য গেমের একটা গাইড থাকলে গেম পেজে "User guide" বাটন আসে। দুইভাবে দিতে পারেন (দুটোই একসাথেও চলে):

  1. লেখা: গেমের ফর্মে "How to play / user guide" ঘরে লিখুন (সর্বোচ্চ ৮,০০০ অক্ষর)। ফাঁকা লাইন দিয়ে অনুচ্ছেদ ভাগ করুন, আর # শিরোনাম লিখলে সেটা উপশিরোনাম হয়। যেকোনো সময় এডিট করে বদলানো যায়।
  2. guide.html ফাইল: ZIP-এ প্রবেশ-ফাইলের পাশে একটা guide.html রাখলে সেটা গাইড পেজে দেখানো হয় (চাইলে নিজের ডিজাইনে)। এটা বদলাতে নতুন ভার্সন আপলোড করতে হয়। পেজটা ?embed=1 সহ একটা ফ্রেমে খোলে, তাই চাইলে সেই অবস্থায় নিজের শিরোনাম লুকাতে পারেন।

গাইডে লিখুন: গেমের লক্ষ্য, নিয়ন্ত্রণ (কিবোর্ড ও ফোন), স্কোর কীভাবে হয়, কিছু টিপস। স্টার্টার কিটে একটা নমুনা guide.html আছে।

৯গেমের তথ্য (Create game ফর্ম)

ফিল্ডনিয়ম ও পরামর্শ
Game title *সর্বোচ্চ ১৮০ অক্ষর। গেমের ওয়েব ঠিকানা (slug) এই নাম থেকে বানানো হয় এবং পরে বদলায় না; ঠিকানা সুন্দর রাখতে ইংরেজি অক্ষর রাখুন।
Short description *সর্বোচ্চ ৩০০ অক্ষর। গেম কার্ড ও সার্চে দেখায়, তাই এক-দুই বাক্যে আকর্ষণীয় করে লিখুন।
Full description *সর্বোচ্চ ১২,০০০ অক্ষর। গেম কী, কীভাবে খেলতে হয়, ক্রেডিট ও লাইসেন্স (ব্যবহৃত ছবি/মডেল/শব্দ) এখানে লিখুন।
How to playঐচ্ছিক (আগের অংশ দেখুন)।
Orientation *Landscape, Portrait বা Any, গেম সবচেয়ে ভালো যেভাবে চলে।
Age rating *Everyone, 10+, 13+, 16+, 18+। আপনার গেমের বিষয়বস্তু অনুযায়ী ঠিক বাছুন; ভুল রেটিং রিভিউয়ে প্রত্যাখ্যানের কারণ হতে পারে।
Categories * (১–৩টি)বর্তমান ক্যাটাগরি: Action, Adventure, Arcade, Puzzle, Racing, Sports, Strategy, Kids, Simulation।
Controlsসর্বোচ্চ ৩টা লাইন, যেমন "Keyboard: Arrow keys", "Touch: Tap to jump"। গেম পেজের ডান পাশে দেখায়।
Thumbnail *JPG, PNG বা WebP, সর্বোচ্চ 2 MB। গেম কার্ডে ১৬:১০ অনুপাতে কাটা হয়, তাই ১২৮০×৮০০ বা তার বেশি ছবি দিন। গেমের আসল স্ক্রিনশট সবচেয়ে ভালো কাজ করে।
Reference / Game IDঐচ্ছিক, শুধু আপনার নিজের হিসাবের জন্য।

১০ভার্সন ও রিভিউ প্রক্রিয়া

Draft ZIP আপলোড → Pending review অ্যাডমিন: Approve অ্যাডমিন: Publish → Live
  • গেম প্রথমে Draft থাকে। প্রথম ZIP আপলোড করলে সেটা রিভিউয়ের লাইনে যায়।
  • অ্যাডমিন ভার্সনটা অনুমোদন বা প্রত্যাখ্যান করেন। প্রত্যাখ্যান করলে কারণ ও মন্তব্য আপনার গেমের পেজে "Review note" হিসেবে দেখায়। ঠিক করে নতুন ভার্সন নম্বরে আবার আপলোড দিন।
  • অনুমোদিত ভার্সন অ্যাডমিন প্রকাশ করলে গেম লাইভ হয়। পরের ভার্সন প্রকাশ হলে আগেরটা আর চালু থাকে না, কিন্তু রেকর্ডে থাকে।
  • অনুমোদিত বা প্রকাশিত ভার্সন মোছা যায় না; অনুমোদনের অপেক্ষায় থাকা বা প্রত্যাখ্যাত ভার্সন মোছা যায়।
  • লাইভ গেমের তথ্য বদলালে (নাম, বিবরণ, ছবি, ক্যাটাগরি ইত্যাদি) নতুন তথ্য অ্যাডমিনের অনুমোদনের অপেক্ষায় থাকে; ততক্ষণ পাবলিক পেজে আগেরটাই দেখায়। ড্রাফট গেমের তথ্য সাথে সাথে বদলায়।
  • লাইভ গেম আপনি মুছতে পারবেন না; সরাতে অ্যাডমিনকে বলতে হবে। অ্যাডমিন নীতি লঙ্ঘনের কারণে গেম সাসপেন্ডও করতে পারেন, তখন কারণ আপনার পেজে দেখায়।

রিভিউ-এ যা দেখা হয়

  • গেমটা sandbox-এ ঠিকভাবে চলে কি না (লোড হয়, ক্র্যাশ নেই, বাইরের সংযোগ নেই)।
  • বিষয়বস্তু আপনার দেওয়া বয়সসীমার সাথে মেলে কি না; আপত্তিকর, বিপজ্জনক বা বিভ্রান্তিকর কিছু নেই।
  • ছবি, শব্দ, মডেল, ফন্টের জন্য আপনার অনুমতি বা উপযুক্ত লাইসেন্স আছে এবং ক্রেডিট দেওয়া হয়েছে।
  • তথ্য ও থাম্বনেইল গেমটাকে ঠিকভাবে বোঝায়।

১১ডিজাইন ও পারফরম্যান্স

  • সব ডিভাইসে চলবে: প্লেয়ারদের বড় অংশ ফোনে খেলে। <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> দিন, স্ক্রিনের মাপ বদলালে (resize) গেম মানিয়ে নিক, আর কিবোর্ড ও টাচ দুটোই রাখুন। শুধু কিবোর্ডে চলা গেম ফোনে অকেজো।
  • তীক্ষ্ণ ক্যানভাস: devicePixelRatio ধরে ক্যানভাসের আসল পিক্সেল সাইজ সেট করুন (স্টার্টার কিটে আছে)।
  • শব্দ: ব্রাউজার ব্যবহারকারীর প্রথম ক্লিক/ট্যাপের আগে শব্দ চালায় না। "Start" বোতামে শব্দ চালু করুন। মিউট বোতাম রাখুন।
  • লোডিং: বড় গেমে প্রগ্রেস বার দেখান। ছবি স্প্রাইট-শিটে, শব্দ মোবাইল-বান্ধব সাইজে, মডেল ও টেক্সচার ছোট করে দিন। সব ফাইল মিলে যত ছোট, প্লেয়ার তত দ্রুত খেলা শুরু করে।
  • ফোকাস: গেম শুরুর আগে প্লেয়ারকে একবার ক্লিক করতে দিন (Start বোতাম), যাতে কিবোর্ড ইনপুট গেমে আসে। পেজ স্ক্রল ঠেকাতে event.preventDefault() ব্যবহার করুন (Space, তীর চিহ্ন)।
  • বিরতি: ট্যাব আড়ালে গেলে (visibilitychange) গেম থামান বা requestAnimationFrame-এর সময়-ব্যবধান সীমিত করুন।
  • মেমরি: কম-দামি ফোনে চলার জন্য টেক্সচার ও অডিও বাফার মোট কয়েক শ MB-এর নিচে রাখুন; প্রয়োজন শেষে মুছুন।
  • ভাষা: ইংরেজি ও বাংলা দুটোই জানা প্লেয়ার আছে। বাংলা লিখলে ZIP-এর ভেতরে ফন্ট (যেমন Noto Sans Bengali, .woff2) দিন, কারণ বাইরের ফন্ট ব্লক।

১২লোকালি টেস্ট

আপলোডের আগে নিজের কম্পিউটারে W3 Games-এর মতো পরিবেশে চালিয়ে দেখুন:

  1. গেমের ফোল্ডারে একটা ছোট সার্ভার চালু করুন (file:// থেকে খুললে মডিউল চলে না): npx http-server . --cors -c-1। --cors জরুরি: sandbox ফ্রেমের নিজের কোনো origin থাকে না, তাই ব্রাউজার সার্ভারের কাছে (CORS হেডারে) অনুমতি চায়। W3 Games প্রতিটি গেম-ফাইলে সেই হেডার দেয়; লোকাল সার্ভারকেও দিতে হবে। (সাধারণ python -m http.server এই হেডার দেয় না।)
  2. একই ফোল্ডারে test.html বানান, যা আপনার গেমকে W3 Games-এর মতো sandbox ফ্রেমে খোলে:
<iframe src="index.html" sandbox="allow-scripts allow-pointer-lock"
        allow="fullscreen; gamepad" style="width:100%;height:90vh;border:0"></iframe>
<script>
  window.addEventListener('message', e => console.log('score message:', e.data));
</script>
  1. /test.html খুলে একটা রান খেলুন। কনসোলে { type: "W3_GAME_SCORE", score: ..., mode: ... } দেখলে স্কোর পাঠানো ঠিক আছে।
  2. কনসোলে SecurityError (স্টোরেজ), ব্লক হওয়া সংযোগ বা CSP ত্রুটি থাকলে W3 Games-এও একই সমস্যা হবে, আগে ঠিক করুন।

আপলোডের আগের চেকলিস্ট

  • ☐ index.html ZIP-এর উপরের স্তরে আছে।
  • ☐ সব পথ সম্পর্কিত; বাইরের কোনো URL (CDN, ফন্ট, API) নেই।
  • ☐ কোনো .php বা নিষিদ্ধ ফাইল নেই; ফাইল সংখ্যা ও সাইজ সীমার মধ্যে।
  • ☐ কোনো alert(), localStorage (try/catch ছাড়া), window.open নেই।
  • ☐ কিবোর্ড ও টাচ দুটোয় চলে; ফোনের আকারে ঠিকঠাক দেখায়।
  • ☐ রান শেষে একবার W3_GAME_SCORE যায়; স্কোর পূর্ণসংখ্যা, বড় = ভালো।
  • ☐ থাম্বনেইল ও বিবরণ তৈরি; বয়সসীমা ও ক্যাটাগরি ঠিক; ক্রেডিট লেখা আছে।

১৩সাধারণ ভুল ও সমাধান

লক্ষণকারণ ও সমাধান
আপলোডে "Entry file 'index.html' was not found"ফাইলটা ZIP-এর ভেতরের কোনো ফোল্ডারে আছে। ফোল্ডারটা নয়, ফোল্ডারের ভেতরের ফাইলগুলো সিলেক্ট করে ZIP করুন, বা ফর্মে সঠিক পথ লিখুন।
"Executable/server-side files are not allowed"ZIP-এ .php বা নিষিদ্ধ ফাইল আছে। সার্ভার-কোড বাদ দিয়ে লজিক JavaScript-এ আনুন।
"This version number already exists"প্রতিবার নতুন ভার্সন নম্বর দিন (1.0.1, 1.1.0)।
গেম পেজে সাদা/কালো পর্দাপ্রায়ই ভুল পথ (/game.js না লিখে game.js লিখুন) বা বাইরের লাইব্রেরি (CDN) লোড হচ্ছে না। কনসোল দেখুন।
ছবি, ফন্ট বা মডেল লোড হয় না (415 বা 404)ফাইলের এক্সপোর্ট এক্সটেনশন সমর্থিত তালিকায় নেই, বা নামের বড়/ছোট হাতের অক্ষর মেলেনি (সার্ভার case-sensitive হতে পারে)।
SecurityError / "The operation is insecure"localStorage বা cookie ব্যবহার করছেন। try/catch দিন বা মেমরিতে রাখুন।
লোগো ছবি টেক্সচারে বসে নাimage.crossOrigin = 'anonymous' দেননি।
লোকাল sandbox টেস্টে "blocked by CORS policy"আপনার লোকাল সার্ভার CORS হেডার দিচ্ছে না। npx http-server . --cors ব্যবহার করুন। W3 Games-এ এটা প্ল্যাটফর্ম নিজেই দেয়, তাই এটা শুধু লোকাল টেস্টের সমস্যা।
স্কোর লিডারবোর্ডে আসে না(১) স্কোর পূর্ণসংখ্যা নয়; (২) বার্তার type ভুল; (৩) খুব দ্রুত অনেকবার পাঠিয়েছেন; (৪) এখনো অ্যাডমিনের যাচাই বাকি; (৫) গেম আলাদা খোলা, W3 Games পেজের ভেতরে নয়।
নতুন ভার্সনেও পুরোনো চেহারাব্রাউজার ক্যাশ। ফাইলের নামে ভার্সন দিন বা ?v= যোগ করুন; প্লেয়ারকে হার্ড রিফ্রেশ (Ctrl+F5) করতে বলুন।
Unity/Godot বিল্ড চলে নাcompression (.gz/.br) বন্ধ করুন, .data ফাইলের নাম .bin করুন, বহু-থ্রেড বিল্ড বাদ দিন।

১৪স্টার্টার কিট

স্টার্টার কিট একটা ছোট কিন্তু পূর্ণ গেম ("Tap Target") যা উপরের সব নিয়ম মেনে বানানো। এতে আছে:

  • index.html, game.js, style.css: মাউস, টাচ ও কিবোর্ডে চলা গেম, স্পষ্ট ক্যানভাস, Start/Play again স্ক্রিন।
  • w3.js: তিনটা ছোট হেল্পার: submitScore(score, mode), loadSponsors(), storage (নিরাপদ স্টোরেজ)। এটা নিজের গেমে কপি করে নিন।
  • guide.html: নমুনা ইউজার গাইড।
  • README.txt: লোকাল টেস্ট ও আপলোডের ধাপ।

w3games-starter-game.zip নামান

প্রস্তুত? ডেভেলপার হিসেবে আবেদন করুন বা, আগেই অনুমোদিত হয়ে থাকলে, নতুন গেম তৈরি করুন।