【问题标题】:Moving Element in Raphael and check if it collides with other Element在 Raphael 中移动元素并检查它是否与其他元素发生碰撞
【发布时间】:2014-01-21 20:29:00
【问题描述】:

我想检查动画圆元素是否与一组路径元素中的动画路径元素发生冲突(重叠)。

为了使示例更易于理解,我为圆圈设置了动画并希望您向我展示,如何让绿色圆圈在其中一个黑色圆圈与它发生碰撞时显示为红色:

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>

非常感谢您的帮助!

【问题讨论】:

    标签: path jquery-animate raphael collision geometry


    【解决方案1】:

    我不确定这个问题是否有简单的答案。这里有一些 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();
                    }
                };
            }
       } );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多