Flash AS3.0教程:基本的PV3D程序结构

2016-01-29 12:14 1 1 收藏

Flash AS3.0教程:基本的PV3D程序结构,本例为Flash AS3.0系列教程,在上一课中我们了解了什么是Papervision 3D及在Flash中的安装,今天我们来学习基本的PV3D程序结构,希望能给朋友带来帮助~~

【 tulaoshi.com - Flash 】

本文由 中国 cao4811 原创,转载请保留此信息!

本系列Flash教程由中国Flash互助课堂专为Flash新手制作,更多教程和练习请点击这里,在这里有系列的教程、练习,并有老师对练习进行点评与指导,欢迎朋友们的光临! 

在学习中遇到问题请到 论坛 发贴交流!

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/flash/)

更多AS 3.0教程:http://www.jcwcn.com/portal-topic-topicid-2.html

本例为Flash AS3.0系列教程,在上一课中我们了解了什么是Papervision 3D及在Flash中的安装,今天我们来学习基本的PV3D程序结构,希望能给朋友带来帮助~~

首先,要有一个类,不管在Flash CS3中还是Flex Builder的ActionScript项目中,都要有一个类做为整个Flash程序的入口。

下面写一个主类,命名为Main,其实什么名都无所谓,但是要记得保持文件名和类名必须一致。另外主类一定要继承自Sprite类。

1. package {
2. import flash.display.Sprite;
3.

4. public class Main extends Sprite
5. {
6. public function Main()
7. {
8.

9. }
10. }
11. }

代码解释:Main()函数是Main类的构造函数,就是说当你执行new Main();时,Flash会调用这个函数,初始化Main类的对象(类的实例叫对象)。所以,Main()函数就是整个Flash的入口了,这里面的程序最先被执行,所以可以在这里面放一些初始化PV3D的代码。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/flash/)

下面是一步步初始化PV3D。

首先,PV3D的3D舞台需要一个容器,用来容纳整个3D舞台。这个容器至少是Sprite类型的,因为Sprite是AS3或者说Flash9里,显示对象的最小单位,这也是我们的主类一定要继承自Sprite的原因,因为它需要被显示。

现在定义一个容器变量_container,初始化它并把它加到主类的显示列表里。

package {
    import flash.display.Sprite;

    public class Main extends Sprite
    {
        private var _container :Sprite;

        public function Main()
        {
            // 创建3D舞台的容器
            _container = new Sprite();
            _container.x = 100;
            _container.y = 100;

            //将它显示出来
            addChild( _container );
        }
    }
}

有了容器,还需要一个3D舞台。

package {
    import flash.display.Sprite;

    import org.papervision3d.scenes.MovieScene3D;


    public class Main extends Sprite
    {
        private var _container :Sprite;
        private var _scene :MovieScene3D;

        public function Main()
        {
            // 创建3D舞台的容器
            _container = new Sprite();
            _container.x = 100;
            _container.y = 100;

            //将它显示出来
            addChild( _container );

            // 创建3D舞台
            _scene = new MovieScene3D( _container );
        }
    }
}

[next]

然后需要在舞台上放一个摄像头,他代表我们的眼睛,他能看到的就是你看到的。

package {
    import flash.display.Sprite;

    import org.papervision3d.scenes.MovieScene3D;
    import org.papervision3d.cameras.Camera3D;

    public class Main extends Sprite
    {
        private var _container :Sprite;
        private var _scene :MovieScene3D;
        private var _camera :Camera3D;

        public function Main()
        {
            // 创建3D舞台的容器
            _container = new Sprite();
            _container.x = 100;
            _container.y = 100;

            //将它显示出来
            addChild( _container );

            // 创建3D舞台
            _scene = new MovieScene3D( _container );

            // 创建摄像头
            _camera = new Camera3D();
            _camera.z = -500;
            _camera.zoom = 5;

            //把摄像头看到的显示出来
            _scene.renderCamera(_camera);
        }
    }
}

现在还需要有一个3D对象,把它显示出来才算成功 。PV3D的所有3D对象都是继承自displayObject3D,就像Flash里的 Sprite一样它是最小单位。如果学过面向对象编程,你就会知道父类型的变量可以引用子类型的对象。比如MovieClip是Sprite的子类,那下面的代码是成立的:

var temp:Sprite  = new MovieClip();

考虑到程序的通用性,显示对象使用displayObject3D类型,后面初始化时候你可以把它初始化成任意displayObject3D的子类型对象。

光一个3D显示对象还是不够的,它需要有个皮,你才能看到它.所以,还需要一个材质贴图(至少需要一个,如果是立方体,就需要六个面的贴图)。PV3D中所有材质贴图的基类是MaterialObject3D。

package {
    import flash.display.Sprite;

    import org.papervision3d.scenes.MovieScene3D;
    import org.papervision3d.cameras.Camera3D;

    import org.papervision3d.core.proto.MaterialObject3D;
    import org.papervision3d.objects.DisplayObject3D;

    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.objects.Sphere;

    public class Main extends Sprite
    {
        private var _container :Sprite;
        private var _scene :MovieScene3D;
        private var _camera :Camera3D;

        private var _material:MaterialObject3D;
        private var _displayObj:DisplayObject3D;

        public function Main()
        {
            // 创建3D舞台的容器
            _container = new Sprite();
            _container.x = 100;
            _container.y = 100;

            //将它显示出来
            addChild( _container );

            // 创建3D舞台
            _scene = new MovieScene3D( _container );

            // 创建摄像头
            _camera = new Camera3D();
            _camera.z = -500;
            _camera.zoom = 5;

            //黑色的线框材质
            _material = new WireframeMaterial(0x000000);

            //球
            _displayObj = new Sphere(_material,  80, 10, 10);

            //把显示对象添加到舞台
            _scene.addChild(_displayObj);

            //把摄像头看到的显示出来
            _scene.renderCamera(_camera);
        }
    }
}

