Was macht melonjs-physics?
Nutze dieses Skill für Kollisionen, physikalische Körper, Bewegung und räumliche Abfragen in melonJS — die integrierte SAT-Welt und die planck/matter-Adapter. Behandelt bodyDef vs. Body, Kollisionstypen und -masken, die Familie der Kollision-Callbacks und ihre Auslöseregeln, raycast/queryAABB/querySphere sowie die Verhaltensunterschiede zwischen den Adaptern. Auslöser: Body, bodyDef, collision, collisionType, collisionMask, onCollision, onCollisionStart, onCollisionActive, raycast, queryAABB, querySphere, PlanckAdapter, MatterAdapter, gravity, velocity, applyForce, isGrounded, SAT.
Übersicht
- SAT-Welt: Standard-Physik in melonJS, basiert auf dem Separating Axis Theorem. Bietet grundlegende Kollision und einfache Dynamik.
- PlanckAdapter: Schnittstelle zu Planck.js, einem 2D-Physik-Engine. Bietet erweiterte Funktionen wie Gelenke, Reibung und komplexe Kollisionsmasken.
- MatterAdapter: Schnittstelle zu Matter.js, einer weiteren beliebten 2D-Physik-Engine. Ähnlich wie Planck, aber mit eigener API und Verhalten.
Wichtige Konzepte
bodyDef vs. Body
bodyDef(Definition): Ein Objekt, das die Eigenschaften eines physikalischen Körpers beschreibt (z. B. Position, Form, Typ). Wird verwendet, um einen Körper zu erstellen.Body: Die tatsächliche Instanz des physikalischen Körpers, die nach der Erstellung ausbodyDefexistiert. Du kannst aufBody-Eigenschaften wiegravity,velocityoderapplyForcezugreifen.
Kollisionstypen und -masken
collisionType: Definiert die Art der Kollision (z. B.me.collision.types.NO_OBJECT,me.collision.types.PLAYER_OBJECT).collisionMask: Bestimmt, mit welchencollisionTypes dieser Körper kollidieren soll (Bitmaske).
Kollision-Callbacks
onCollision(response): Wird bei jeder Kollision aufgerufen.onCollisionStart(response): Wird beim ersten Kontakt zweier Körper aufgerufen.onCollisionActive(response): Wird während der gesamten Dauer einer Kollision aufgerufen (jeden Frame, solange die Körper sich überlappen).
Auslöseregeln: Die Callbacks werden nur ausgeführt, wenn beide Körper entsprechende Methoden definiert haben. onCollision überschreibt onCollisionStart und onCollisionActive, wenn beide vorhanden sind.
Räumliche Abfragen
raycast(start, end, callback, layer?): Führt einen Strahl vonstartnachendaus und ruftcallbackfür jeden getroffenen Körper auf.queryAABB(rect, callback, layer?): Findet alle Körper, die das angegebene Rechteck (AABB) schneiden.querySphere(center, radius, callback, layer?): Findet alle Körper, die die angegebene Kugel (Kreis in 2D) schneiden.
Physikalische Kräfte
gravity: Die Schwerkraft, die auf den Körper wirkt (Vektor).velocity: Die Geschwindigkeit des Körpers (Vektor).applyForce(position, force): Wendet eine Kraft an einer bestimmten Position an.isGrounded(): Prüft, ob der Körper auf dem Boden steht (nur in manchen Adaptern verfügbar).
Verhaltensunterschiede zwischen Adaptern
| Adapter | Eigenschaften |
|---|---|
| SAT | Einfach, schnell, keine Gelenke oder Reibung. isGrounded() ist möglicherweise nicht implementiert. |
| PlanckAdapter | Vollständige Physik-Engine mit Gelenken, Reibung, Dämpfung. isGrounded() verfügbar. |
| MatterAdapter | Ähnlich wie Planck, aber mit eigener Konfiguration (z. B. matter-Eigenschaft in bodyDef). isGrounded() verfügbar. |
Beispiele
Erstellen eines Physik-Körpers
// bodyDef
let bodyDef = {
x: 100,
y: 100,
width: 32,
height: 32,
type: me.collision.types.PLAYER_OBJECT,
collisionMask: me.collision.types.WALL_OBJECT | me.collision.types.ENEMY_OBJECT
};
// Body erstellen (z. B. in einer Entity)
this.body = new me.Body(this, bodyDef);
Kollision-Callback
// In einer Entity
onCollisionStart: function (response) {
console.log("Kollision gestartet mit:", response.b);
return false; // Standardmäßig true; false verhindert weitere Kollisionsreaktionen
}
Raycast
let from = new me.Vector2d(0, 0);
let to = new me.Vector2d(100, 100);
me.game.world.raycast(from, to, function (result) {
console.log("Getroffen:", result.body);
});
queryAABB
let rect = new me.Rect(0, 0, 100, 100);
me.game.world.queryAABB(rect, function (body) {
console.log("Gefunden:", body);
});
Wichtige Hinweise
- Stelle sicher, dass der korrekte Adapter (SAT, Planck, Matter) in deiner
index.htmlodergame.jsimportiert ist. - Bei Verwendung von Planck oder Matter musst du die entsprechenden Skripte vor melonJS einbinden.
- Verwende
body.gravity,body.velocityundbody.applyForce()nur, nachdem der Körper zur Welt hinzugefügt wurde. isGrounded()funktioniert nur bei Planck und Matter zuverlässig; bei SAT kann es sein, dass du manuell prüfen musst.