旋转车轮并停在画架中的特定点

时间:2018-09-13 13:21:08

标签: javascript createjs easeljs

我是EaselJs的新手。 我正在旋转一个9x数字和3(0x)的轮子,总共12个数字。我可以通过调用函数来旋转轮子,但是我想在轮子的预定义特定点/编号上停止它。

var _oContainer;

this._init = function(iXPos,iYPos){
    _oWheel = s_oSpriteLibrary.getSprite("wheel_circle");
    _oContainer = new createjs.Container;
    _oContainer.x = CANVAS_WIDTH - 200;
    _oContainer.y = CANVAS_HEIGHT - 350;
    s_oStage.addChild(_oContainer);
    img = createBitmap(_oWheel);
    img.regX = _oWheel.width / 2;
    img.regY = _oWheel.height / 2;
    _oContainer.addChild(img);
}

this.spin = function(b, a){
    //var h = new createjs.Bitmap(s_oSpriteLibrary.getSprite('wheel_circle'));
    createjs.Tween.get(_oContainer).to({
        rotation: _oContainer.rotation + a
    }, 2600, createjs.Ease.quartOut).call(function() {
        _oContainer.rotation %= 360;
    })
}

每次单击按钮时,我都将旋转函数称为this.spin(5, 1131.7511808994204);

现在,它在旋转,并在每次单击按钮时随机停止。如何将其停在车轮上的特定数字/位置?

我应该在rotation:中赋予什么价值?

1 个答案:

答案 0 :(得分:0)

要做这样的事情有很多因素。我做了一个快速演示,演示了如何做:

  1. 用线段绘制轮子(在中间)。重要的是要知道您有多少个细分受众群,以便您可以选择“结束”的地点
  2. 开始旋转。只需增加每个刻度的旋转速度即可,具体取决于您希望旋转的速度。
  3. “停下来”时,您必须做数学运算才能确定着陆地点
  4. 要获得逼真的“减速”,请确保补间中的剩余旋转足够,以免加速或减速太快

这是小提琴:https://jsfiddle.net/lannymcnie/ych1qt8u/1/

// Choose an end number. In this case, its just a number between 0 and the number of segments.
var num = Math.random() * segments | 0,

    // How many degrees is one segment? 
    // In my demo I use radians for `angle`, so I have to convert to degrees
    angleR = angle * 180/Math.PI,

    // Take the current rotation, add 360 to it to take it a bit further
    // Note that my demo rotates backwards, so I subtract instead of add.
    adjusted = c.rotation - 360,

    // Determine how many rotations the wheel has already gone since it might spin for a while
    // Then add the new angle to it (num*angleR)
    // Then add a half-segment to center it.
    numRotations = Math.ceil(adjusted/360)*360 - num*angleR - angleR/2;

然后我将补间动画切换到新位置。您可以尽情享受游戏的时长,轻松获得喜欢的东西。

createjs.Tween.get(c)
    .to({rotation:numRotations}, 3000, createjs.Ease.cubicOut);

从技术上讲,我应该根据实际剩余的旋转来更改持续时间,因为根据结果,它可能不是非常平滑。这个距离足够近了,所以我将其保持不变。

希望有帮助!让我知道是否可以进一步澄清。