如何慢慢上下移动项目?

时间:2014-04-04 16:56:36

标签: actionscript-3 flash actionscript boolean

我需要做一件简单的事情,通过点击按钮1次,慢慢地将item1向上移动100 px并向下移动100 px。我试过这个,但是item1立即增加50px并立即减少50px,我需要让它变慢。

        var moving:Boolean = false;
            if(!moving){
                item1.y -= 50;
                moving = true;
            }
            else {
                item1.y += 50;
                moving = false;
            }

4 个答案:

答案 0 :(得分:0)

您可以设置最大移动值,如50,然后将Y上的item1移动1,并将该最大值减1.当最大值达到0时,该项目达到命运。

if(!moving){
    item1.y-=1;
    maxValue--;
    if(maxValue==0){
        //reached final position
    }
}

答案 1 :(得分:0)

使用Timer对象。在你的类中声明该对象。然后,当单击按钮时,将对象设置为Timer的新实例,该实例将非常快速地运行并进行多次迭代,向新Timer添加事件侦听器,并在事件中侦听器,将更小的增量或减量应用于item1.y。例如:

private var m_tmr:Timer;

private function buttonClickHandler(pEvent:MouseEvent):void
{
    // This is the function that's called when the button's clicked.
    if (m_tmr == null)
    {
        m_tmr = new Timer(200, 0);
        m_tmr.addEventListener(TimerEvent.TIMER, onTimer);
        m_tmr.start();
    }
}

private function onTimer(pEvent:TimerEvent):void
{
    // The first several times this function is called (should be around every
    // 200 milliseconds), increment item1.y by 1 or 2 or something else small.
    // After the first many times, start decrementing item1.y by the same amount.
    // Then call m_tmr.removeEventListener(TimerEvent.TIMER, onTimer);
}

答案 2 :(得分:0)

每次增量移动后,您必须告诉Flash重新绘制屏幕。一个很好的方法是使用ENTER_FRAME循环:

 var moving:Boolean = false;

 const initY = item1.y;        // your starting y value
 const limitY = initY - 100;   // your move will end here


 if(!moving){
 moving = true;

 addEventListener(Event.ENTER_FRAME,moveit)
    function moveit(e)
     { 
        item1.y -=1
        if (item1.y < limitY)
          removeEventListener(Event.ENTER_FRAME,moveit)
     }

一旦你到达了你想去的地方,你必须removeEventListener(...),否则循环会继续,并且会占用内存和性能。

<强>更新

所以,要点击鼠标,你就可以这样做:

 var moving:Boolean = false;

 const initY = item1.y;        // your starting y value
 const limitY = initY - 100;   // your move will end here

 stage.addEventListener(MouseEvent.CLICK, moveUp)

 function moveUp(e)
 {
  stage.removeEventListener(MouseEvent.CLICK, moveUp)

  if(!moving){
  moving = true;

  addEventListener(Event.ENTER_FRAME,moveit)
    function moveit(e)
     { 
        item1.y -=1;
        if (item1.y < limitY)
         {
          removeEventListener(Event.ENTER_FRAME,moveit);
          item1.y = limitY;
          moving = false;
         }
     }
  }

当您使用stage方法通过鼠标单击注册侦听器功能时,您可能只想定位按钮,而不是定位addEventListener。 要返回到开始位置,请将相同的想法应用于另一个按钮或另一个MouseEvent。例如,你可以向上移动MOUSE_DOWN并向下移动MOUSE_UP。

在侦听器函数中可以执行更复杂的操作(在本例中为移动函数)。您可以将“缓动”应用于动作的开始和结束,以使动作看起来更自然。但是,你必须阅读 - 这个答案已经太久了!

答案 3 :(得分:0)

我想参与这个对话。没有If语句的我的对象移动版本。运动基于三角函数:

var objectToAnimate:Shape = new Shape();
objectToAnimate.graphics.beginFill(0x009900);
objectToAnimate.graphics.drawCircle(0, 0, 20);
addChild(objectToAnimate);

//Place it somewhere
objectToAnimate.x = objectToAnimate.y = 200;

//Config for movement
var step:Number = 1; //really slow... 1° per frame
var maxOffsetY:Number = -100; //Move object maximum on 100px top
var cursor:Number = -90;
var position: Number = objectToAnimate.y; // catch current position

var timer:Timer = new Timer(30, 180);
timer.addEventListener(TimerEvent.TIMER, updateAnimation);
timer.start();

function updateAnimation(e:TimerEvent):void {
    objectToAnimate.y = position + Math.cos(cursor * Math.PI / 180) * maxOffsetY;
    cursor += step;
}