javascript - 更新 Raphael.js 中的位置

标签 javascript raphael

基本上,我有这个场景,是用 Raphael 创建的:

有一个jsfiddle的问题here .

所以,我的计划是让用户切断其中一根绳子来创建动画并在气球飞起和场景变化的同时打开各种新内容...... 我不知道是否应该将完整的代码粘贴给您,我只是在这里尝试一下:

window.onload = function() {

  //initialisierung raphael
  var r = Raphael("Scene", "100%", "100%"),
    discattr = {
      fill: "#fff",
      stroke: "none"
    };

  //variablen zum verschieben und für positionierung
  var verschiebungX = 0;
  var verschiebungY = 0;

  //höhe auf welcher die ballons hängen
  var ballonHohe = 500;

  //die nägel
  nagel1 = new Array(225, 735);
  nagel2 = new Array(500, 735);
  nagel3 = new Array(775, 735);

  //wind offset
  var windOffset = 10;

  //die bilder einlesen und auf ihr plätze legen
  var bg = r.image("img/bg.jpg", 0, -800 + verschiebungY, "100%", "200%");
  bg.attr({
    "clip-rect": "0,0, 100% , 100%"
  });

  var brett = r.image("img/holz.png", 0, 700 + verschiebungY, "100%", "20%");
  brett.attr({
    "clip-rect": "0,0, 100% , 100%"
  });



  r.text(310, 20, "Welcome to LuckyCrew").attr({
    fill: "#fff",
    "font-size": 16
  });

  var foo = 0;

  //das BallonObject
  Raphael.fn.ball = function(x, y, r, hue) {
    hue = hue || 0;
    return this.set(
      this.ellipse(x, y, r, r * 1.15).attr({
        fill: "r(.5,.9)hsb(" + hue + ", 1, .75)-hsb(" + hue + ", .5, .25)",
        stroke: "none"
      }),
      this.ellipse(x, y, r - r / 5, (r - r / 20) * 1.15).attr({
        stroke: "none",
        fill: "r(.5,.1)#ccc-#ccc",
        opacity: 0
      })
    );
  };

  //das seilObject
  function curve(x, y, ax, ay, bx, by, zx, zy, color) {
    var path = [
        ["M", x, y],
        ["C", ax, ay, bx, by, zx, zy]
      ],
      path2 = [
        ["M", x, y],
        ["L", ax, ay],
        ["M", bx, by],
        ["L", zx, zy]
      ],
      curve = r.path(path).attr({
        stroke: color || Raphael.getColor(),
        "stroke-width": 4,
        "stroke-linecap": "round"
      });
  }

  //die seile
  var firstCurve = curve(
    (nagel1[0] + (windOffset * 2)) + verschiebungX, ballonHohe + verschiebungY, (nagel1[0] + (windOffset * 1.5)) + verschiebungX, ballonHohe + 100 + verschiebungY, (nagel1[0] + windOffset) + verschiebungX, 650 + verschiebungY,
    nagel1[0] + verschiebungX, nagel1[1] + verschiebungY,
    "hsb(0, 0, 0)");

  var secondCurve = curve(
    (nagel2[0] + (windOffset * 2)) + verschiebungX, ballonHohe + verschiebungY, (nagel2[0] + (windOffset * 1.5)) + verschiebungX, ballonHohe + 100 + verschiebungY, (nagel2[0] + windOffset) + verschiebungX, 650 + verschiebungY,
    nagel2[0] + verschiebungX, nagel2[1] + verschiebungY,
    "hsb(0, 0, 0)");

  var thirdCurve = curve(
    (nagel3[0] + (windOffset * 2)) + verschiebungX, ballonHohe + verschiebungY, (nagel3[0] + (windOffset * 1.5)) + verschiebungX, ballonHohe + 100 + verschiebungY, (nagel3[0] + windOffset) + verschiebungX, 650 + verschiebungY,
    nagel3[0] + verschiebungX, nagel3[1] + verschiebungY,
    "hsb(0, 0, 0)");

  //die bälle
  r.ball(nagel1[0] + (windOffset * 2) + verschiebungX, (ballonHohe - 115) + verschiebungY, 100, Math.random());

  r.ball(nagel2[0] + (windOffset * 2) + verschiebungX, (ballonHohe - 115) + verschiebungY, 100, Math.random());

  r.ball(nagel3[0] + (windOffset * 2) + verschiebungX, (ballonHohe - 115) + verschiebungY, 100, Math.random());


  //die nägel auf die fäden hämmern
  var nagel1 = r.image("img/nagel.png", nagel1[0] - 25, nagel1[1] - 10 + verschiebungY, 50, 50);
  nagel1.attr({
    "clip-rect": "0,0, 100% , 100%"
  });

  var nagel2 = r.image("img/nagel.png", nagel2[0] - 25, nagel2[1] - 10 + verschiebungY, 50, 50);
  nagel2.attr({
    "clip-rect": "0,0, 100% , 100%"
  });

  var nagel3 = r.image("img/nagel.png", nagel3[0] - 25, nagel3[1] - 10 + verschiebungY, 50, 50);
  nagel3.attr({
    "clip-rect": "0,0, 100% , 100%"
  });


  var test = r.ellipse(50, 50, 40, 20);

  r.ball(50, 40, 20, Math.random());

};

