Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Papervision] InteractiveMovieMaterial (http://www.flasher.ru/forum/showthread.php?t=123738)

3Desian 09.04.2009 10:45

InteractiveMovieMaterial
 
Приветствую Вас.
Хочу реализовать в Papervision3D 2 плэйн с интерактивной текстурой, т.е. с мувиком сделанным во флэше.
Для этого объявляю в файле (далее ВНЕШНИЙ КОД) ComponentMaterialTest.as сцену, камеру, плэйн с этой текстурой... ну всё как полагается и в результате получается плэйн с MovieClip материалом:
Код AS3:

package
{
        import fl.core.UIComponent;
 
        import flash.display.DisplayObject;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageQuality;
        import flash.display.StageScaleMode;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Rectangle;
        import flash.utils.getDefinitionByName;
 
        import org.papervision3d.cameras.CameraType;
        import org.papervision3d.materials.MovieAssetMaterial;
        import org.papervision3d.materials.MovieMaterial;
        import org.papervision3d.objects.primitives.Plane;
        import org.papervision3d.view.BasicView;
        import org.papervision3d.view.stats.StatsView;
 
        public class ComponentMaterialTest extends Sprite
        {
                public var mc                                                        :MovieClip;
 
 
                public var view                                                        :BasicView = new BasicView(0,0, true, true, CameraType.FREE);
                public var plane                                                :Plane;
                public var mat                                                        :MovieAssetMaterial;
                public var movieMat                                                :MovieMaterial;
                public var movie                                                :Sprite;
                public var uiCounter                                        :Number = 0;
 
                public function ComponentMaterialTest()
                {
                        super();
                        addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
                }
 
                protected function init(e:Event):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        stage.quality = StageQuality.MEDIUM;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_RIGHT;
 
                        var RUSMAP:Class = getDefinitionByName("RUSSIA_MAP") as Class;
                        movie = new RUSMAP() as Sprite;
                        //movie.x = movie.y = -10000;
                        movie.x=movie.y=-1000;
 
                        parseComponents();
                        addChild(movie);
 
                        view.camera.zoom = 20;
                        view.camera.focus = 40;
 
                        addChild(view);
                        //addChild(new StatsView(view.renderer));
                        addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
 
 
                }
 
                protected function createPlane():void
                {
                        // Определяются размеры (границы) текстуры
                        movieMat = new MovieMaterial( movie, true, true, false, new Rectangle(0,0,1024,512) );
                        movieMat.oneSide = false;
                        movieMat.setQuality(StageQuality.HIGH, stage, true);
                        movieMat.interactive = true;
                        movieMat.smooth = true;
 
                        plane = new Plane(movieMat,1024,512,8,6);
                        view.scene.addChild(plane)
                }
 
                protected function loop(e:Event):void
                {
                        var sw:Number=(stage.width+movie.x)/2;
                        var sh:Number=(stage.height+movie.y)/2;
 
                        var angleX:Number=(mouseX-sw)/40;
                        plane.rotationY+=(angleX-plane.rotationY)*0.1;
 
                        var angleY:Number=(mouseY-sh)/40;
                        plane.rotationX+=(angleY-plane.rotationX)*0.1;               
 
                        //trace("sw="+sw);
                        view.singleRender();
                }               
 
                protected function handleComponentReady(e:Event):void
                {
                        var uiComponent:UIComponent = UIComponent(e.currentTarget);
                        uiComponent.removeEventListener(Event.ADDED_TO_STAGE, handleComponentReady);
                        uiCounter--;
                        if( uiCounter == 0 ) createPlane();
                }
 
                protected function parseComponents():void
                {
                        uiCounter = 0;
                        for( var i:int = 0; i<movie.numChildren; i++)
                        {
                                var mc:DisplayObject = DisplayObject(movie.getChildAt(i));
                                if( mc is UIComponent )
                                {
                                        mc.addEventListener(Event.ADDED_TO_STAGE, handleComponentReady, false, 0, true);
                                        uiCounter++;
                                }
                        }
                        trace(uiCounter);
                }
        }
}