运行起来你应该会看到一个球。


现在要让球动起来,PV3D主要是以帧为单位来控制变化,所以还需要一个方法可以控制到每一帧。AS3中我们只要注册一个 Event.ENTER_FRAME事件的监听程序就可以监听到每一帧开始的时刻。然后,我们可以在我们的监听函数里,做我们需要做的,比如计算,或者让显示对象移动旋转等。

而PV3D要求每次舞台发生变化时都要显式的调用舞台对象的renderCamera,重新绘制,否则内容始终是不重绘的。

[next]

下面是新的代码,注意:加了一句调用addEventListener的代码,和一个OnEnterFrame函数。

package {
    import flash.display.Sprite;

    import org.papervision3d.scenes.MovieScene3D;
    import org.papervision3d.cameras.Camera3D;

    import org.papervision3d.core.proto.MaterialObject3D;
    import org.papervision3d.objects.DisplayObject3D;

    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.objects.Sphere;
    import flash.events.Event;

    public class Main extends Sprite
    {
        private var _container :Sprite;
        private var _scene :MovieScene3D;
        private var _camera :Camera3D;

        private var _material:MaterialObject3D;
        private var _displayObj:DisplayObject3D;

        public function Main()
        {
            // 创建3D舞台的容器
            _container = new Sprite();
            _container.x = 100;
            _container.y = 100;

            //将它显示出来
            addChild( _container );

            // 创建3D舞台
            _scene = new MovieScene3D( _container );

            // 创建摄像头
            _camera = new Camera3D();
            _camera.z = -500;
            _camera.zoom = 5;

            //黑色的线框材质
            _material = new WireframeMaterial(0x000000);

            //球
            _displayObj = new Sphere(_material,  80, 10, 10);

            //把显示对象添加到舞台
            _scene.addChild(_displayObj);

            //把摄像头看到的显示出来
            _scene.renderCamera(_camera);

            this.addEventListener(Event.ENTER_FRAME, OnEnterFrame);
        }

        private function OnEnterFrame(event:Event):void{
            //以Y轴为轴旋转
            _displayObj.rotationY += 5;

            _scene.renderCamera(_camera);
        }
    }
}

现在运行程序就能看到旋转球了。


现在可以开始基本的材质贴图了。其实上面的程序就已用到了线框材质贴图。除了线框材质外,PV3D还支持颜色材质,位图材质等,所有这些材质贴图的类都在org.papervision3d.materials包里。

我们给上面的程序换上一个蓝色的材质贴图看看会是什么样。只要把new WireframeMaterial(0×000000);改成new ColorMaterial(0x0000FF);记得导入 org.papervision3d.materials.ColorMaterial;

再试试位图文件材质,把new ColorMaterial(0x0000FF);改成new BitmapFileMaterial(texture.jpg);这里的texture.jpg是贴图文件路径,需要根据你的需要设置,记得这个路径是url格式,不是文件系统路径。

效果演示:

与本文相关讨论请到这里与作者交流:http://bbs.jcwcn.com/viewthread.php?tid=249783

来源:https://www.tulaoshi.com/n/20160129/1485178.html

延伸阅读
AS3.0 含有多个类的AS3类文件 标准的AS3类文件是以".as"为结尾的纯文本文件。一个类文件可以包含一个或多个类定义,甚至可以直接写入一次性执行的语句。AS3中,在package花括号外,可以定义一个或多个Class,不可与文件同名。这些花括号外的类,称为当前类文件的包外类。只有当前类文件中的成员可以访问。 包外类的产生,每个.as...
标签: flash教程
早期版本的ActionScript代码可以写在帧、按钮、影片剪辑、as文件等位置,而Flash AS3.0代码的位置发生了重大的改变,只能写在帧及as文件中。  虽然Flash AS3.0支持把代码写在时间轴中,但在实际应用中,如果把很多的代码放在时间轴中,会导致代码很难管理。或者说,用类来组织大量的代码更为合适,因为类代码都是放在as文件中的。 ...
标签: flash教程
本文由 中国 cao4811 原创,转载请保留此信息! 本系列Flash教程由中国Flash互助课堂专为Flash新手制作,更多教程和练习请 点击这里 ,在这里有系列的教程、练习,并有老师对练习进行点评与指导,欢迎朋友们的光临!  在学习中遇到问题请到 论坛 发贴交流! 创建MovieClip类的实例 影片剪辑实例就是MovieClip类的对象或实例,下...
标签: flash教程
本文由 中国 cao4811 原创,转载请保留此信息! 本系列Flash教程由中国Flash互助课堂专为Flash新手制作,更多教程和练习请 点击这里 ,在这里有系列的教程、练习,并有老师对练习进行点评与指导,欢迎朋友们的光临!  在学习中遇到问题请到 论坛 发贴交流! 创建Bitmap类的实例 Bitmap类与位图操作有关,一般来说,Bitmap...
标签: flash教程
 AS3.0 含有多个类的AS3类文件 标准的AS3类文件是以".as"为结尾的纯文本文件。一个类文件可以包含一个或多个类定义,甚至可以直接写入一次性执行的语句。AS3中,在package花括号外,可以定义一个或多个Class,不可与文件同名。这些花括号外的类,称为当前类文件的包外类。只有当前类文件中的成员可以访问。 包外类的产生...

经验教程

213

收藏

84
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部