在XNA或Processing中,您有一个Update()draw()函数,在Java中您有一个repaint()功能,但拉斐尔的作品却并非如此。我在 api 中读到了有关 .animate() 函数的信息,但由于我想动态操作气球(和绳索),我不认为这是正确的方法(证明我错了)。

我的问题是如何重新加载场景或至少更新它......

编辑: 我还尝试使用对象创建变量并在函数中调用它们的创建,然后更改参数并重复,但这似乎也不起作用。在这种情况下,对象毕竟没有被创建。

最佳答案

这是一个想法。我认为解决方案部分取决于您希望运动的外观。一旦您更改任何属性(或动画/变换),SVG 和 Raphael 就会更新,因此通常您不必担心屏幕更新。 (如果您需要更复杂的运动/动画,您可能需要使用更复杂的代码和计时)。

我已将这两个元素放入另一个集合中,并对它们应用动画变换。我添加了一个“缓动”功能来尝试在末尾放慢动画速度,使其看起来更平滑。

代码的主要更改是......

var ball = r.ball(100 + (windOffset * 2), 
 (250 - 115), 100, Math.random()); //the height of rope top - radius

var set = r.set(ball, firstCurve);

set.animate({ 'transform':  "t" + windOffset +",-100" }, 2000, "<>", function() {
    set.animate({ "transform" : "t0,-200" }, 2000, "<>" )} );

正在工作 jsfiddle... http://jsfiddle.net/5BgDe/29/

动画使用变换字符串,例如“t100,200”会将元素移动 100,200(或坐标系,如果您还不知道的话,我会快速阅读变换,这样它们才有意义一点)。

我组合了 2 个动画,只是作为一个示例来展示如果您想要相继应用 2 个方向,如何组合它们。如果有帮助的话,这里还有一个动画文档的链接http://raphaeljs.com/reference.html#Element.animate

关于javascript - 更新 Raphael.js 中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21076405/

相关文章:

javascript - JustGage 中的自定义颜色无法正常工作

javascript - 如何创建两个元素的集合: Raphael

javascript - $(this).find(..) 替代方案

javascript - 带有 ES2016 加载配置模块的 AngularJS

javascript - 在 jQuery .each 循环中比较字符串

javascript - 如何使用 Raphaeljs 和 jQuery 切换 svg 属性

具有可变内容的javascript正则表达式

javascript - 更改正则表达式以仅接受指定字符?

javascript - 如何获取一组 Raphael 对象的 BBox 宽度和高度?

raphael - 如果较旧的浏览器不支持 SVG,raphael.js 如何与它们一起工作?