Рядом с файлом лежит флэш файл класса ComponentMaterialTest в котором и создана текстура(MovieClip) класса RUSSIA_MAP лежит в библиотеке. Эта текстура представляет из себя подобие слайдшоу. Т.е. картинки и кнопочки для переключения между ними(картинками). Так вот функции для кнопочек описаны внутри текстуры и работают только в этом мувике. Картинки переключаются и я всё это вижу на плэйне, который эффектно вращается.
ТЕПЕРЬ СУТЬ ВОПРОСА:
Я захотел при клике на кнопку текстуры передать сигнал во внешний код (вызвать функцию из ВНЕШНЕГО КОДА). Например скрыть Плэйн и показать Куб. Как это реализовать?
Нашёл некоторые примеры в гугле и обнаружил что там используется некий класс InteractiveMovieMaterial. Вот код одного японца:
Код AS3:

package {
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        import org.papervision3d.cameras.Camera3D;
        import org.papervision3d.cameras.FreeCamera3D;
        import org.papervision3d.events.InteractiveScene3DEvent;
        import org.papervision3d.materials.ColorMaterial;
        import org.papervision3d.materials.InteractiveColorMaterial;
        import org.papervision3d.materials.InteractiveMovieMaterial;
        import org.papervision3d.materials.MaterialsList;
        import org.papervision3d.materials.MovieAssetMaterial;
        import org.papervision3d.materials.MovieMaterial;
        import org.papervision3d.objects.Cube;
        import org.papervision3d.objects.DisplayObject3D;
        import org.papervision3d.objects.Plane;
        import org.papervision3d.scenes.InteractiveScene3D;
        import org.papervision3d.scenes.Scene3D;
        import org.papervision3d.utils.InteractiveSceneManager;
        import org.papervision3d.utils.InteractiveSprite;
 
        [SWF(width="400", height="300", frameRate="30", backgroundColor="#000000")]
        public class PaperVisionTest1 extends Sprite
        {
                protected var container                                :Sprite;
                protected var scene                                    :InteractiveScene3D;
                protected var camera                                          :Camera3D;
                protected var ism                                                :InteractiveSceneManager;
                protected var plane                                                  :Plane;
                private var mycube:Cube;
 
                public function PaperVisionTest1():void
                {
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
 
                        init3D();
                        createPlane();
                        addEventListener(Event.ENTER_FRAME, loop);
                }
 
                protected function init3D():void {
                        container = new InteractiveSprite();
                        addChild(container);
                        container.name = "mainCont";
                        container.x = stage.stageWidth*.5;
                        container.y = stage.stageHeight*.5;
 
                        scene = new InteractiveScene3D(container);
                        ism = scene.interactiveSceneManager;
 
                        camera = new Camera3D();
                        camera.zoom = 3;
                        camera.focus = 100;
                }
 
                protected function createPlane():void {
                        var c:CubeMaterial = new CubeMaterial();
                        var c2:CubeMaterial = new CubeMaterial();
                        var c3:CubeMaterial = new CubeMaterial();
                        var material:MovieMaterial = new InteractiveMovieMaterial(c3, true, true);
                        material.animated = true;
                        material.smooth = true;
 
                var materials:MaterialsList = new MaterialsList(
                {
                        //all:
                        front:  new MovieMaterial(c, false, true),
                        back:  new MovieMaterial(c, false, true),
                        rightnew MovieMaterial(c2, false ,true),
                        leftnew InteractiveMovieMaterial(c, false, true),
                        top:    new MovieMaterial(c, false, true),
                        bottom: new MovieMaterial(c)
                } );
                        var mm:MovieMaterial = materials.getMaterialByName("right") as MovieMaterial;
                        mm.texture.gotoAndStop(6);
                        mm.doubleSided = true;
 
                        mycube = new Cube( materials);
                        scene.addChild(mycube);
                        mycube.x = -300;
 
                        plane = new Plane( material, 500, 500);
                        plane.x = 600;
                        plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, handleMainClick);
                        mycube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, handleMainClick2);
                        scene.addChild(plane);
                }
                protected function loop(event:Event):void {
                        camera.x = -(container.mouseX * 3)/2;
                        camera.y = (container.mouseY * 3);
                        scene.renderCamera(camera);
                }
                protected function handleMainClick(e:InteractiveScene3DEvent):void {
                        trace("mouse click from: ", e.currentTarget, e.displayObject3D, e.sprite, e.target);
                        var do3d:DisplayObject3D = e.target as DisplayObject3D;
                        var mm:MovieMaterial = e.target.material as MovieMaterial;
                        mm.texture.gotoAndStop(Math.floor(Math.random() * 6) + 1);
                }
                protected function handleMainClick2(e:InteractiveScene3DEvent):void {
                        trace("mouse click from: ", e.currentTarget, e.displayObject3D, e.sprite, e.target);
                }
        }
}

