在Raphael中移动元素并检查它是否与其他元素发生碰撞

时间:2014-01-21 20:29:00

标签: path jquery-animate raphael collision geometry

我想检查一个动画圆元素是否与一组路径元素中的动画路径元素碰撞(重叠)。

为了让这个例子更容易理解我动画圈子并希望你告诉我,如果黑色圆圈中的一个碰撞它,你怎么能让绿色圆圈显得红色:

http://jsfiddle.net/329pK/2/

小提琴的代码:

JS
var paper = Raphael("canvas", 800, 800);
var cx = 400;
var cy = 400;   
// Helpers
function rand(min, max) {
    return Math.random() * (max - min) + min;
}

var bigCircle = paper.circle(cx, cy, 500);
function flyMeteor(){
    var ptOnCircle = bigCircle.getPointAtLength(rand(1,bigCircle.getTotalLength()));
    var anim = Raphael.animation({
        fill: 'black',
        opacity: 0,
        cx: ptOnCircle.x,
        cy: ptOnCircle.y,
        stroke: 0,
        r: 0
    },1200,function(){
        this.remove();
    });
    var circle = paper.circle(cx, cy, 4).attr({
        fill:'black',
        stroke: 0
    }).animate(anim);
};
setInterval(function(){
    flyMeteor();
},200); 

var circle = paper.circle(250, 250, 80).attr({
    fill:'green',
    stroke: 0
});

HTML
<div id="canvas"></div>

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

我不确定这个答案是否容易。有一些像这里引用的SVG方法Hit-testing SVG shapes?但我不确定它们是否真的可以用于此。这也取决于它只是圈子,或者圈子是否只是更复杂的占位符。如果是圆圈,您可以按照我在以下示例中使用的Circle Collision Javascript进行碰撞检测......

为了检查,我正在检查动画外的所有对象。这感觉有点笨拙,最好以某种方式进入动画内部,但没有看到一种方法可以做到这一点(你可以做你自己的动画功能)。

在这里摆弄http://jsfiddle.net/RvvXL/1/

circle.data('myAnim', anim);

....

function collision (p1x, p1y, r1, p2x, p2y, r2) {
    var a;
    var x;
    var y;

    a = r1 + r2;
    x = p1x - p2x;
    y = p1y - p2y;

    if ( a > Math.sqrt( (x*x) + (y*y) ) ) {
       return true;
    } else {
        return false;
    }   
}

....

setInterval( function() {   // maybe use requestAnimationFrame
    paper.forEach( function(el) { 
        if( el.type=='circle' ) { 
            if( collision( el.attr('cx'), el.attr('cy'), el.attr('r'), bigCircle.attr('cx'), bigCircle.attr('cy'), bigCircle.attr('r') ) ) {
                if( el.data('myAnim') ) {
                    el.stop( el.data('myAnim') );
                    el.remove();
                }
            };
        }
   } );