Нажмите и перетащите через рамки AS3 - PullRequest
0 голосов
/ 15 марта 2011

У меня покадровая анимация.Я хочу иметь возможность щелкать и перетаскивать сцену взад-вперед и проходить через анимацию.Т.е. я хочу щелкнуть и перетащить слева направо, чтобы анимация двигалась вперед, а справа налево - анимацию назад.

Как бы мне этого добиться?

Я делаюПредположение, что в вычислении положения мыши и перемещении к правильному кадру будут присутствовать некоторые математические вычисления, но как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 15 марта 2011

Вот вы (отредактированная версия)

import flash.events.MouseEvent;
import flash.display.MovieClip;
import flash.display.Sprite;

var clickedMouseX:int;
var clickedFrame:uint;
var backgroundClip:Sprite = getChildByName("background") as Sprite;
var clip:MovieClip = getChildByName("animation") as MovieClip;
clip.stop();
clip.mouseEnabled = false;

backgroundClip.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
backgroundClip.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);


function onMouseDown(event:MouseEvent):void
{
    backgroundClip.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
    clickedMouseX = backgroundClip.mouseX;
    clickedFrame = clip.currentFrame;
}

function onMouseUp(event:MouseEvent):void
{
    backgroundClip.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}

function onMouseMove(event:MouseEvent):void
{   
    var delta:int = backgroundClip.mouseX - clickedMouseX;
    var wantedFrame:uint = (clickedFrame + delta * clip.totalFrames / backgroundClip.width) % clip.totalFrames;
    while (wantedFrame < 1)
    {       
        wantedFrame += clip.totalFrames;
    }
    clip.gotoAndStop(wantedFrame);
}

Ура! * * 1004

0 голосов
/ 16 марта 2011

Это должно быть вопросом отображения длины области перетаскивания на длину временной шкалы:

stage.addEventListener(MouseEvent.MOUSE_MOVE, updateAnimation);
function updateAnimation(event:MouseEvent):void {
    animation.gotoAndStop(Math.floor(mouseX/stage.stageWidth * animation.totalFrames));
}

Вот прокомментированная версия:

stage.addEventListener(MouseEvent.MOUSE_MOVE, updateAnimation);
function updateAnimation(event:MouseEvent):void {
    //take the ratio between the mouse position and stage width -> //a number from 0.0 to 1.0
    var mouseRatio:Number = mouseX/stage.stageWidth; 
    //'scale'/multiply that number to fit the animation frames  -> from a maximum of 1.0 to animation's total frames
    //also, we 'round down' because we need an integer for the frame number, not a fractional number
    var frame:int = Math.floor(mouseRatio * animation.totalFrames);
    animation.gotoAndStop(frame);
}

Кроме того, MOUSE_MOVE не запускается несколько кадров в секунду. Вы можете обновить на ENTER_FRAME и, так как вы упомянули перетаскивание, у вас также может быть переменная для отслеживания нажатия или отпускания мыши:

var mousePressed:Boolean;
stage.addEventListener(MouseEvent.MOUSE_DOWN, togglePressed);
stage.addEventListener(MouseEvent.MOUSE_UP, togglePressed);
stage.addEventListener(Event.ENTER_FRAME, update);

function togglePressed(event:MouseEvent):void {
    mousePressed = event.type == MouseEvent.MOUSE_DOWN;
}
function update(event:Event):void {
    if(mousePressed) animation.gotoAndStop(Math.floor(mouseX/stage.stageWidth * animation.totalFrames));
}

НТН

...