2013-03-09 120 views
0

因此,我试图用变量创建一个无限循环,就像乒乓球一样,你击球并且它会一次又一次地返回,左,右,左,右。它可以工作,但每次都会保持越来越快,我知道为什么。你可能会在代码中找到原因,但每次我设置新的时间间隔时,我都无法清除它,因为它没有分配给变量。无论如何,我想要的每次都是一样的速度,没有越来越快,有没有办法解决这个问题,或者如果有的话,你能否提出一个替代方案?谢谢!变量是否可以是间隔(as3)?

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); 
    } 
} 
+0

虽然使用多个setIntervals和多个enterFrame处理程序是一个不错的主意,但它在计算上却过于夸张。一般来说,在进行程序化动画时,您需要使用一个as3 Timer对象来创建一个绘图循环,并在那里执行所有逻辑。 100毫秒是一个体面的时间间隔开始。与其将每个动画主题的绘图逻辑封装在侦听器函数中,您将获得更多的牵引力,封装类中的逻辑并更新绘图循环中该类(或类)的实例。 – 2013-03-10 01:43:22

回答

0

该代码并没有多少意义!另外2个frameHandlers总是一个坏主意。为什么不用布尔值检查和设置方向!?
是这样的:(不testet) 这个片段asumes你有实例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; 

} 
0

这不是一个坏主意,为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; 
    } 
} 
相关问题