【问题标题】:Phaser - How to check for sprite moving between two other sprites?Phaser - 如何检查精灵在其他两个精灵之间移动?
【发布时间】:2017-09-18 05:30:40
【问题描述】:

我正在尝试检查一个精灵是否正在通过其他两个精灵之间的线。我试图检查精灵是否与 Phaser.Line 重叠:

this.lineGreenToRed = new Phaser.Line(this.ballGreen.x, this.ballGreen.y, this.ballRed.x, this.ballRed.y);

this.checkPassed = this.lineGreenToRed.pointOnLine(this.ballBlue.position.x, this.ballBlue.position.y);
if (this.checkPassed) {
    console.log('GreenToRed passed');
    //counter++;
};
console.log(this.checkPassed);

只要我的精灵不在/越线,查看控制台就会计算错误事件。有时将它移过界限会给我真实的事件,但并非总是如此。看起来帧变化太快而无法检测到。似乎也不可能对 Lines 进行重叠检查。

我也尝试过:

this.GreenToRedArray = this.lineGreenToRed.coordinatesOnLine();

在更新()中:

this.GreenToRedArray.forEach(this.checkPoint, this);

然后:

checkPoint : function(element){
      if (this.ballBlue.position.x == element[0] && this.ballBlue.position.y == element[1]){
        console.log('GreenToRed passed');
        this.score++;
        console.log(this.score);
        this.scoreText.setText(this.score);
    }
},

只要我在这条线上移动得很慢,这就会起作用,但只要东西移动得快一点,它就不再捕捉它了。

关于如何检查一个精灵是否在其他两个精灵之间的线上移动的任何提示?

把它想象成两个球标志着一个目标,第三个球在这两个球之间射门。

非常感谢您的帮助。

【问题讨论】:

    标签: phaser-framework


    【解决方案1】:

    我没有过多地使用Phaser.Lines,所以经过一些研究,并根据我在其他地方看到的情况,我可能会建议稍微改变一下。

    一种选择是将球门线更改为Phaser.Sprite,然后检查overlap

    或者,您可以检查矩形交叉点,如 Overlap Without Physics 示例中所示。

    function update() {
        if (checkOverlap(this.ballBlue, this.goal)) {
            console.log('overlapping');
        }
    }
    function checkOverlap(spriteA, spriteB) {
        var boundsA = spriteA.getBounds();
        var boundsB = spriteB.getBounds();
    
        return Phaser.Rectangle.intersects(boundsA, boundsB);
    }
    

    这可以进行调整,因此如果您不想使用 Sprite,可以使用 Phaser.Rectangle 而不是 Phaser.Line,相应地更改功能。

    我想你也可以从球的前一个位置到当前位置再画一个Phaser.Line,然后检查一个交叉点。

    【讨论】:

    • 非常感谢您的帮助 - 我的问题是“目标”没有解决。我有 3 个球在游戏中移动,从彼此和世界边界反弹。因此,需要根据作为球门柱的两个球的距离和角度,每新一轮计算球门线/精灵/矩形。这也是为什么从前一个位置画第二条线不起作用的原因:球在通过球门线后可能最终处于完全不同的位置(与其终点位置没有交叉)。我能以某种方式创建一个灵活的精灵或矩形吗?
    • 我需要的更像是从 x1、y1 到 x2、y2 的矩形(或精灵),而不是给定的矩形 x、y、高度、宽度。任何进一步的提示/想法将不胜感激:-)
    • 啊,我明白了。我没有意识到两个球门也在移动。深入挖掘,看起来Phaser.Line.intersectsRectangle 可能会有所帮助。 html5gamedevs.com/topic/27412-line-collision/… 有一个示例,与 pointOnLine 不同的是,它只是检查 Sprite 的锚点,这将针对您的球精灵的整个边界进行测试。
    • 太好了 - 非常感谢,希望这也适用于我的圈子 - 我下周会尝试... ...可能会回来:-)
    • 哇哦!很高兴帮助:)
    猜你喜欢
    • 2017-05-27
    • 1970-01-01
    • 2018-03-21
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多