Communitygithub.com

melonjs/melonjs-physics

Utilisez cette compétence pour la détection de collisions, les corps physiques, les mouvements et les requêtes spatiales dans melonJS — le monde SAT intégré et les adaptateurs planck/matter. Couvre les différences entre bodyDef et Body, les types et masques de collision, la famille des callbacks de collision et leurs règles de déclenchement, les raycasts, queryAABB et querySphere, ainsi que les différences de comportement entre les adaptateurs.

Qu'est-ce que melonjs-physics ?

Cette compétence, melonjs/melonjs-physics, est conçue pour les développeurs utilisant le moteur de jeu melonJS qui ont besoin d'interagir avec son système de physique. Elle couvre à la fois le monde de collision SAT (Séparation des Axes) intégré par défaut et les intégrations via les adaptateurs Planck.js et Matter.js. La compétence explique en détail la configuration des corps physiques en utilisant `bodyDef` pour définir les propriétés avant la création d'un objet `Body`, la gestion des types de collision et des masques pour filtrer les interactions entre objets, et la famille des callbacks de collision (`onCollision`, `onCollisionStart`, `onCollisionActive`, etc.) avec leurs règles de déclenchement spécifiques. Elle décrit également comment effectuer des requêtes spatiales comme `raycast`, `queryAABB`, et `querySphere` pour détecter des objets dans une zone. Enfin, elle met en évidence les différences de comportement clés entre l'adaptateur SAT par défaut, Planck et Matter, notamment en ce qui concerne les unités, la gravité, la vélocité, `applyForce`, et `isGrounded`, ce qui est crucial pour choisir l'adaptateur adapté à votre projet et éviter des bugs subtils.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/melonjs/melonJS/tree/master/packages/melonjs/skills/melonjs-physics

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait melonjs-physics ?

Utilisez cette compétence pour la détection de collisions, les corps physiques, les mouvements et les requêtes spatiales dans melonJS — le monde SAT intégré et les adaptateurs planck/matter. Couvre les différences entre bodyDef et Body, les types et masques de collision, la famille des callbacks de collision et leurs règles de déclenchement, les raycasts/queryAABB/querySphere, ainsi que les différences de comportement entre les adaptateurs. Se déclenche sur : Body, bodyDef, collision, collisionType, collisionMask, onCollision, onCollisionStart, onCollisionActive, raycast, queryAABB, querySphere, PlanckAdapter, MatterAdapter, gravity, velocity, applyForce, isGrounded, SAT.

Concepts clés

Corps physiques

Dans melonJS, vous créez un corps physique en utilisant un bodyDef (qui est un objet de configuration simple) puis en créant une instance Body.

// Définition du corps
var bodyDef = {
  mass: 1,
  shape: new me.Rect(0, 0, 32, 32)
};

// Création du corps
var body = new me.Body(bodyDef);

Collisions

Les collisions sont configurées à l'aide de collisionType et collisionMask. Le collisionType identifie le type de cet objet (par exemple, joueur, ennemi, plateforme). Le collisionMask est un bitmask qui détermine avec quels autres collisionTypes cet objet peut entrer en collision.

body.collisionType = me.game.COLLISION_TYPES.PLAYER_OBJECT;
body.collisionMask = me.game.COLLISION_TYPES.ENEMY_OBJECT;

Famille de callbacks de collision

Lorsqu'une collision se produit, les appels suivants sont effectués sur les deux objets impliqués :

  • onCollision (événement de collision général)
  • onCollisionStart (se déclenche au premier contact)
  • onCollisionActive (se déclenche chaque frame pendant que la collision persiste)

Règles importantes :

  • onCollision et onCollisionStart sont appelés une seule fois au début de la collision.
  • onCollisionActive est appelé à chaque frame tant que la collision reste active.
onCollisionStart: function(response, other) {
    // Premier contact avec un autre objet
    console.log("Collision démarrée avec", other);
    return true; // Retourner true pour traiter la collision, false pour l'ignorer
},

onCollisionActive: function(response, other) {
    // Collision persistante - appelé à chaque frame
    // Utile pour les interactions continues
    return true;
}

Requêtes spatiales

melonJS fournit des méthodes pour interroger le monde physique :

// Raycast - projette un rayon et détecte les corps touchés
var result = me.collision.raycast(startPoint, endPoint, callback);

// queryAABB - trouve les corps dans une boîte alignée sur les axes
var box = new me.Rect(x, y, width, height);
var bodies = me.collision.queryAABB(box);

// querySphere - trouve les corps dans une sphère
var sphere = new me.Vector2d(centerX, centerY);
var radius = 50;
var bodies = me.collision.querySphere(sphere, radius);

Adaptateurs

