Preparing Your HTML5 Game
Plain HTML5 games are the simplest to prepare for our platform. They use standard HTML, CSS, and JavaScript without any specific framework.
Create Your Project Structure
Set up a basic project structure:
my-game/
├── index.html # Main entry point
├── styles.css # CSS styles
├── main.js # Main JavaScript file
├── game.js # Game logic
└── assets/ # Game assets (images, sounds, etc.)
├── images/
├── audio/
└── ...Note: The most important file is index.html, which must be in the root directory.
Create Your HTML File
Your index.html file should include all necessary references to your CSS and JavaScript files:
My HTML5 Game
Organize Your JavaScript
For better maintainability, organize your JavaScript code into separate files:
main.js - Initialization and setup
// Initialize game when the window loads
window.addEventListener('load', function() {
// Initialize your game here
initGame();
});
function initGame() {
const canvas = document.getElementById('game-canvas');
const ctx = canvas.getContext('2d');
// Start the game
const game = new Game(canvas, ctx);
game.start();
}game.js - Game logic and mechanics
class Game {
constructor(canvas, ctx) {
this.canvas = canvas;
this.ctx = ctx;
this.isRunning = false;
// Initialize game properties
}
start() {
this.isRunning = true;
this.gameLoop();
}
gameLoop() {
if (!this.isRunning) return;
// Clear canvas
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
// Update game state
this.update();
// Render game
this.render();
// Request next frame
requestAnimationFrame(this.gameLoop.bind(this));
}
update() {
// Update game logic here
}
render() {
// Render game objects here
}
}Handle Assets Properly
Make sure all your assets use relative paths:
// Loading an image
const playerImage = new Image();
playerImage.src = 'assets/images/player.png';
// Loading audio
const backgroundMusic = new Audio('assets/audio/background.mp3');Important: Always use relative paths (not absolute paths) for all assets to ensure they work correctly when deployed.
Test Your Game Locally
Before uploading, test your game locally using a simple web server:
# Using Node.js http-server npx http-server # Using Python python -m http.server # Using PHP php -S localhost:8000
Check that all game features, assets, and interactions work as expected.
Zip Your Game
Compress your entire game folder into a ZIP file:
# On macOS/Linux zip -r my-game.zip index.html styles.css *.js assets/ # On Windows # Right-click the folder > Send to > Compressed (zipped) folder
Note: Make sure your index.html file is at the root of the ZIP file.
Common Issues and Solutions
Missing Assets
If your game assets (images, sounds, etc.) aren't loading:
- Check that the paths to your assets are correct
- Ensure you're using relative paths (e.g., 'assets/images/player.png')
- Verify that all asset files are included in the ZIP file
Cross-Browser Compatibility
To ensure your game works across different browsers:
- Test your game in multiple browsers (Chrome, Firefox, Safari, Edge)
- Use feature detection instead of browser detection
- Consider using polyfills for newer JavaScript features
- Use vendor prefixes for CSS properties that need them
Mobile Compatibility
To make your game work well on mobile devices:
- Use responsive design principles
- Implement touch controls for mobile users
- Test on various screen sizes and orientations
- Consider using the viewport meta tag to control scaling
Performance Optimization
To improve your game's performance:
- Minimize the use of DOM manipulation
- Use requestAnimationFrame for animation loops
- Optimize asset sizes (compress images, use sprite sheets)
- Consider using a canvas for rendering instead of DOM elements
Implementing Game Session Tracking
All games uploaded to our platform must implement session tracking functionality. This allows us to track player sessions and maintain leaderboards for your game.
Important: Your game bundle must include API calls to our session tracking endpoints. Our validation system will check for these calls during the upload process. Games without proper session tracking implementation will be rejected.
Option 1: Use Our SDK (Recommended)
The easiest way to implement session tracking is to use our JavaScript SDK. You can download the SDK here or view an example implementation.
Include the following script in your game:
<script src="/sdk/game-session-tracker.js"></script>
Then initialize and use the tracker in your game:
// Initialize the tracker - it will automatically detect the subdomain
const tracker = new GameSessionTracker();
// When the game ends, call endSession with the player's score
function gameOver(score) {
tracker.endSession(score)
.then(response => {
console.log("Session recorded successfully", response);
})
.catch(error => {
console.error("Failed to record session", error);
});
}
// To display a leaderboard
function showLeaderboard() {
tracker.getLeaderboard(10) // Get top 10 scores
.then(response => {
const leaderboard = response.data.leaderboard;
// Display leaderboard in your game
})
.catch(error => {
console.error("Failed to fetch leaderboard", error);
});
}Option 2: Custom Implementation
If you prefer to implement session tracking yourself, follow these steps:
1. Parse URL parameters when your game loads:
const urlParams = new URLSearchParams(window.location.search);
const token = urlParams.get('token') || generateRandomToken();
const appVersion = urlParams.get('appVersion') || '1.0.0';
const language = urlParams.get('language') || 'en';
const sessionStartTime = new Date();2. When the game ends, send session data to our API:
function endSession(score) {
const sessionEndTime = new Date();
const sessionData = {
token: token,
session_start_time: sessionStartTime.toISOString(),
session_end_time: sessionEndTime.toISOString(),
score: score,
app_version: appVersion,
language: language
};
// Get the subdomain from the current hostname
const hostname = window.location.hostname;
const parts = hostname.split('.');
const subdomain = parts.length > 2 ? parts[0] : '';
// REQUIRED: This exact endpoint must be called when a game session ends
fetch(`/api/v1/games/${subdomain}/session-ended`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(sessionData)
})
.then(response => response.json())
.then(data => {
console.log("Session recorded successfully", data);
})
.catch(error => {
console.error("Failed to record session", error);
});
}Testing Your Implementation
Before uploading, test your session tracking implementation:
- Use our example implementation at
/sdk/example-implementation.htmlas a reference - Add URL parameters to your local development URL (e.g.,
http://localhost:8000/index.html?token=test123&appVersion=1.0.0&language=en) - Use browser developer tools to verify network requests are being made correctly
In browser developer tools, check that the POST request to /api/v1/games/:subdomain/session-ended is being made with all required parameters.
Uploading to Jiran Games
Log in to Your Account
Sign in to your Jiran Games developer account.
Create a New Game
Click on "Add New Game" and fill in the required information:
- Game Name
- Description
- Game Logo (recommended size: 512x512px)
- Tags (to help users find your game)
- Subdomain (this will be your game's URL: yourgame.jiran.games)
Upload Your Game Bundle
Select the ZIP file containing your HTML5 game and upload it.
Note: Our system will validate that your ZIP file contains at least an index.html file and some JavaScript files.
Submit for Review
After uploading, your game will be marked as "pending_review". Our team will review it to ensure it meets our guidelines.
The review process typically takes 1-2 business days.