2013-06-26 52 views
0

我试图转换为starfirld效果AS3一个不错的AS2脚本,但我仍然得到奇怪的错误 真的很感激,如果任何人能帮助我理解我在做什么错 原来这里是AS2代码:错误而AS2星空代码转换为AS3

var stars = 100; 
var maxSpeed = 16; 
var minSpeed = 2; 
var i = 0; 
while (i < stars) 
{ 
    var mc = this.attachMovie("star", "star" + i, i); 
    mc._x = random(Stage.width); 
    mc._y = random(Stage.height); 
    mc.speed = random(maxSpeed - minSpeed) + minSpeed; 
    var size = random(2) + 6.000000E-001 * random(4); 
    mc._width = size; 
    mc._height = size; 
    ++i; 
} // end while 
this.onEnterFrame = function() 
{ 
    for (var _loc3 = 0; _loc3 < stars; ++_loc3) 
    { 
     var _loc2 = this["star" + _loc3]; 
     if (_loc2._y > 0) 
     { 
      _loc2._y = _loc2._y - _loc2.speed; 
      continue; 
     } // end if 
     _loc2._y = Stage.height; 
     _loc2.speed = random(maxSpeed - minSpeed) + minSpeed; 
     _loc2._x = random(Stage.width); 
    } // end of for 
}; 

,这里是我的AS3版本:

import flash.events.Event; 
import flash.events.MouseEvent; 

function starField():void 
{ 
    var stars:int = 100; 
    var maxSpeed:int = 16; 
    var minSpeed:int = 2; 
    var i:int = 0; 
    while (i < stars) 
    { 
     var mc = new Star(); 
     addChild(mc) 
     mc._x = Math.random()(stage.stageWidth); 
     mc._y = Math.random()(stage.stageHeight); 
     mc.speed = Math.random()(maxSpeed - minSpeed) + minSpeed; 
     var size = Math.random()(2) + 6.000000E-001 * Math.random()(4); 
     mc._width = size; 
     mc._height = size; 
     ++i; 
    } // end while 
} 

addEventListener(Event.ENTER_FRAME, update); 
function update(_e:Event):void 
{ 
    for (var _loc3 = 0; _loc3 < 100; ++_loc3) 
    { 
     var _loc2 = this["star" + _loc3]; 
     if (_loc2._y > 0) 
     { 
      _loc2._y = _loc2._y - _loc2.speed; 
      continue; 
     } // end if 
     _loc2._y = stage.stageHeight; 
     _loc2.speed = Math.random()(maxSpeed - minSpeed) + minSpeed; 
     _loc2._x = Math.random()(stage.stageWidth); 
    } // end of for 
}; 

我收到错误消息是:“类型错误:错误#1010:一个术语是不确定的,没有属性。at _fla :: MainTimeline/update ()“ 我知道它有'更新'功能的问题,但我确定它指的是哪一个术语?

+0

什么生产线会给您带来问题?编译器应该告诉你行号。 – Pier

回答

0

我会在这里赌的果汁罐是你的问题:

var _loc2 = this["star" + _loc3]; 

把这些变成一个关联数组,并从那里访问它们。

+0

你可能是对的,我会考虑的,thanx! – user2496394

+0

请使用google actionscript 3编码标准,这样可以提高您的代码质量,使其更加清晰易读。 – Discipol

+0

@Discipol我敢肯定是通过反编译 –

0

@Discipol是正确的。 只是想添加一些注意事项: 您还可以使用显示列表的名称获取影片剪辑:

var _loc2:MovieClip = MovieClip(getChildByName("star" + _loc3)); 

你得无类型变量和你是靠影片剪辑作为一个动态类在运行时添加属性(如速度)。对于一个非常简单的项目的影响几乎察觉不到,但是从长远来看,更大的项目,它扩展雪碧,如果你不使用时间轴,并添加你需要的属性是值得的:

package { 

    import flash.display.Sprite; 
    import flash.events.Event; 


    public class Star extends Sprite { 

     private var speed:Number; 
     private var minSpeed:Number; 
     private var maxSpeed:Number; 

     public function Star(min:Number,max:Number) { 
      minSpeed = min; 
      maxSpeed = max; 
      var size = (Math.random()*2) + 1.82211880039 * (Math.random()*4); 
      width = size; 
      height = size; 
      this.addEventListener(Event.ADDED_TO_STAGE,reset); 
     } 
     private function reset(e:Event = null):void{ 
      speed = (Math.random() * (maxSpeed-minSpeed)) + minSpeed; 
      x = Math.random() * stage.stageWidth; 
      if(e != null) y = Math.random() * stage.stageHeight;//initialized from added to stage event 
      else   y = stage.stageHeight;//otherwise reset while updating 
     } 
     public function update():void{ 
      if (y > 0) y -= speed; 
      else  reset(); 
     } 
    } 

} 

,其余的代码将如此简单:

var stars:int = 100; 
var starClips:Vector.<Star> = new Vector.<Star>(stars,true);//a typed fixed vector is faster than a dynamically resizable untyped Array 
for(var i:int = 0 ; i < stars; i++) starClips[i] = addChild(new Star(16,2)) as Star; 

this.addEventListener(Event.ENTER_FRAME,updateStars); 
function updateStars(e:Event):void{ 
    for(var i:int = 0 ; i < stars; i++) starClips[i].update(); 
}