工程家园's Archiver

紫色流星 发表于 2005-10-15 18:31

[原创]Flash三维向量类的应用讲座(1)

以前讲了如何用面向对象的方法来实现在Flash中建立一个三维的向量类,这一次讲一个例子,来说明这个类在实际中的应用。

其实这个例子用不到太复杂的方法,只是简单的应用了向量的加法和和二维向量的转化。

紫色流星 发表于 2005-10-15 18:32

所以,使用模拟空间的雪花下落来实现这个例子。


[swf]http://ilovelassie.tengyi.cn/flash/direct/3Dsnow.swf[/swf]

[[i] Last edited by 紫色流星 on 2005-10-15 at 18:45 [/i]]

风中落叶 发表于 2005-10-15 18:34

以开始讲了
赶快搬个凳子过来听:)

紫色流星 发表于 2005-10-15 18:38

首先,建立一个电影剪辑。画一个白色的实心圆,半径4.5,圆心0,0

并且连接导出为snow

效果如下:

紫色流星 发表于 2005-10-15 18:44

然后在第一帧输入如下代码:

引用我们编写的三维类,设置舞台不缩放。

[code]#include "Vector3D.as"
Stage.scaleMode = "noScale";[/code]

紫色流星 发表于 2005-10-15 19:12

再设置一些基本变量:

d是观察距离
a是存储雪花的数组
i是循环变量
q是雪花数量
w是雪花在空间的空间限制,不超过正负q/2
speed 就是雪花移动的速度,可以由鼠标滚轮控制

[code]var d:Number = new Number(2000);
var a:Array = new Array();
var i:Number = new Number(0);
var q:Number = new Number(200);
var w:Number = new Number(q/2);
var speed:Number = new Number(150);[/code]

紫色流星 发表于 2005-10-15 19:12

建立一个雪花的类

[code]// Snow类的构造函数
_global.Snow = function(x, y, z, n) {
        this.scale = random(80)+20;
        this.pos = new v3d(x, y, z);
        this.mc = _root.attachMovie("snow", "snow"+n, n);
};[/code]

紫色流星 发表于 2005-10-15 19:14

一个雪花的方法

[code]// 刷新位置
Snow.prototype.update = function(d) {
        var b = (this.pos.x+d)/20;
        var v2 = this.pos.v3dtov2d(d);
        this.mc.setXY(v2, true);
        with (this.mc) {
                _xscale = _yscale=(b+20+this.scale)/3;
        }
};[/code]

紫色流星 发表于 2005-10-15 19:22

对影片的初始化:

[code]_root.onLoad = function() {
        for (var i = 0; i<25; i++) {
                a[i] = new Snow(random(4000)-2000, random(q)-w, random(q)-w, i);
                a[i].update(d);
        }
                //复制25个雪花到数组,并且位置随机
        mym = new Object();
        mym.onMouseWheel = function(delta) {
                if (speed<50) {
                        speed = 50;
                } else if (speed>500) {
                        speed = 500;
                } else {
                        _root.speed += delta*5;
                }
        };
        Mouse.addListener(mym);
                //建立一个监听鼠标滚轮事件的监听器。
};[/code]

紫色流星 发表于 2005-10-15 19:29

影片的数据处理数据

[code]_root.onEnterFrame = function() {
        for (var i = 0; i<25; i++) {
                with (a[i].pos) {
                        x += speed;
                        y += (_root._xmouse-200)/50;
                        z -= (_root._ymouse-200)/50;
                }
                                //雪花的移动跟随鼠标偏移
                if (a[i].pos.x>d-200) {
                        a[i] = new Snow(-2000, random(q)-w, random(q)-w, i);
                }
                                //如果雪花超出范围则重新刷新位置
                a[i].update(d);
                               //雪花的位置更新
        }
        _root.sp = "Speed="+speed;
                这个是在舞台上建立一个文本框来显示即时速度
};[/code]

紫色流星 发表于 2005-10-15 19:31

基本上把所有代码复制到Flash里面就可以了,执行速度还是很快的。

下次发一些稍微复杂点的应用。

风中落叶 发表于 2005-10-16 11:27

期待ing………………………………:P

紫色流星 发表于 2005-10-16 19:48

[quote]Originally posted by [i]风中落叶[/i] at 2005-10-16 11:27:
期待ing………………………………:P [/quote]
有没有做出来啊?

风中落叶 发表于 2005-10-16 20:30

[quote]Originally posted by [i]紫色流星[/i] at 2005-10-16 07:48 PM:

有没有做出来啊? [/quote]
做是做了
正在研究那些代码呢:P

紫色流星 发表于 2005-10-17 14:10

[quote]Originally posted by [i]风中落叶[/i] at 2005-10-16 20:30:

做是做了
正在研究那些代码呢:P [/quote]
有疑问的话我尽可能解答:P

风中落叶 发表于 2005-10-17 14:17

[quote]Originally posted by [i]紫色流星[/i] at 2005-10-17 02:10 PM:

有疑问的话我尽可能解答:P [/quote]
一定会的
谢谢先:P:handshake

戈薇 发表于 2005-10-17 19:33

我也来学习。。。。。

好东西~~~~~`

紫色流星 发表于 2005-10-18 09:41

呵呵~还得谢谢楼上两位的支持

戈薇 发表于 2005-10-21 21:59

8客气~期待新的讲座

紫色流星 发表于 2005-10-21 22:29

[quote]Originally posted by [i]戈薇[/i] at 2005-10-21 21:59:
8客气~期待新的讲座 [/quote]
这几天忙着编写俄罗斯方块呢,过几天在传新作吧

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.