变量是否可以是间隔(as3)?
问题描述:
因此,我试图用变量创建一个无限循环,就像乒乓球一样,你击球并且它会一次又一次地返回,左,右,左,右。它可以工作,但每次都会保持越来越快,我知道为什么。你可能会在代码中找到原因,但每次我设置新的时间间隔时,我都无法清除它,因为它没有分配给变量。无论如何,我想要的每次都是一样的速度,没有越来越快,有没有办法解决这个问题,或者如果有的话,你能否提出一个替代方案?谢谢!变量是否可以是间隔(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);
}
}
答
该代码并没有多少意义!另外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;
}
答
这不是一个坏主意,为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;
}
}
虽然使用多个setIntervals和多个enterFrame处理程序是一个不错的主意,但它在计算上却过于夸张。一般来说,在进行程序化动画时,您需要使用一个as3 Timer对象来创建一个绘图循环,并在那里执行所有逻辑。 100毫秒是一个体面的时间间隔开始。与其将每个动画主题的绘图逻辑封装在侦听器函数中,您将获得更多的牵引力,封装类中的逻辑并更新绘图循环中该类(或类)的实例。 – 2013-03-10 01:43:22