- 浏览: 122147 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
zhouhaiyang88:
huang-tao 写道你好,在吗?请问,我启动Tomcat时 ...
ActiveMq-JMS简单实例使用tomcat -
xurichusheng:
huang-tao 写道你好,在吗?请问,我启动Tomcat时 ...
ActiveMq-JMS简单实例使用tomcat -
wgcooo:
javax.naming.NameNotFoundExcept ...
ActiveMq-JMS简单实例使用tomcat -
huang-tao:
你好,在吗?请问,我启动Tomcat时报如下错,是什么原因?= ...
ActiveMq-JMS简单实例使用tomcat -
Eric.Yan:
好文章,明天试一试
ActiveMq-JMS简单实例使用tomcat
之前我们所做的动画都是基于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];
发表评论
-
Flash/Flex学习笔记(50):矩阵变换
2011-04-24 13:52 1164先回顾一下Silvelright中的矩阵变换[转]WPF中的M ... -
Flash/Flex学习笔记(49):背面剔除与 3D 灯光
2011-04-24 13:50 974今天继续:上一回Flash/Flex学习笔记(50):3D线条 ... -
Flash/Flex学习笔记(48):迷你滚动条ScrollBar
2011-04-24 13:46 1064先看最终效果: 整个swf最终不到4k, ... -
Flash/Flex学习笔记(47):利用FMS快速创建一个文本聊天室
2011-04-24 13:45 995先来看客户端fla的构成: 第一帧:登录界面 第一帧的 ... -
Flash/Flex学习笔记(46):使用TweenLite
2011-04-24 13:43 1676TweenLite是第三方出品的专用于各种缓动动画的类库,其性 ... -
Flash/Flex学习笔记(45):3维旋转与透视变换(PerspectiveProjection)
2011-04-24 13:41 1211Flash/Flex学习笔记:3D基础 里已经介绍了3D透 ... -
Flash/Flex学习笔记(44):3D线条与填充
2011-04-24 13:39 10993D线条:把上一篇中的3D坐标旋转示例稍做修改,用线把各个 ... -
Flash/Flex学习笔记(42):反向运动学(下)
2011-04-24 13:30 917先要复习一下三角函数与余弦定理: 对于直角三角形,三边长 ... -
Flash/Flex学习笔记(41):反向运动学(上)
2011-04-24 13:29 940先回顾上篇所说的"正向运动学":以人行 ... -
Flash/Flex学习笔记(40):正向运动学
2011-04-24 13:27 883所谓"正向运动学"通俗点讲就是把几个连接部 ... -
Flash/Flex学习笔记(39):万有引力与粒子系统
2011-04-24 13:26 724万有引用公式: 其中G为万有引力常数 var numP ... -
Flash/Flex学习笔记(38):动量守恒与能量守恒
2011-04-24 13:24 942动能公式: 动量公式: 动量守恒: 能量守恒: ... -
Flash/Flex学习笔记(37):坐标旋转
2011-04-24 13:23 1020坐标旋转是个啥概念呢? 如上图,(蓝色)小球 绕某一 ... -
Flash/Flex学习笔记(36):碰撞检测
2011-04-24 13:22 606碰撞检测基本上可能分为二类:对象与对象的碰撞检测、对象与点 ... -
Flash/Flex学习笔记(35):弹性运动续--弹簧
2011-04-24 13:21 768上一篇里演示的弹性运动加上摩擦力因素后,物体最终基本上都会比较 ... -
Flash/Flex学习笔记(34):弹性运动
2011-04-24 13:20 773动画中的弹性运动 从视觉效果上接近 物理经典力学中的单摆运 ... -
Flash/Flex学习笔记(33):缓动动画
2011-04-24 13:18 998缓动 与 匀变速 看上去很类似,但其实有区别: 匀变速的 ... -
Flash/Flex学习笔记(32):不用系统组件(纯AS3)的视频播放器--只有8.82K
2011-04-24 13:17 1271以前为了赶项目,利用系统组件制作过一款视频播放器(见Fla ... -
Flash/Flex学习笔记(31):自己动手实现一个滑块控件(JimmySilder)
2011-04-24 13:15 967先看最终的演示: 滑块条的应用实在太广泛了:mp3播放器中声 ... -
Flash/Flex学习笔记(30):如何正确监听Stage对象的事件
2011-04-24 13:13 1295如果想在一个自定义类中注册对stage对象的监听事件,然后在另 ...
相关推荐
flex/Flash开发系列书籍:基于FLASH的WEB3D应用研究
附件是关于 Flash/Flex 几个重要框架 Cairngorm、Mate、PureMVC以及Swiz 的典型例子,由 Tony Hillerson 提供 Homepage: http://insideria.com
在IT行业中,Flash/Flex是一种基于ActionScript编程语言和Adobe Flex框架的开发工具,用于创建交互式的、富媒体的Web应用程序。"Flash/Flex画曲线,绘图板"这个主题涉及的是如何使用这些技术来创建一个允许用户自由...
xmlns:s="library://ns.adobe.com/flex/spark" applicationStyleSheet="@Embed('path/to/your/styles.css')"> ... </s:Application> ``` 然后在`styles.css`中定义样式,如: ```css .myTextStyle { color: #FF...
语言: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更改日志...
这篇教程主要介绍如何使用Flare3D在Flash/Flex环境中...通过这个教程,开发者可以学习到如何利用Flare3D将2D Flash游戏扩展到3D空间,并掌握3D纹理、模型、动画和交互的基本操作,为进一步开发更复杂的3D游戏奠定基础。
**FDT - 一款强大的Flash/Flex开发工具集** FDT(Flash Development Tool)是一款专为Adobe Flash和Flex开发者设计的集成开发环境(IDE),它基于Eclipse平台,提供了高效、专业的开发工具和服务。FDT的出现极大地...
在IT行业中,Flash/Flex是一种广泛使用的开发工具,主要用于创建交互式、富媒体的Web应用程序。Flex是基于ActionScript和MXML的开放源代码框架,它允许开发者构建可自定义的用户界面,而Flash则是其背后的动画和...
FLEX 安装方法 集成到 eclipse 中 ...* 汉化 FLEX 尤其是 FLEX/AIR 方面的中文资料 * 原创的关于 FLEX 的博客:http://liguoliang.com/ * Adobe 公司 FLEX 主页:http://www.adobe.com/cn/products/flex/
Flex Builder(现已被Adobe Flash Builder取代)是一个集成开发环境,提供了代码提示、调试和项目管理等功能,使得开发更加高效。 3. **Flex组件库**:Flex提供了丰富的预定义组件,如Button、Label、Canvas等,可...
标题“Flex:登录”指的是使用Adobe Flex技术实现用户登录功能的一种方法。Flex是Adobe公司推出的一款基于ActionScript的开源框架,主要用于...压缩包中的"Flex Login"可能包含示例代码或项目结构,供读者学习和参考。
在这个“RTMP直播例子--基于FLASH/FLEX(含源代码) 下载”中,我们可以深入探讨RTMP直播的基本原理、FLEX编程以及如何在实际项目中应用这些技术。 首先,RTMP协议的工作原理是通过建立一个持久性的TCP连接,允许...
《Flex/Flash 3D基础解析——以Figure为例》 在数字媒体和互联网技术日新月异的今天,3D图形技术已经广泛应用于各种在线应用和游戏开发中。Adobe Flex和Flash作为强大的富互联网应用程序(RIA)开发工具,自然也...
《FLEX学习笔记》 FLEX,全称为Flex Builder,是由Adobe公司开发的一款基于MXML和ActionScript的开源框架,用于构建富互联网应用程序(RIA)。它允许开发者创建具有交互性、响应性和丰富用户体验的Web应用。FLEX的...
在《潮汕IT男》网站的文章《解决flash/flex/as3 访问中文域名时的流错误》中,作者陈林生提供了详细的步骤和代码示例,帮助开发者理解和解决这个问题。文章地址是:[http://chenlinsheng.com/?p=990]...
本压缩包“Flex学习笔记.rar”显然是一份针对初学者的教程资料,旨在帮助新接触Flex的开发者快速上手。 在“FlexBeginner.pdf”这份文档中,你可以期待找到以下关键知识点: 1. **Flex概述**:介绍Flex技术的基本...
Flex开源项目介绍 Flex是一种用于构建富互联网应用程序(RIA)的开源框架,它基于ActionScript 3(AS3)编程语言和MXML标记语言。这些开源项目为开发者提供了丰富的组件库、工具和框架,帮助他们扩展Flex的功能,...
总共有4个例子: 1.http://127.0.0.1:8080/flexDemo/HelloWorld/HelloWorld.html ...如果你的数据库配置和我的不一样,请修改flexDemo\WEB-INF\classes\下的DBSetting.properties文件,数据库建表的sql语句是user.sql
本篇文章将对 Flex 开发系列书籍:WebGIS 开发实战进行详细的知识点总结,涵盖 Flex 概述、RIA 概述、Flex 开发基础、Flex 开发实践、Flex 与 WebGIS 开发框架、基于 Flex 的 WebGIS 基础开发、基于 Flex 的 WebGIS ...