melonJS supporte trois mondes physiques :

AdaptateurDescriptionDocumentation
SAT (par défaut)Détection de collisions basée sur le théorème de séparation des axes. Simple, sans simulation de forces.Documentation SAT
PlanckAdapterUtilise le moteur physique Planck.js (Box2D porté en JavaScript). Simulation réaliste avec forces, friction, ressorts.Documentation Planck
MatterAdapterUtilise le moteur physique Matter.js. Très complet pour les simulations complexes.Documentation Matter

Différences de comportement entre adaptateurs

Unité de gravité

  • SAT: gravity est un simple vecteur (par exemple, {x: 0, y: 0.98}) pour l'accélération en pixels par frame.
  • Planck: Utilise les unités Box2D (mètres). La gravité est définie en m/s². Nécessite une conversion d'unité (1 pixel = 0.01 mètre par défaut).
  • Matter: La gravité est définie comme un objet {x: 0, y: 1} où 1 correspond à la gravité terrestre par défaut.

Vélocité

  • SAT: body.vel est directement accessible en pixels/frame.
  • Planck: body.velocity est en m/s. Utilisez body.setVelocity(x, y) pour la définir.
  • Matter: body.velocity est en pixels/frame. Utilisez Body.setVelocity(body, {x, y}) pour la définir.

applyForce

  • SAT: Non disponible. Les forces ne sont pas simulées; utilisez velocity directement.
  • Planck: body.applyForce(force, point) où force est en Newtons.
  • Matter: Body.applyForce(body, position, force) où force est en Newtons * secondes (impulsion).

isGrounded

  • SAT: Non intégré. Vous devez implémenter votre propre détection de contact au sol.
  • Planck: Propriété body.isGrounded() qui retourne true/false.
  • Matter: Propriété body.isGrounded() qui retourne true/false.

Exemple complet

import me from 'melonjs';

class MonEntite extends me.Entity {
    constructor(x, y, settings) {
        super(x, y, settings);
        
        // Configuration du corps physique
        this.body.setVelocity(5, 10);
        this.body.collisionType = me.game.COLLISION_TYPES.PLAYER_OBJECT;
        this.body.collisionMask = me.game.COLLISION_TYPES.ENEMY_OBJECT;
        
        // Définir le callback de collision
        this.onCollisionStart = this.handleCollisionStart.bind(this);
    }
    
    handleCollisionStart(response, other) {
        if (other.collisionType === me.game.COLLISION_TYPES.ENEMY_OBJECT) {
            console.log("Collision avec un ennemi !");
            this.health -= 10;
        }
        return true;
    }
}

Dépannage

  • Problème: Les collisions ne sont pas détectées.

    • Solution: Vérifiez que collisionType et collisionMask sont correctement définis et que les propriétés body sont actives.
  • Problème: applyForce ne fonctionne pas comme prévu.

    • Solution: Utilisez-vous un adaptateur qui supporte les forces ? SAT ne supporte pas applyForce. Passez à Planck ou Matter.
  • Problème: Les unités semblent incorrectes (Planck).

    • Solution: Souvenez-vous que Planck utilise les mètres. Vous devrez peut-être configurer le facteur d'échelle pixel/mètre.

Ressources supplémentaires


Cette compétence est fournie pour vous aider à travailler avec le système physique de melonJS.

Individual skills in this repo

This repo contains 10 individual skills — each has its own dedicated page.

melonjs/melonjs-3d

Use this skill for anything 3D or 2.5D in melonJS — Camera3d, Mesh, InstancedMesh, Sprite3d billboards, Light3d, ground shadows, glTF/GLB scenes, and depth sorting. Covers the Y-down/+Z-forward convention that is the inverse of OpenGL, the cameraClass opt-in, clip planes, and what does not work on the Canvas fallback. Triggers on: Camera3d, Mesh, InstancedMesh, Sprite3d, Light3d, billboard, glTF, glb, 3D, 2.5D, depth, cameraClass, fov, setClipPlanes, setFog, fog, distance fog, height fog, heightFalloff, transparent, transparency, alpha, blendMode, fade, castGroundShadow, lit.

melonjs/melonjs-3d-assets

Use this skill when loading 3D models into melonJS — glTF and GLB scenes, OBJ/MTL models, materials, imported lights, node animation, ground shadows and GPU instancing. Covers level.load options including the async flag, the rightHanded conversion, and exactly what the loader does and does not support. Triggers on: glTF, gltf, glb, OBJ, MTL, 3D model, getGLTF, getOBJ, getMTL, GLTFModel, GLTFScene, level.load glb, rightHanded, lightIntensityScale, castGroundShadow, shadowGroundY, EXT_mesh_gpu_instancing, KHR_lights_punctual, skinning, Blender export, 3D asset.