От куда у него этот:import org.papervision3d.materials.InteractiveMovieMaterial; ?
У меня Public Beta 2.0 - Great White December 3rd, 2008 и нет такого класса. Может кто то знает где его найти или какой то иной способ помочь мне решить задачу? Подскажите, люди добрые кто чем может :)

mre 09.04.2009 12:41

А что мешает из RUSSIA_MAP слать события и подписаться на них?
Кстати, так называют константы, а не классы.

Мечтатель 09.04.2009 13:37

От куда у него этот:import org.papervision3d.materials.InteractiveMovieMateri al; ?

Японец использует собственную (хотя я не знаю принадлежит ли ему papervision3d.org)библиотеку классов, что, кстати, очень удобно. Если бы у Вас была своя библиотека классов, то, соблюдая хороший тон программирования, Вы должны были бы дать ей имя:своё доменное имя в обратном порядке, общее описание пакета, что представляет из себя достаточно простую иерархию папок.

3Desian 09.04.2009 14:37

Цитата:

Сообщение от mre (Сообщение 812005)
А что мешает из RUSSIA_MAP слать события и подписаться на них?
Кстати, так называют константы, а не классы.

От это интересно. Я и хотел бы узнать как это сделать.
Т.е. мне нужно в кадре с кнопкой мувика RUSSIA_MAP написать некую функцию:
Код AS3:

public function OnPressBut (event:MouseEvent)
{
plane.z+=100;
}

а во внешнем коде что написать?

mre 09.04.2009 16:48

Не пишите код в кадрах.
Код AS3:

dispatchEvent(new Event("doSomething"));

У экземпляра слушайте событие:
Код AS3:

clip.addEventListener("doSomething", doSomethingHandler);


3Desian 09.04.2009 17:31

Эээ... в код кадра пишу:
Код AS3:

But.addEventListener(MouseEvent.MOUSE_UP, functionClick); // But - имя кнопки в ролике
function functionClick(event:MouseEvent):void
{
dispatchEvent(new Event("doSomething"));
}

А вот про второе не совсем понял... написал:
Код AS3:

protected function init(event:Event):void
                {
movie = new RUSSIA_MAP as MovieClip; // текстура класса  MovieClip с начинкой из флэшки(слайдшоу с кнопкой But)
movie.addEventListener("doSomething", MouseClickBut);
}
private function MouseClickBut(event:MouseEvent):void
                {
                        trace("MOUSE was clicked");
                        plane.x+=50// двигаем плэйн с этой самой текстурой
 
                }

И вот что пишет при клике: TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать flash.events::Event@21174be1 в flash.events.MouseEvent.

mre 09.04.2009 17:48

Код AS3:

private function MouseClickBut(event:Event):void


3Desian 09.04.2009 18:16

Теперь не ругается, а просто не реагирует :)

mre 09.04.2009 18:22

А при создании материала используется этот же экземпляр movie?

3Desian 09.04.2009 20:56

Материал:
Код AS3:

protected function init(e:Event):void
                {
 
                        var RUSMAP:Class = getDefinitionByName("RUSSIA_MAP") as Class;
                        movie = new RUSMAP() as Sprite;
 
                        parseComponents();
                        addChild(movie);
 
                }
 
 
protected function createPlane():void
                {
                        // Определяются размеры (границы) текстуры
                        movieMat = new MovieMaterial( movie, true, true, false, new Rectangle(0,0,1024,512) );
                        movieMat.oneSide = false;
                        movieMat.setQuality(StageQuality.HIGH, stage, true);
                        movieMat.interactive = true;
                        movieMat.smooth = true;
 
                        plane = new Plane(movieMat,1024,512,8,6);
                        view.scene.addChild(plane)
                }




Всё заработало. Я просто в кадре закомментировал подпись кнопки на событие .
Большущее спасибо уважаемому mre. :)


Часовой пояс GMT +4, время: 12:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.