`
madfroghe
  • 浏览: 122147 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Flash/Flex学习笔记(43):3D基础

阅读更多

之前我们所做的动画都是基于x,y二维坐标轴的,在三维动画中我们还需要增加一个垂直于屏幕“向里”或“向外”的Z轴,那么z轴到底是应该向外,还是向里呢?这个其实无所谓,不过为了统一,习惯上通常把z轴约定为向里,即所谓的“右手坐标系”

右手坐标系的得名:伸出右手,让食指、中指、大拇指相互垂直;然后 食指指向x轴正向,中指指向y轴正向,则大拇指所指方向即为z轴正向。(事实上这个姿势酷似周杰伦周董的招牌动作)

三维透视的基本规则:

物体在Z轴上的坐标越大(越远),则看起来越小(将上图坐标系旋转,把z轴转到x轴方向后,得到下图),如果距离足够远,则物体将消失于屏幕上的某个特定点(通常称为“消失点”)

技术上的主要处理:动态调整物体的scaleX与scaleY(同时因为物体的大小改变后,相应的x,y坐标值通常也会改变,所以x,y坐标也要做相应调整以符合透视规则),基本公式如下:

scale = fl/(fl+z)

 
var ball:Ball = new Ball();


addChild(ball);

 

//观察点 相对于 消失点的坐标

 
var xPos:Number=0;

 
var yPos:Number=0;

 
var zPos:Number=0;

 
var fl:Number=250;//焦距

 
//消失点

 
var vpX:Number=stage.stageWidth/2;

 
var vpY:Number=stage.stageHeight/2;

 
addEventListener(Event.ENTER_FRAME, EnterFrameHandler);

 
stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDownHandler);

 
stage.addEventListener(MouseEvent.MOUSE_WHEEL,MouseWheelHandler);

 
//鼠标滚轮事件(注:必须让stage获取焦点时-即用鼠标在动画上点击一下,该事件才会触发,另外还要注意:嵌入网页时,浏览器也会响应鼠标滚轮)

 
function MouseWheelHandler(e:MouseEvent):void {

 
zPos += (e.delta*5);

 
}

 
function EnterFrameHandler(event:Event):void {


if (zPos> -fl) {

 
ball.visible=true;

 
xPos=mouseX-vpX;


yPos=mouseY-vpY;


var scale:Number = fl / (fl + zPos);


ball.scaleX=ball.scaleY=scale;

 
ball.x=vpX+xPos*scale;

 
ball.y=vpY+yPos*scale;

 
} else {

 
ball.visible=false;

 
}

 
//辅助线

graphics.clear();

 
graphics.lineStyle(1,0xcccccc);

 
graphics.moveTo(vpX,vpY);   

 
graphics.lineTo(vpX,ball.y);

 
graphics.moveTo(vpX,vpY);


graphics.lineTo(ball.x,vpY);

 

graphics.lineStyle(1,0x0000ff,0.5);


graphics.moveTo(vpX,vpY);

 
graphics.lineTo(ball.x,ball.y);

 
graphics.lineStyle(1,0xff0000,0.5);

 
graphics.moveTo(ball.x,ball.y);

 
graphics.lineTo(mouseX,mouseY); 

 
}


//键盘事件

 
function KeyDownHandler(e:KeyboardEvent):void {


if (e.keyCode==Keyboard.UP) {

 
zPos+=5;

 
} else if (e.keyCode == Keyboard.DOWN) {

 
zPos-=5;


}

 
}

这个示例中,"鼠标所在位置"充当了"观察点"(即前面示意图中的"人眼"位置),电脑屏幕所在平面即物体的成像面,用键盘上下键可调整小球在Z轴上的位置,然后移动鼠标位置,通过辅助线观察变化。

基本的3D运动:


package {

 
import flash.display.Sprite;

 
import flash.events.Event;

 
import flash.events.KeyboardEvent;

 
import flash.ui.Keyboard;

 
import flash.display.StageAlign;

 
import flash.display.StageScaleMode;

 
public class Velocity3D extends Sprite {

 
private var ball:Ball;

 
//相当于消失点的坐标

 
private var xpos:Number=0;


private var ypos:Number=0;


private var zpos:Number=0;

//x,y,z三轴上的速度分量

 
private var vx:Number=0;

 
private var vy:Number=0;

 
private var vz:Number=0;


private var friction:Number=0.98;

 
private var fl:Number=250;

 
//消失点


private var vpX:Number=stage.stageWidth/2;

private var vpY:Number=stage.stageHeight/2;


public function Velocity3D() {

 
init();

 
}

 
private function init():void {

 
stage.align = StageAlign.TOP_LEFT;  

 
stage.scaleMode = StageScaleMode.NO_SCALE;

 
ball = new Ball(20);


addChild(ball);


addEventListener(Event.ENTER_FRAME, EnterFrameHandler);

 

stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDownHandler);

 
}

 
private function EnterFrameHandler(event:Event):void {

 
vpX =stage.stageWidth/2;

 
vpY =stage.stageHeight/2;

 
xpos+=vx;


ypos+=vy;


zpos+=vz;

 
vx*=friction;

 
vy*=friction;

 
vz*=friction;

 
if (zpos>-fl) {

 
var scale:Number = fl / (fl + zpos);

 
ball.scaleX=ball.scaleY=scale;

 
ball.x=vpX+xpos*scale;

 
ball.y=vpY+ypos*scale;

 
ball.visible=true;

 
} else {


ball.visible=false;


}

 
//辅助线

graphics.clear();


graphics.lineStyle(1,0xefefef);

graphics.moveTo(0,stage.stageHeight/2);


graphics.lineTo(stage.stageWidth,stage.stageHeight/2);


graphics.lineTo(stage.stageWidth-15,stage.stageHeight/2-8);

 
graphics.moveTo(stage.stageWidth,stage.stageHeight/2);

 
graphics.lineTo(stage.stageWidth-15,stage.stageHeight/2+8);

 
graphics.moveTo(stage.stageWidth/2,0);

 
graphics.lineTo(stage.stageWidth/2,stage.stageHeight);

 
graphics.lineTo(stage.stageWidth/2-8,stage.stageHeight-15);

 
graphics.moveTo(stage.stageWidth/2,stage.stageHeight);

 
graphics.lineTo(stage.stageWidth/2+8,stage.stageHeight-15);


graphics.lineStyle(1,0xdadada);

 
graphics.moveTo(vpX,vpY);

graphics.lineTo(ball.x,ball.y);

 
}

 
private function KeyDownHandler(e:KeyboardEvent):void {


switch (e.keyCode) {

 
case Keyboard.UP :

vy-=1;

 
break;

 
case Keyboard.DOWN :


vy+=1;

 
break;

 
case Keyboard.LEFT :

 
vx-=1;

 
break;

 
case Keyboard.RIGHT :

 
vx+=1;


break;

 
case Keyboard.SHIFT :

 
vz+=0.5;

 
break;


case Keyboard.CONTROL :

 
vz-=0.5;

 
break;

 
default :


break;

 
}

 
}

}

 
}

上下左右键控制x,y轴方向速度,shift/ctrl键控制z轴速度(当然这个示例还没考虑到3D环境中的边界反弹,下面就要谈到这个问题)

3维运动反弹:

这个需要一点想象力,二维情况下,通常只要把舞台的四个边当作边界就足够了,但是试想一下:在一个立体的空间里,要限制一个物体的活动范围,得要有6个边界面(上,下,左,右,前,后)

package {

 
import flash.display.Sprite;


import flash.events.Event;


import flash.display.StageAlign;

 
import flash.display.StageScaleMode;


public class Bounce3D extends Sprite {

 
private var ball:Ball;

 
private var xpos:Number=0;

 
private var ypos:Number=0;

 
private var zpos:Number=0;

 
private var vx:Number=Math.random()*12-6;

 
private var vy:Number=Math.random()*12-6;

 
private var vz:Number=Math.random()*12-6;

 
private var fl:Number=250;

 
//消失点


private var vpX:Number=stage.stageWidth/2;

 
private var vpY:Number=stage.stageHeight/2;

 
//相对于消失点的六个边界面(上,下,左,右,前,后)

 
private var top:Number=-100;

 
private var bottom:Number=100;

 
private var left:Number=-100;


private var right:Number=100;

 
private var front:Number=100;

 
private var back:Number=-100;

 
public function Bounce3D() {

 
init();

 
}


private function init():void {

 
stage.align = StageAlign.TOP_LEFT;  


stage.scaleMode = StageScaleMode.NO_SCALE;

 
ball=new Ball(15);

 
addChild(ball);

 
addEventListener(Event.ENTER_FRAME, EnterFrameHandler);

 
}


private function EnterFrameHandler(event:Event):void {

 
vpX =stage.stageWidth/2;

 
vpY =stage.stageHeight/2


xpos+=vx;

 
ypos+=vy;

 
zpos+=vz;

 
var radius:Number=ball.radius;

 
//左右边界

 
if (xpos+radius>right) {

 
xpos=right-radius;

 
vx*=-1;

 
} else if (xpos - radius < left) {

 
xpos=left+radius;


vx*=-1;

 
}

 
//上下边界

if (ypos+radius>bottom) {                

 
ypos=bottom-radius;

vy*=-1;

 
} else if (ypos - radius < top) {

 
ypos=top+radius;

 
vy*=-1;

 
}


//前后边界


if (zpos+radius>front) {

 
zpos=front-radius;

 
vz*=-1;


} else if (zpos - radius < back) {

 
zpos=back+radius;

 
vz*=-1;


}

 
//换算成平面二维坐标及缩放比率

 
if (zpos>- fl) {


var scale:Number = fl / (fl + zpos);

 
ball.scaleX=ball.scaleY=scale;

 
ball.x=vpX+xpos*scale;

 
ball.y=vpY+ypos*scale;

 
ball.visible=true;


} else {

 
ball.visible=false;

 
}


//辅助线

 
graphics.clear();

 
graphics.lineStyle(1,0xccccff);


graphics.moveTo(0,stage.stageHeight/2);

 
graphics.lineTo(stage.stageWidth,stage.stageHeight/2);

 
graphics.lineTo(stage.stageWidth-15,stage.stageHeight/2-8);

 
graphics.moveTo(stage.stageWidth,stage.stageHeight/2);

 
graphics.lineTo(stage.stageWidth-15,stage.stageHeight/2+8);

 
graphics.moveTo(0,stage.stageHeight);

 
graphics.lineTo(stage.stageWidth,0);

 
graphics.lineTo(stage.stageWidth-15,2);

 
graphics.moveTo(stage.stageWidth,0);

 
graphics.lineTo(stage.stageWidth-6,13);

 
graphics.moveTo(stage.stageWidth/2,0);

 
graphics.lineTo(stage.stageWidth/2,stage.stageHeight);

 
graphics.lineTo(stage.stageWidth/2-8,stage.stageHeight-15);

 
graphics.moveTo(stage.stageWidth/2,stage.stageHeight);

 
graphics.lineTo(stage.stageWidth/2+8,stage.stageHeight-15);

graphics.lineStyle(1,0xffccff);

 
graphics.moveTo(vpX,vpY);

 
graphics.lineTo(ball.x,ball.y);

 
}

 
}

 
}

也许这样看得并不清楚,再加入更多的小球反弹,可能更容易理解一些,不过为了方便代码处理,先定义一个新的小球类:Ball3D

 
package {


import flash.display.Sprite;

 
public class Ball3D extends Sprite {


public var radius:Number;

 
private var color:uint;

 
public var xpos:Number=0;

 
public var ypos:Number=0;

 
public var zpos:Number=0;

 
public var vx:Number=0;

 
public var vy:Number=0;

 
public var vz:Number=0;


public var mass:Number=1;

 
public function Ball3D(radius:Number=40, color:uint=0xff0000) {


this.radius=radius;

 
this.color=color;

 
init();

}

 
public function init():void {

 
graphics.lineStyle(0);

 
graphics.beginFill(color);

 
graphics.drawCircle(0, 0, radius);

 
graphics.endFill();


}

 
}


}

多个小球的3D反弹:

package {

 
import flash.display.Sprite;

 
import flash.events.Event;

import flash.display.StageAlign;


import flash.display.StageScaleMode;

 
public class MultiBounce3D extends Sprite {

 
private var balls:Array;


private var numBalls:uint=20;

 
private var fl:Number=250;


private var vpX:Number=stage.stageWidth/2;

 
private var vpY:Number=stage.stageHeight/2;


private var top:Number=-120;

 
private var bottom:Number=120;

 
private var left:Number=-120;

 
private var right:Number=120;

 
private var front:Number=120;

 
private var back:Number=-120;

 
public function MultiBounce3D() {

 
init();


}

 
private function init():void {

 
stage.align = StageAlign.TOP_LEFT;  

 
stage.scaleMode = StageScaleMode.NO_SCALE;

 
balls = new Array();


for (var i:uint = 0; i < numBalls; i++) {

 
var ball:Ball3D=new Ball3D(15,Math.random()*0xffffff);

 
balls.push(ball);

 
ball.vx=Math.random()*10-5;


ball.vy=Math.random()*10-5;

 
ball.vz=Math.random()*10-5;

 
addChild(ball);

 
}


addEventListener(Event.ENTER_FRAME, onEnterFrame);

 
}


private function onEnterFrame(event:Event):void {

 
vpX =stage.stageWidth/2;

 
vpY =stage.stageHeight/2

 
graphics.clear();

 
for (var i:uint = 0; i < numBalls; i++) {

 
var ball:Ball3D=balls[i];               

 
move(ball);


}

 
}

 
private function move(ball:Ball3D):void {

 
var radius:Number=ball.radius;


ball.xpos+=ball.vx;

 
ball.ypos+=ball.vy;


ball.zpos+=ball.vz;

 
//6边界检测


if (ball.xpos+radius>right) {

 
ball.xpos=right-radius;

 
ball.vx*=-1;

 
} else if (ball.xpos - radius < left) {

 
ball.xpos=left+radius;

 
ball.vx*=-1;

}

 
if (ball.ypos+radius>bottom) {

 
ball.ypos=bottom-radius;

 
ball.vy*=-1;

 
} else if (ball.ypos - radius < top) {


ball.ypos=top+radius;

 
ball.vy*=-1;

 
}


if (ball.zpos+radius>front) {

 
ball.zpos=front-radius;

 
ball.vz*=-1;

 
} else if (ball.zpos - radius < back) {

 
ball.zpos=back+radius;

 
ball.vz*=-1;

 
}


//转换化2D坐标

 
if (ball.zpos>- fl) {

 
var scale:Number = fl / (fl + ball.zpos);

 
ball.scaleX=ball.scaleY=scale;

 
ball.x=vpX+ball.xpos*scale;

 
ball.y=vpY+ball.ypos*scale;

 
ball.visible=true;

 
} else {

 
ball.visible=false;

 
}

 
//辅助线           

 
graphics.lineStyle(1,0xccccff);


graphics.moveTo(0,stage.stageHeight/2);

 
graphics.lineTo(stage.stageWidth,stage.stageHeight/2);

 
graphics.lineTo(stage.stageWidth-15,stage.stageHeight/2-8);


graphics.moveTo(stage.stageWidth,stage.stageHeight/2);

 
graphics.lineTo(stage.stageWidth-15,stage.stageHeight/2+8);


graphics.moveTo(0,stage.stageHeight);


graphics.lineTo(stage.stageWidth,0);

 
graphics.lineTo(stage.stageWidth-15,2);

 
graphics.moveTo(stage.stageWidth,0);

 
graphics.lineTo(stage.stageWidth-6,13);


graphics.moveTo(stage.stageWidth/2,0);

 
graphics.lineTo(stage.stageWidth/2,stage.stageHeight);

 
graphics.lineTo(stage.stageWidth/2-8,stage.stageHeight-15);


graphics.moveTo(stage.stageWidth/2,stage.stageHeight);

 
graphics.lineTo(stage.stageWidth/2+8,stage.stageHeight-15);

 
graphics.lineStyle(1,0xff99ff);

 
graphics.moveTo(vpX,vpY);

 

graphics.lineTo(ball.x,ball.y);

 
}

 
}

}

仔细观察一下,相信不少人会发现问题:物体的前后顺序不对,远处的物体居然挡住了近处的物体。(css中可以通过z-Index来调整,silverlight的canvas中也有类似的zIndex,但在As3中如何做呢?)

先跑一下题,来看一个小技巧:Object 数组的排序

var arrTest = [{age:20,name:"a"},{age:50,name:"b"},{age:30,name:"c"}]

 
arrTest.sortOn("age",Array.DESCENDING);//按age值倒排

 
for(var i:int=0,j=arrTest.length;i<j;i++){

 
trace(arrTest[i].age ,arrTest[i].name);

 
}

是不是很好用!

ok,问题解决了:Flash的显示列表中,最后被addChild的物体总是显示在上面,在Flash内部"舞台上的每个物体"都对应一个索引值,随着物体不断被添加到舞台上,其对应的索引值也不断增加,我们可以通过调整索引值来改变物体的显示顺序.

基本测试:

 
var ballA = new Ball(50);

 
ballA.x = stage.stageWidth/2;

 

ballA.y = stage.stageHeight/2;


addChild(ballA);


var ballB = new Ball(45,0x0000ff);

 
ballB.x = ballA.x;

 
ballB.y = ballA.y + 20;

 
addChild(ballB);

 
btn1.addEventListener(MouseEvent.MOUSE_DOWN,btn1Click);

 
function btn1Click(e:MouseEvent):void{

 
setChildIndex(ballB,0);

 
setChildIndex(ballA,1);

 
}

 
btn2.addEventListener(MouseEvent.MOUSE_DOWN,btn2Click);

 

function btn2Click(e:MouseEvent):void{

 
setChildIndex(ballB,1);

 
setChildIndex(ballA,0);

 
}

调整后的3D反弹

 
package {

 
import flash.display.Sprite;

 
import flash.events.Event;

 
import flash.display.StageAlign;

 
import flash.display.StageScaleMode;

 
public class MultiBounce3D extends Sprite {

 
private var balls:Array;

 
private var numBalls:uint=20;


private var fl:Number=250;

 
private var vpX:Number=stage.stageWidth/2;

 
private var vpY:Number=stage.stageHeight/2;

 
private var top:Number=-120;

 
private var bottom:Number=120;

 
private var left:Number=-120;


private var right:Number=120;


private var front:Number=120;

 
private var back:Number=-120;


public function MultiBounce3D() {


init();

 
}

private function init():void {

 
stage.align=StageAlign.TOP_LEFT;

 
stage.scaleMode=StageScaleMode.NO_SCALE;

 
balls = new Array();


for (var i:uint = 0; i < numBalls; i++) {

 
var ball:Ball3D=new Ball3D(15,Math.random()*0xffffff);

 
balls.push(ball);

 
ball.vx=Math.random()*10-5;

 
ball.vy=Math.random()*10-5;

 
ball.vz=Math.random()*10-5;

 
addChild(ball);

 
}

 
addEventListener(Event.ENTER_FRAME, onEnterFrame);

 
}

 
private function onEnterFrame(event:Event):void {


vpX=stage.stageWidth/2;

 
vpY=stage.stageHeight/2;


graphics.clear();


for (var i:uint = 0; i < numBalls; i++) {

 
var ball:Ball3D=balls[i];

 
move(ball);

 
}


sortZ();


}

 
function sortZ():void {

 
balls.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);

 
for (var i:uint = 0; i < numBalls; i++) {

 
var ball:Ball3D=balls[i];

 
setChildIndex(ball, i);


}


}


private function move(ball:Ball3D):void {

 
var radius:Number=ball.radius;


ball.xpos+=ball.vx;


ball.ypos+=ball.vy;

 
ball.zpos+=ball.vz;

 
//6边界检测

 
if (ball.xpos+radius>right) {

 
ball.xpos=right-radius;

 
ball.vx*=-1;

 
} else if (ball.xpos - radius < left) {

 
ball.xpos=left+radius;

 
ball.vx*=-1;


}

 
if (ball.ypos+radius>bottom) {

 

ball.ypos=bottom-radius;


ball.vy*=-1;


} else if (ball.ypos - radius < top) {


ball.ypos=top+radius;

 
ball.vy*=-1;

 
}

 
if (ball.zpos+radius>front) {

 
ball.zpos=front-radius;

 
ball.vz*=-1;

 
} else if (ball.zpos - radius < back) {

 
ball.zpos=back+radius;

 
ball.vz*=-1;

 
}


//转换化2D坐标

if (ball.zpos>- fl) {

var scale:Number = fl / (fl + ball.zpos);

 
ball.scaleX=ball.scaleY=scale;

 
ball.x=vpX+ball.xpos*scale;

 
ball.y=vpY+ball.ypos*scale;

 
ball.visible=true;

 
} else {

 
ball.visible=false;


}

 
//辅助线

 
graphics.lineStyle(1,0xccccff);

 
graphics.moveTo(0,stage.stageHeight/2);


graphics.lineTo(stage.stageWidth,stage.stageHeight/2);

 
graphics.lineTo(stage.stageWidth-15,stage.stageHeight/2-8);

 
graphics.moveTo(stage.stageWidth,stage.stageHeight/2);

 
graphics.lineTo(stage.stageWidth-15,stage.stageHeight/2+8);

 
graphics.moveTo(0,stage.stageHeight);

 
graphics.lineTo(stage.stageWidth,0);

 
graphics.lineTo(stage.stageWidth-15,2);

 
graphics.moveTo(stage.stageWidth,0);

 
graphics.lineTo(stage.stageWidth-6,13);

 

graphics.moveTo(stage.stageWidth/2,0);

 
graphics.lineTo(stage.stageWidth/2,stage.stageHeight);

 
graphics.lineTo(stage.stageWidth/2-8,stage.stageHeight-15);


graphics.moveTo(stage.stageWidth/2,stage.stageHeight);

 
graphics.lineTo(stage.stageWidth/2+8,stage.stageHeight-15);


graphics.lineStyle(1,0xff99ff);

 
graphics.moveTo(vpX,vpY);


graphics.lineTo(ball.x,ball.y);

 
}

 
}

 
}

3D粒子喷射:


package {

import flash.display.Sprite;


import flash.events.Event;

import flash.display.StageAlign;

 
import flash.display.StageScaleMode;

 
//设置动画背景为黑色 


[SWF(backgroundColor=0x000000)]//c#中的特性? 哈


public class Fireworks extends Sprite {

 
private var balls:Array;

 
private var numBalls:uint=100;

 
private var fl:Number=250;

 
//消失点

 
private var vpX:Number=stage.stageWidth/2;

 
private var vpY:Number=stage.stageHeight/2;

 
private var gravity:Number=0.2;

 
private var floor:Number=50;//y轴反弹的边界(相对消失点而言)

 
private var bounce:Number=-0.6;

 
public function Fireworks() {

 
init();

 
}

 
private function init():void {

 
stage.scaleMode = StageScaleMode.NO_SCALE;

 
stage.align = StageAlign.TOP_LEFT;

 
balls = new Array();

 
for (var i:uint = 0; i < numBalls; i++) {

 
var ball:Ball3D=new Ball3D(5,Math.random()*0xffffff);

 

balls.push(ball);               

 
addChild(ball);


}

 
initVelocity();

 
addEventListener(Event.ENTER_FRAME, onEnterFrame);

 
}

 
private function initVelocity():void{

 
for (var i:uint = 0; i < numBalls; i++) {

 
var ball:Ball3D=balls[i];

 
reset(ball);

 
}           

 
}

 
private function reset(b:Ball3D):void{

 
b.ypos=-250;

 
b.zpos=200;     

 
b.xpos=0;

 
b.vx=(Math.random()*2-1)*3 //x轴方向速度为-3到+3的随机值(即:看起来有的球向左,有的球向右,在横向扩散)

 
b.vy=(Math.random()-1)*4; //y轴方向为-4到0之间的随机值(即向下掉)

 
b.vz=(Math.random()-1)*3//z轴方向速度为-3到0的随机值(即:所有球从远处向近处喷)

 
}

 
private function onEnterFrame(event:Event):void {           


for (var i:uint = 0; i < numBalls; i++) {

 
var ball:Ball3D=balls[i];

 
move(ball);

 
}

 
sortZ();

 
}


private function move(ball:Ball3D):void {

ball.vy+=gravity;

 
ball.xpos+=ball.vx;

 
ball.ypos+=ball.vy;


ball.zpos+=ball.vz;

 
if (ball.ypos>floor) {

 
ball.ypos=floor;

 
ball.vy*=bounce;


}

 
if (ball.zpos>-fl) {

 
var scale:Number = fl / (fl + ball.zpos);

 
ball.scaleX=ball.scaleY=scale;

 
ball.x=vpX+ball.xpos*scale;

 
ball.y=vpY+ball.ypos*scale;

 
ball.alpha = scale;//越远的物体,越淡

 
if (ball.x<0 || ball.x>stage.stageWidth || ball.y>stage.stageHeight || ball.alpha<0.05){

 
reset(ball);

 
}

 
ball.visible=true;


} else {

 
ball.visible=false;

 
reset(ball);

 
}


}

 
private function sortZ():void {

 
balls.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);

 
for (var i:uint = 0; i < numBalls; i++) {

 
var ball:Ball3D=balls[i];

 

分享到:
评论

相关推荐

    flex/Flash开发系列书籍:WEB3D应用研究

    flex/Flash开发系列书籍:基于FLASH的WEB3D应用研究

    Flash/Flex 框架应用 Cairngorm、Mate、PureMVC以及Swiz 的典型例子

    附件是关于 Flash/Flex 几个重要框架 Cairngorm、Mate、PureMVC以及Swiz 的典型例子,由 Tony Hillerson 提供 Homepage: http://insideria.com

    flash/flex画曲线,绘图板

    在IT行业中,Flash/Flex是一种基于ActionScript编程语言和Adobe Flex框架的开发工具,用于创建交互式的、富媒体的Web应用程序。"Flash/Flex画曲线,绘图板"这个主题涉及的是如何使用这些技术来创建一个允许用户自由...

    [Flash/Flex] 使用css定义文本样式

    xmlns:s="library://ns.adobe.com/flex/spark" applicationStyleSheet="@Embed('path/to/your/styles.css')"&gt; ... &lt;/s:Application&gt; ``` 然后在`styles.css`中定义样式,如: ```css .myTextStyle { color: #FF...

    RE/flex lexical analyzer generator:以正则表达式为中心的快速词法分析器生成器,用于C ++-开源

    语言:C ++许可证:BSD-3代码质量:A + https://lgtm.com/projects/g/Genivia/RE-flex/context:cpp文档:https://www.genivia.com/doc/reflex/html /index.html存储库:https://github.com/Genivia/RE-flex更改日志...

    [转] [Flash/Flex] 使用Flare3D来实现Flash 3D的推箱子游戏原型---纹理

    这篇教程主要介绍如何使用Flare3D在Flash/Flex环境中...通过这个教程,开发者可以学习到如何利用Flare3D将2D Flash游戏扩展到3D空间,并掌握3D纹理、模型、动画和交互的基本操作,为进一步开发更复杂的3D游戏奠定基础。

    FDT-flash/flex devtoolkit for eclipse.

    **FDT - 一款强大的Flash/Flex开发工具集** FDT(Flash Development Tool)是一款专为Adobe Flash和Flex开发者设计的集成开发环境(IDE),它基于Eclipse平台,提供了高效、专业的开发工具和服务。FDT的出现极大地...

    flash/flex 的aqua皮肤

    在IT行业中,Flash/Flex是一种广泛使用的开发工具,主要用于创建交互式、富媒体的Web应用程序。Flex是基于ActionScript和MXML的开放源代码框架,它允许开发者构建可自定义的用户界面,而Flash则是其背后的动画和...

    FLEX安装方法 集成到eclipse中

    FLEX 安装方法 集成到 eclipse 中 ...* 汉化 FLEX 尤其是 FLEX/AIR 方面的中文资料 * 原创的关于 FLEX 的博客:http://liguoliang.com/ * Adobe 公司 FLEX 主页:http://www.adobe.com/cn/products/flex/

    flex学习笔记 flex学习总结 flex学习教程

    Flex Builder(现已被Adobe Flash Builder取代)是一个集成开发环境,提供了代码提示、调试和项目管理等功能,使得开发更加高效。 3. **Flex组件库**:Flex提供了丰富的预定义组件,如Button、Label、Canvas等,可...

    Flex:登录

    标题“Flex:登录”指的是使用Adobe Flex技术实现用户登录功能的一种方法。Flex是Adobe公司推出的一款基于ActionScript的开源框架,主要用于...压缩包中的"Flex Login"可能包含示例代码或项目结构,供读者学习和参考。

    RTMP直播例子--基于FLASH/FLEX(含源代码) 下载

    在这个“RTMP直播例子--基于FLASH/FLEX(含源代码) 下载”中,我们可以深入探讨RTMP直播的基本原理、FLEX编程以及如何在实际项目中应用这些技术。 首先,RTMP协议的工作原理是通过建立一个持久性的TCP连接,允许...

    flex/flash 3d基础1

    《Flex/Flash 3D基础解析——以Figure为例》 在数字媒体和互联网技术日新月异的今天,3D图形技术已经广泛应用于各种在线应用和游戏开发中。Adobe Flex和Flash作为强大的富互联网应用程序(RIA)开发工具,自然也...

    FLEX学习笔记

    《FLEX学习笔记》 FLEX,全称为Flex Builder,是由Adobe公司开发的一款基于MXML和ActionScript的开源框架,用于构建富互联网应用程序(RIA)。它允许开发者创建具有交互性、响应性和丰富用户体验的Web应用。FLEX的...

    解决flash/flex/as3 访问中文域名时的流错误示例

    在《潮汕IT男》网站的文章《解决flash/flex/as3 访问中文域名时的流错误》中,作者陈林生提供了详细的步骤和代码示例,帮助开发者理解和解决这个问题。文章地址是:[http://chenlinsheng.com/?p=990]...

    Flex学习笔记.rar

    本压缩包“Flex学习笔记.rar”显然是一份针对初学者的教程资料,旨在帮助新接触Flex的开发者快速上手。 在“FlexBeginner.pdf”这份文档中,你可以期待找到以下关键知识点: 1. **Flex概述**:介绍Flex技术的基本...

    flex开源项目介绍.doc

    Flex开源项目介绍 Flex是一种用于构建富互联网应用程序(RIA)的开源框架,它基于ActionScript 3(AS3)编程语言和MXML标记语言。这些开源项目为开发者提供了丰富的组件库、工具和框架,帮助他们扩展Flex的功能,...

    4个简单的Flex例子(包含custom-class-mapping)共享

    总共有4个例子: 1.http://127.0.0.1:8080/flexDemo/HelloWorld/HelloWorld.html ...如果你的数据库配置和我的不一样,请修改flexDemo\WEB-INF\classes\下的DBSetting.properties文件,数据库建表的sql语句是user.sql

    flex开发系列书籍:WebGIS开发实战

    本篇文章将对 Flex 开发系列书籍:WebGIS 开发实战进行详细的知识点总结,涵盖 Flex 概述、RIA 概述、Flex 开发基础、Flex 开发实践、Flex 与 WebGIS 开发框架、基于 Flex 的 WebGIS 基础开发、基于 Flex 的 WebGIS ...

Global site tag (gtag.js) - Google Analytics