melonjs/melonjs-camera-and-drawing

Use this skill for camera control and immediate-mode drawing in melonJS — following a target, viewport bounds, shake and fade, secondary cameras, and drawing shapes, lines and gradients inside a custom draw(). Covers world versus screen coordinate conversion, clipping and masking, and baking with CanvasRenderTarget. Triggers on: Camera2d, viewport, follow, setBounds, shake, fadeIn, fadeOut, worldToLocal, localToWorld, colorMatrix, renderer.fill, renderer.stroke, Rect, Ellipse, Polygon, Line, Gradient, clipRect, mask, CanvasRenderTarget, NoiseTexture2d.

melonjs/melonjs-effects-and-shaders

Use this skill for post-processing effects, custom shaders, blend modes and colour grading in melonJS. Covers the built-in ShaderEffect presets, addPostEffect on renderables and cameras, writing a custom dual-language GLSL/WGSL effect, the screen_texture builtins, and why effects silently do nothing on the Canvas fallback. Triggers on: ShaderEffect, addPostEffect, removePostEffect, getPostEffect, VignetteEffect, GlowEffect, BlurEffect, PixelateEffect, ScanlineEffect, shader, GLSL, WGSL, uniform, setUniform, setTexture, setTime, blendMode, colorMatrix, screen_texture, toFrameTexture, post effect, filter.

melonjs/melonjs-loading-assets

Use this skill for loading and managing game assets in melonJS — the resource descriptor format, the full asset type list, preload versus load, retrieving loaded assets, base URLs and cross-origin settings, and the loading screen. Triggers on: loader, loader.preload, loader.load, resources, getImage, getJSON, getTMX, getGLTF, getVideo, getFont, setBaseURL, setOptions, crossOrigin, withCredentials, credentials, cookies, authenticated assets, CORS, asset, preload, LOADER_COMPLETE, loading screen, unload.

melonjs/melonjs-performance

Use this skill when a melonJS game drops frames, allocates heavily, or needs to scale to many objects. Covers object pooling, draw-call batching, atlases, baking with CanvasRenderTarget, instancing, culling and alwaysUpdate, the debug plugin, and where the real costs are. Triggers on: performance, slow, frame rate, fps, lag, pool, pool.register, pool.pull, batching, draw calls, InstancedMesh, culling, alwaysUpdate, inViewport, CanvasRenderTarget, optimise, profiling, debug plugin, memory.

melonjs/melonjs-renderables

Use this skill when subclassing Renderable, writing a custom draw() method, handling pointer or click events on game objects, applying post effects and shaders, or controlling draw order. Covers the pos-relative draw contract, isKinematic and input, addPostEffect vs the deprecated shader property, and z-ordering. Triggers on: Renderable, extends Renderable, draw(, update(, isKinematic, pointerEvent, registerPointerEvent, onClick, addPostEffect, removePostEffect, ShaderEffect, addChild, z-order, anchorPoint, floating.

melonjs/melonjs-renderer-backends

Use this skill when a feature works on one machine and not another, when choosing or pinning a renderer, or when writing code that must degrade gracefully. Covers the WebGPU to WebGL 2 to Canvas fallback ladder, what each backend supports, capability detection, and the subsystems that warn once and then stop working on Canvas. Triggers on: video.AUTO, video.WEBGPU, video.WEBGL, video.CANVAS, renderer.type, supportsDepthBuffer, shaderLanguage, WebGPU, WebGL2, Canvas fallback, context loss, backen

melonjs/melonjs-scenes-and-state

Use this skill for scene structure and game flow in melonJS — Stage subclasses, the state manager, transitions, pausing, the update loop, timers and tweens. Covers onResetEvent versus the constructor, state.set before state.change, the camera and world lifecycle per stage, and pause-aware timing. Triggers on: Stage, state, state.set, state.change, state.transition, state.pause, onResetEvent, onDestroyEvent, onActivateEvent, onDeactivateEvent, PLAY, MENU, LOADING, update loop, GAME_UPDATE, timer, setTimeout, setInterval, Tween, freeze.

melonjs/melonjs-ui-and-text

Use this skill for HUDs, buttons, menus, dialogue panels and on-screen text in melonJS. Covers UIBaseElement/UISpriteElement/UITextButton, Draggable and DropTarget, the floating screen-space container pattern, Text and BitmapText, web font loading, and NineSliceSprite panels. Triggers on: UI, HUD, button, UIBaseElement, UISpriteElement, UITextButton, Draggable, DropTarget, menu, dialogue, Text, BitmapText, font, fontface, wordWrapWidth, NineSliceSprite, score display, floating.

Skills associés