【问题标题】:Raphael JS collision detection with walls while dragging拖动时Raphael JS与墙壁的碰撞检测
【发布时间】:2011-10-19 19:31:58
【问题描述】:

我在 Raphael 中有以下用于拖动形状的代码:

var start = function() {
        this.ox = 0;
        this.oy = 0;
        self.bringToFront();
    },
    move = function(dx, dy) {
        var a = self.getAngle(self.rotation),
            bb = self.shape.getBBox();

        switch(a){
            case 90:
                self.shape.translate(dy - this.ox, this.oy - dx);
                this.ox = dy;
                this.oy = dx;
                break;
            case 180:
                self.shape.translate(this.ox - dx, this.oy - dy);
                this.ox = dx;
                this.oy = dy;
                break;
            case 270:
                self.shape.translate(this.ox - dy, dx - this.oy);
                this.ox = dy;
                this.oy = dx;
                break;
            default:
                self.shape.translate(dx - this.ox, dy - this.oy);
                this.ox = dx;
                this.oy = dy;
        }
    },
    end = function() {
    };

(self.shape 是一组 Raphael 路径和矩形)

我正在尝试获取它,因此您不能将形状拖出 SVG 画布区域。 现在我能够获取形状边界框的坐标,bb move 函数中的变量。我试图添加对if(bb.x < 10)... 的检查,但我不知道如何将约束设置为:“不要让它进一步向左移动”。我正在为边界框检查 x 的位置,然后又试图约束形状的 x 位置,这是否有问题?

【问题讨论】:

  • 这不起作用? if ( bb.x < 10 ) bb.x = 10
  • 不。我正在使用边界框上的 x 来检查位置,但我正在翻译形状的 x、y。如果这有意义的话。

标签: javascript svg raphael


【解决方案1】:

这本身不是答案,但应该为您指明正确的方向。

查看drag 的 raphael 2.0 参考

它旁边的图像几乎完全符合您的要求。它背后的代码在reference.js 文件中。如果你搜索“Element.drag-extra”,你会看到这段代码

(function (r) {
    var x, y;
    r.circle(15, 15, 10).attr(fill).drag(function (dx, dy) {
        this.attr({
            cx: Math.min(Math.max(x + dx, 15), 85),
            cy: Math.min(Math.max(y + dy, 15), 85)
        });
    }, function () {
        x = this.attr("cx");
        y = this.attr("cy");
    });

})(prepare("Element.drag-extra"));

在这里,Dmitry 将拖动限制在最小 15 像素和最大 85 像素之间。应该可以使用一点 DOM 魔法来找到画布的大小并相应地修改上面的代码。

希望能有所帮助。

【讨论】:

  • 为什么是“15”和“85”?我有点明白为什么“15”但“85”似乎是凭空出现的
  • 因为盒子是100x100,圆的半径是15。你总是移动圆心,所以圆心的最小位置是0+半径(15),最大是 100 半径 (85)。真的很简单。
  • code r.circle(15, 15, 10) 你的半径设置为 10。细节就是一切
  • 重点仍然存在。 15 和 85 将圆限制在正方形内。如果我回去再看一遍,我可能会决定将其限制在 10、90。说真的,考虑到我试图提供帮助,这是一个非常陈词滥调的评论。
  • 如果没有正确的圆半径,约束设置的逻辑就会变得不清楚。你所要做的就是修正你原来的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
相关资源
最近更新 更多