package { import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; [SWF(backgroundColor=0x000000)] public class Trees2 extends Sprite { private var trees:Array; private var numTrees:uint=100; private var fl:Number=250; //消失点 private var vpX:Number=stage.stageWidth/2; private var vpY:Number=stage.stageHeight/2; private var floor:Number=50; //加速度 private var ax:Number=0; private var ay:Number=0; private var az:Number=0; //速度 private var vx:Number=0; private var vy:Number=0; private var vz:Number=0; //重力与摩擦力 private var gravity:Number=0.3; private var friction:Number=0.98; public function Trees2() { init(); } private function init():void { trees = new Array(); for (var i:uint = 0; i < numTrees; i++) { var tree:Tree = new Tree(); trees.push(tree); tree.xpos=Math.random()*2000-1000; tree.ypos=floor; tree.zpos=Math.random()*10000; addChild(tree); } addEventListener(Event.ENTER_FRAME, onEnterFrame); stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDownHandler); stage.addEventListener(KeyboardEvent.KEY_UP, KeyUpHandler); } private function onEnterFrame(event:Event):void { vx+=ax; vy+=ay; vz+=az; vy-=gravity;//负重力?哈,好好理解一下,这一行结合后面的y轴坐标检测,才保证了所有树在空格键松开时,能在y轴方向上恢复原状 for (var i:uint = 0; i < numTrees; i++) { var tree:Tree=trees[i]; move(tree); } vx*=friction; vy*=friction; vz*=friction; sortZ(); } //键盘按下时,处理加速度 private function KeyDownHandler(event:KeyboardEvent):void { switch (event.keyCode) { case Keyboard.UP : az=-1; break; case Keyboard.DOWN : az=1; break; case Keyboard.LEFT : ax=1; break; case Keyboard.RIGHT : ax=-1; break; case Keyboard.SPACE : ay=1; break; default : break; } } //按键抬起时,加速度置0 private function KeyUpHandler(event:KeyboardEvent):void { switch (event.keyCode) { case Keyboard.UP : case Keyboard.DOWN : az=0; break; case Keyboard.LEFT : case Keyboard.RIGHT : ax=0; break; case Keyboard.SPACE : ay=0; break; default : break; } } private function move(tree:Tree):void { tree.xpos+=vx; tree.ypos+=vy; tree.zpos+=vz; //y轴上的坐标判断,否则所有树将一直向上跑 if (tree.ypos10000-fl) { tree.zpos-=10000; } var scale:Number = fl / (fl + tree.zpos); tree.scaleX=tree.scaleY=scale; tree.x=vpX+tree.xpos*scale; tree.y=vpY+tree.ypos*scale; tree.alpha=scale*0.8 + 0.2; } //z轴排序 private function sortZ():void { trees.sortOn("zpos", Array.DESCENDING | Array.NUMERIC); for (var i:uint = 0; i < numTrees; i++) { var tree:Tree=trees[i]; setChildIndex(tree, i); } } } }