使用Raphael js进行拖放操作

4
我正在尝试使用JavaScript和Raphael构建拼图游戏,以处理拼图块的拖放和旋转。然而,我面临的问题是:每当我旋转一张图片时,它的坐标系也会随之旋转,导致拖放操作不再按照预期工作。为了说明,无论我用鼠标向右移动1像素(x++),该图片在自身的坐标系上也会朝x轴正方向移动1像素,如下图所示。这里有一个简单的测试用例,您可以在其中拖动椭圆并进行旋转,然后再次尝试拖动: http://www.tiagoserafim.com/tests/dragdrop.html

alt text
(来源: oreilly.com)

SVG Essentials所解释的那样,这是预期行为。

我的问题是:有没有一种优雅的方法来实现我想要的,或者我将被迫使用旋转矩阵手动计算正确的坐标?

其他JS库或建议将非常受欢迎,即使它们意味着失去IE支持。

1个回答

3

正如文章中所提到的,变换的顺序很重要。

  1. 将对象平移,使中心点(或任何其他您想要围绕旋转的点)位于0,0
  2. 旋转
  3. 返回至先前的位置

还要注意,rotate 有一个已经执行此操作的重载。

<html>
    <head>
        <script type="text/javascript" src="http://github.com/DmitryBaranovskiy/raphael/blob/master/raphael-min.js?raw=true"></script>
        <script type="text/javascript">
            function Draw()
            {
                var x = 150, y = 150;
                var rotation = 0;
                var paper = Raphael(0, 0, 800, 800);
                var e = paper.ellipse(x, y, 30, 10);
                paper.path("M150 150L800 150");
                window.setInterval(function()
                {
                    x += 10;
                    rotation += 10;
                    e.translate(10, 0);
                    e.rotate(rotation, x, y);
                }, 500);
            }
        </script>
    </head>
    <body onload="Draw()">
    </body>
</html>

嗨!是的,这正是我正在做的事情。问题在于之后,当我尝试拖动图像并移动它自己的 x 坐标时,而不是默认的水平 x 坐标,例如。 - Tiago
你好!再次感谢你花时间修改代码。我在这里试过了,如果你将位移改为10个像素而不是1个像素,你就能看到我的问题了:图像不会沿着一条直线水平移动。 - Tiago
我的代码没有按预期工作,因为我将平移增加到了10个像素,但我没有改变x+= 10。多亏了你,现在我看到了旋转(trans,x,y)的另一个用途。但是,我认为这并不能解决原始问题。假设您将图像旋转45度,然后将其平移(10,0)。由于新的坐标系统,它不会再水平移动。因此,它破坏了拖放功能,因为它提供相对于默认坐标系统的增量值。再次感谢您的时间和耐心。 - Tiago
我仍然无法复现。每次我使用带有点的版本进行旋转时,它都能完美地工作。你能提供失败的代码吗? - Dark Falcon
Tiago,你应该选择Dark Falcon的答案作为选定答案吗?不用回答我 :) - Fabiano Soriani
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接