You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Phaser JS中使用game.physics.arcade.collide()实现图形圆碰撞?

解决Phaser JS中Graphics圆形的碰撞检测问题

嘿,我来帮你搞定这个碰撞检测的问题!首先得指出你现有代码里的一个小坑:用graphics.drawCircle()创建的图形,默认的物理碰撞体是矩形,和你画的圆形形状不匹配,这会导致碰撞检测不准。而且drawCircle()返回的是图形数据对象,不是物理体,所以得手动调整物理体的形状才行。

下面是修改后的完整代码,以及实现碰撞检测的关键步骤:

1. 修正Graphics的物理体设置

创建每个圆形后,我们需要用body.setCircle()把物理碰撞体改成和绘制图形匹配的圆形:

var game;
var graphics; 
var graphics1;

function init() {
    game = new Phaser.Game(800, 600, Phaser.AUTO, '', { preload: preload, create: create, update: update });
}

function preload() {
    // 不需要预加载资源的话留空即可
}

function create(){
    game.physics.startSystem(Phaser.Physics.ARCADE);
    
    // 第一个圆形
    graphics = game.add.graphics(100, 200);
    game.physics.arcade.enable(graphics);
    graphics.beginFill(0xFFFFFF, 1);
    // 把圆心设为(0,0),让物理体和图形完全对齐
    graphics.drawCircle(0, 0, 30);
    graphics.endFill();
    // 设置圆形碰撞体:半径15(和绘制的30直径对应),偏移量0,0
    graphics.body.setCircle(15, 0, 0);
    // 给个速度方便测试碰撞
    graphics.body.velocity.x = 100;

    // 第二个圆形
    graphics1 = game.add.graphics(500, 200);
    game.physics.arcade.enable(graphics1);
    graphics1.beginFill(0xFF0000, 1);
    graphics1.drawCircle(0, 0, 30);
    graphics1.endFill();
    graphics1.body.setCircle(15, 0, 0);
    graphics1.body.velocity.x = -100;
}

function update() {
    // 每帧检测两个圆形的碰撞,第三个参数是碰撞后的回调函数(可选)
    game.physics.arcade.collide(graphics, graphics1, onCollision, null, this);
}

// 自定义碰撞处理函数(可选)
function onCollision(obj1, obj2) {
    console.log("两个圆形撞在一起啦!");
    // 这里可以加碰撞后的逻辑,比如换颜色、反弹等
    obj1.beginFill(0x00FF00, 1);
    obj1.drawCircle(0, 0, 30);
    obj1.endFill();
}

关键细节说明

  • 把圆心设为(0,0):这样Graphics自身的坐标原点和圆心重合,设置物理体时不需要额外偏移,能保证碰撞体和视觉图形完全对齐。
  • body.setCircle():这个方法是核心,它把默认的矩形碰撞体替换成圆形,参数依次是半径、x轴偏移、y轴偏移,要和你绘制的圆形大小对应。
  • 在update里调用collide:game.physics.arcade.collide()需要每帧执行,所以放在update函数里,Phaser会持续检测两个物体的碰撞状态。
  • 碰撞回调函数:第三个参数是可选的,碰撞发生时会触发这个函数,你可以在这里写自定义逻辑,比如改变颜色、播放音效、调整速度等。

如果你的圆形是静态不动的,也可以在create里只调用一次collide,但放在update里更稳妥,尤其是当物体有移动或状态变化时。

内容的提问来源于stack exchange,提问作者Ildar2002

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:18:10