关于 phaser-arcade-physics
面向 Phaser 4.2 游戏开发的 Arcade Physics 技能,指导实现移动、重力和碰撞。重点涵盖动态与静态物体、群组以及碰撞和重叠检测。
主要功能
- 01配置 Arcade Physics 世界
- 02设置动态与静态物体
- 03控制速度、加速度和反弹
- 04处理碰撞与重叠
- 05使用物理群组和边界
适用场景
- 01制作俯视角角色移动
- 02实现平台跳跃与落地检测
- 03处理拾取物和触发器
- 04调试物体碰撞范围
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill phaser-arcade-physics安装后在 Claude Code 中输入/phaser-arcade-physics确认已加载。
附带文件references/bodies-and-collision.md
详细介绍
Phaser 4 Arcade Physics
使用轻量级 Arcade Physics 引擎(仅支持 AABB 矩形和圆形),为 Phaser 游戏添加移动和碰撞。新项目以 Phaser 4.2 为目标;编辑现有项目之前,先检查已安装的主版本。
适用场景
- 用于俯视角或平台游戏的移动、速度/加速度/重力、弹跳、世界边界,以及精灵、组和图块之间的碰撞/重叠处理。
- 场景启用了
physics: { default: 'arcade' },且代码调用this.physics.add.*、body.setVelocity或this.physics.add.collider时使用。
不适用场景:Game 配置、场景结构、资源加载或摄像机 → 使用 phaser-core。铰链、弹簧、复杂多边形或堆叠刚体 → 使用 Matter physics(这是另一种引擎;Arcade 和 Matter 的物体不会相互作用)。如需与引擎无关的手感调优,请参阅 physics-tuning。
核心工作流
- 启用物理世界。 在游戏或场景配置中设置
physics: { default: 'arcade', arcade: { gravity: {...}, debug: true } }。开发期间开启debug,以查看物体轮廓和速度向量。 - 为精灵添加物体。 使用
this.physics.add.sprite(...)(动态)或this.physics.add.staticImage(...)(静态)创建精灵,或使用this.physics.add.existing(obj)为现有对象添加物体。 - 通过物体驱动精灵,而不是设置
x/y。 使用setVelocity、setAcceleration、重力、setBounce和setCollideWorldBounds。引擎会在每个步骤根据速度计算位置(已与帧率无关)。 - 处理交互。
this.physics.add.collider(a, b)会分离物体;this.physics.add.overlap(a, b, cb)只检测而不分离(用于拾取物、触发器)。传入回调以作出响应。 - 将多个对象分组。 使用
this.physics.add.group()(动态)或staticGroup()(平台),这样一次碰撞器调用就能处理所有成员。 - 跳跃前检查是否接触地面,使用
body.onFloor()/body.blocked.down。以debug: true运行,并确认物体、接触状态和边界。
常见模式
1. 启用 Arcade Physics(游戏配置)
const config = {
type: Phaser.AUTO,
width: 800, height: 600,
physics: {
default: 'arcade',
arcade: {
gravity: { x: 0, y: 600 }, // top-down? use { x: 0, y: 0 }
debug: false // true to draw bodies + velocity while building
}
},
scene: [PlayScene]
};
new Phaser.Game(config);
2. 俯视角移动(根据输入设置速度)
create() {
this.player = this.physics.add.sprite(400, 300, 'player');
this.player.setCollideWorldBounds(true);
this.cursors = this.input.keyboard.createCursorKeys();
}
update() {
const speed = 220;
const body = this.player.body;
body.setVelocity(0); // reset each frame
if (this.cursors.left.isDown) body.setVelocityX(-speed);
if (this.cursors.right.isDown) body.setVelocityX(speed);
if (this.cursors.up.isDown) body.setVelocityY(-speed);
if (this.cursors.down.isDown) body.setVelocityY(speed);
body.velocity.normalize().scale(speed); // keep diagonals same speed
}
3. 平台游戏跳跃(重力 + 地面检测)
create() {
this.player = this.physics.add.sprite(100, 450, 'player');
this.player.setCollideWorldBounds(true);
// Static platforms: one body each, never moved by collisions.
this.platforms = this.physics.add.staticGroup();
this.platforms.create(400, 568, 'ground');
this.physics.add.collider(this.player, this.platforms);
this.cursors = this.input.keyboard.createCursorKeys();
}
update() {
const onGround = this.player.body.blocked.down; // or this.player.body.onFloor()
if (this.cursors.left.isDown) this.player.setVelocityX(-160);
else if (this.cursors.right.isDown) this.player.setVelocityX(160);
else this.player.setVelocityX(0);
if (this.cursors.up.isDown && onGround) this.player.setVelocityY(-450);
}
4. 碰撞器与重叠检测(分离与检测)
// Push apart and react: player vs enemies.
this.physics.add.collider(this.player, this.enemies, (player, enemy) => {
this.handleHit(player, enemy);
});
// Detect without pushing: collect coins. The 4th arg is an optional
// process callback returning a boolean to filter pairs before the main callback.
this.physics.add.overlap(this.player, this.coins, (player, coin) => {
coin.disableBody(true, true); // deactivate + hide
this.registry.inc('score', 10);
});
5. 一组移动对象
this.bullets = this.physics.add.group({
defaultKey: 'bullet',
maxSize: 30 // pool size; reuse instead of allocating
});
fire(x, y) {
const bullet = this.bullets.get(x, y); // reuses a dead bullet if available
if (!bullet) return;
bullet.enableBody(true, x, y, true, true);
bullet.setVelocityY(-500);
}
常见问题
- 精灵不受物理影响 → 它是通过
this.add.sprite而不是this.physics.add.sprite添加的(或未调用this.physics.add.existing(obj)),因此没有物体。 - 直接设置
sprite.x会与引擎冲突 → 使用setVelocity/setAcceleration移动动态物体。直接写入位置可能导致物体穿过碰撞体。 - 斜向移动更快 → X 和 Y 方向的独立速度会叠加;应将速度向量归一化,再缩放到预期速度。
- 平台被玩家推着走 → 使用
staticGroup,或对动态平台调用body.setImmovable(true)。 onFloor()始终为 false → 物体需要有可碰撞的对象;检查之前,先添加与地面/平台之间的collider,并确保重力已启用。- 移动静态物体后碰撞状态过期 → 静态物体不会自动同步;调用
body.updateFromGameObject()(或对游戏对象调用refreshBody())。 - 每帧都添加碰撞器 → 在
create中注册一次collider/overlap,不要在update中注册。
参考资料
- 有关物体结构和调优(阻力、弹跳、最大速度、自定义
setSize/setCircle/setOffset碰撞箱、碰撞类别/掩码,以及worldbounds事件),请阅读references/bodies-and-collision.md。
相关技能
phaser-core— 游戏配置、场景、加载器、摄像机(必需的前置设置)。physics-tuning— 与引擎无关的手感调优(固定时间步长、穿透、抖动)。platformer/tower-defense— 使用此技能的游戏类型。level-design— 布置这些物体会与之碰撞的图块/平台几何结构。
评论
支持 Markdown