【问题标题】:Can variables be intervals (as3)?变量可以是区间(as3)吗?
【发布时间】:2013-03-09 19:34:23
【问题描述】:

所以,我正在尝试使用变量创建一个无限循环,例如在某种程度上乒乓球,你击球,它会一次又一次地向后,向左,向右,向左,向右。它有效,但每次它越来越快,我也知道为什么了想要每次都是相同的速度,而不是越来越快,有没有办法解决这个问题,或者如果可以,你能建议一个替代方案吗?谢谢!

import flash.events.Event;

var badbee1right:uint = setInterval (beebad1right, 100);
function beebad1right():void {
    beebad1.x+=15;
}

var badbee1left:uint = setInterval (beebad1left, 100);
clearInterval(badbee1left);
function beebad1left():void {
    beebad1.x-=15;
}

leftbadbeewall.addEventListener(Event.ENTER_FRAME, leftbadbeewallhit);
function leftbadbeewallhit(e:Event) {
    if(beebad1.hitTestObject(leftbadbeewall)) {
        beebad1.x+=7;
        clearInterval(badbee1left);
        clearInterval(badbee1right);

    }
}

rightbadbeewall.addEventListener(Event.ENTER_FRAME, rightbadbeewallhit);
function rightbadbeewallhit(e:Event) {
    if(beebad1.hitTestObject(rightbadbeewall)) {
        clearInterval(badbee1right);
        bee.x-=7;
        clearInterval(badbee1left);
    }
}

【问题讨论】:

  • 虽然使用多个 setIntervals 和多个 enterFrame 处理程序是个好主意,但它在计算上是多余的。一般来说,在进行程序动画时,您会希望使用单个 as3 Timer 对象来创建绘图循环,并在那里执行所有逻辑。 100 毫秒是一个不错的开始时间间隔。与其将每个动画主体的绘制逻辑封装在侦听器函数中,不如将逻辑封装在一个类中并在绘制循环中更新该类(或多个类)的实例,从而获得更大的吸引力。

标签: actionscript-3 intervals


【解决方案1】:

该代码没有多大意义! 2 frameHandlers 也总是一个坏主意。为什么不用布尔值检查并设置方向!?
像这样的东西:(不是testet) 这个 sn-p 假设您有实例 badbee1、leftbadbeewall 和 rightbadbeewall 在舞台上

var goingRight:Boolean = true;
var speed:uint = 15;
addEventListener(Event.ENTER_FRAME, enterFrame);

function enterFrame(e:Event):void{

    if(goingRight)
        badbee1.x += speed;
    else
        badbee1.x -= speed;

    if(beebad1.hitTestObject(leftbadbeewall))
        goingRight = true;

    if(beebad1.hitTestObject(rightbadbeewall))
        goingRight = false;

}

【讨论】:

    【解决方案2】:

    提前计划 y 轴运动和 x 轴运动并不是一个坏主意。通过从您的 enterframe 方法调用 moveBee() 来尝试下面的代码。您必须为 _beeBounds 使用自己的值。玩弄 _beeDelta,这是 badbee 每帧移动的量。如果您达到左/右限制,代码将执行相同的操作——它将 x 增量乘以 -1 并将蜜蜂发送到相反的方向。这同样适用于 y 值。如果不希望 y 轴运动,可以将 _beeDelta.y 设置为零。

    private var _beeBounds:Rectangle = new Rectangle(0,0,100,100);
    private var _beeDelta:Point = new Point(15,5);
    
    private function moveBee():void{
      badbee.x += _beeDelta.x;
      badbee.y += _beeDelta.y;
    
      if(badBee.x > _beeBounds.right || badbee.x < _beeBounds.left){
        _beeDelta.x *= -1;
        badbee.x += _beeDelta.x; //optional correction. prevents badbee from being out of bounds for a frame.
      }
      if(badBee.y > _beeBounds.top || badbee.y < _beeBounds.bottom){
        _beeDelta.y *= -1;
        badbee.y += _beeDelta.y;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多