Components general

GameCanvas

An interactive HTML5 Canvas component that provides a sandboxed JavaScript environment for building games and interactive visualizations. It includes a game loop, keyboard input handling, score tracking, and high‑score persistence, making it suitable for classic arcade titles, puzzles, educational games, and other interactive experiences.

Mis à jour Feb 19, 2026

GameCanvas

An interactive HTML5 Canvas component that provides a sandboxed JavaScript environment for building games and interactive visualizations. It includes a game loop, keyboard input handling, score tracking, and high‑score persistence, making it suitable for classic arcade titles, puzzles, educational games, and other interactive experiences.

Use Cases

  • Classic arcade games (Snake, Pong, Breakout, Tetris)
  • Puzzle games (Memory match, sliding puzzles, pattern games)
  • Reaction and reflex games (Whack-a-mole, speed tests)
  • Educational games (Math challenges, typing practice)
  • Simple platformers and maze games
  • Interactive data visualizations
  • Drawing/painting applications
  • Physics simulations
  • Particle effects and animations
  • Mini-games for engagement on landing pages

Properties

title

Game title displayed above the canvas. Creates a header for the game. Type: string.

Tip: Keep to 2‑3 words maximum. Name should indicate the game type.

width

Canvas width in pixels. Determines the playable area width. Type: number. Default: 400.

Tip: 400x400 works great for Snake, Tetris, puzzle games; 600x400 for Pong, Breakout, side‑scrollers; keep under 400 for best mobile experience.

height

Canvas height in pixels. Determines the playable area height. Type: number. Default: 400.

Tip: 400x400 for most classic games; 300x500 for Tetris‑style games; often best to keep height equal to or less than width.

gameCode

JavaScript code that implements the game logic. Runs in a SANDBOXED environment — NO document, window, setInterval, setTimeout, fetch, or DOM APIs are available. You MUST use the provided game API (onInit, onFrame, ctx, canvas, state, keys, etc.). Type: string. Required.

backgroundColor

Canvas background color. Sets the base color of the game area. Type: string. Default: #0f0f23.

Tip: Use dark colors (#0f0f23, #1a1a2e) for arcade/retro feel; use light colors (#f8f9fa, #ffffff) for casual games; match the app’s backgroundColor for cohesive design.

borderColor

Canvas border color. Creates a frame around the game area. Type: string. Default: #4ecca3.

Tip: Use app’s accentColor or primaryColor; ensure good contrast with backgroundColor.

borderRadius

Canvas border radius for rounded corners. Type: string. Default: 8px.

Tip: Use 0px for sharp retro arcade feel; use 8px‑16px for modern rounded look.

titleColor

Color of the game title text. Type: string. Default: #4ecca3.

textColor

Color of score display and control hints text. Type: string. Default: #eeeeee.

accentColor

Accent color for score values, buttons, and highlights. Type: string. Default: #4ecca3.

showScore

Whether to display current score above the canvas. Type: boolean. Default: true.

showHighScore

Whether to display high score (persisted to localStorage). Type: boolean. Default: true.

scoreLabel

Label text for the score display. Type: string. Default: Score.

highScoreKey

localStorage key for high score. Auto‑generated from title if not specified. Type: string.

Tip: Usually leave blank — will auto‑generate from title; set custom key to share scores across pages.

showControls

Whether to show keyboard control hints below the canvas. Type: boolean. Default: true.

controlsText

Text describing how to control the game. Type: string. Default: Arrow Keys or WASD to move. Space to pause.

showMobileControls

Whether to show touch control buttons on mobile devices. Type: boolean. Default: true.

Best Practices

  • NEVER use document, window, setInterval, setTimeout, or any DOM APIs - they are not available in the sandbox
  • NEVER call canvas.getContext('2d') - ctx is already provided and ready to use
  • Always initialize game state in onInit() callback
  • Use onFrame() for game loop - it provides deltaTime for smooth animation
  • Use onRestart() to reset game state when player restarts
  • Call gameOver() when player loses to show restart overlay
  • Use setHighScore() to persist best scores to localStorage
  • Use the state object to store all game data (persists across frames)
  • Use keys object for input (up, down, left, right, space) - NOT addEventListener
  • Keep game logic simple - complex games may have performance issues
  • Match colors (backgroundColor, borderColor, accentColor) to app theme
  • Set appropriate canvas dimensions for the game type (400x400 default works well)

Common Mistakes

Using document.getElementById, document.addEventListener, or any DOM API

Why it's a problem: SANDBOX: document is NOT available. Game code runs in an isolated Function with no DOM access.

Fix: Use the provided API only: ctx and canvas are already available. Use keys object for input, onInit/onFrame/onRestart for lifecycle.

Using window.onload, window.addEventListener, or window.requestAnimationFrame

Why it's a problem: SANDBOX: window is NOT available. The game runtime manages the animation frame loop for you.

Fix: Use onInit() for startup code, onFrame(deltaTime) for the game loop, and keys object for input.

Using setInterval or setTimeout for the game loop

Why it's a problem: SANDBOX: setInterval/setTimeout are NOT available. Multiple intervals also stack up causing bugs.

Fix: Use onFrame(function(deltaTime) {...}) for the game loop—it’s called every animation frame automatically.

Calling canvas.getContext('2d') to get the drawing context

Why it's a problem: ctx is ALREADY provided and ready to use. Redeclaring it can cause scope conflicts.

Fix: Just use ctx directly: ctx.fillRect(...), ctx.fillStyle = '...', etc.

Writing vanilla JavaScript game code instead of using the GameCanvas API

Why it's a problem: GameCanvas provides a sandboxed runtime. Vanilla JS patterns (DOM manipulation, event listeners, timers) will silently fail.

Fix: Structure code as: onInit() for setup, onFrame(dt) for update‑render loop, keys for input, state for data, setScore/gameOver for game management.

Not using onInit() to initialize state

Why it's a problem: State may be undefined, causing errors on first frame

Fix: Always initialize ALL game state variables in onInit() callback

Forgetting to call gameOver() when game ends

Why it's a problem: Game continues running, player can’t restart

Fix: Call gameOver('Game Over!') when lose condition is met

Not using deltaTime for movement

Why it's a problem: Game speed varies based on frame rate, inconsistent experience

Fix: Multiply movement by deltaTime: state.x += speed * deltaTime

Storing game state outside the state object

Why it's a problem: Variables may be lost between executions or not persist correctly

Fix: Store ALL game data in state object: state.snake = [...], state.score = 0

Not matching colors to app theme

Why it's a problem: Game looks out of place, jarring visual experience

Fix: Set backgroundColor, borderColor, accentColor to match app’s theme

Étiquettes

gamecanvas interactive-games classic arcade puzzle games reaction and

Composants associés

Prêt à construire ?

Commencez à créer votre application gratuitement avec Qödiak.

Commencer gratuitement