2017-04-21 115 views
0

我试图检查一个精灵是否通过其他两个精灵之间的线。我试图检查精灵与重叠Phaser.Line:Phaser - 如何检查在两个其他精灵之间移动的精灵?

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); 

展望台这个计数的假事件,每当我的精灵不在/过线。将它移到线上有时会给我真实的事件,但并非总是如此。它看起来像框架变化太快,无法检测到它。在线上重叠检查似乎也不可能。

我也曾尝试用:

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); 
    } 
}, 

这工作只要我谨很慢了该线路,但只要事情移动得更快一点,它就不会再接受它了。

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

把它想象成两个球,标志着一种进球和第三球在这两者之间通过射门。

非常感谢您的帮助。

回答

1

我还没有太多的使用Phaser.Line,所以经过一些研究以及从我在其他地方看到的情况,我可能会建议对此稍有不同。

一个选项是将球门线改为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,然后检查一个十字路口。

+0

非常感谢您的帮助 - 我的问题是“目标”不能解决。在比赛中我有3个球在移动,从彼此和世界的边界反弹。所以球门线/精灵/长方形需要根据两个球的距离和角度作为球门柱进行计算,每轮新一轮。这也是为什么从前一个位置开始画第二条线不起作用的原因:球通过球门线后可能会处于完全不同的位置(与终点不相交)。我能以某种方式创建灵活的精灵或矩形吗? –

+0

我需要的是更像矩形(或精灵)从x1,y1到x2,y2而不是给定的recangle x,y,height,width。任何进一步的提示/想法将不胜感激:-) –

+0

啊,我现在明白了。我没有意识到两个球门也在移动。深入挖掘,它看起来像[Phaser.Line.intersectsRectangle](http://phaser.io/docs/2.6.2/Phaser.Line.html#.intersectsRectangle)可能会有所帮助。有一个例子在http://www.html5gamedevs.com/topic/27412-line-collision/?do = findComment&comment = 157389不同于'pointOnLine',它只是检查'Sprite'的锚点,它将测试你的球精灵的整个范围。 –