Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 09.04.2009, 10:45
3Desian вне форума Посмотреть профиль Отправить личное сообщение для 3Desian Найти все сообщения от 3Desian
  № 1  
Ответить с цитированием
3Desian
 
Аватар для 3Desian

Регистрация: Mar 2007
Сообщений: 142
Отправить сообщение для 3Desian с помощью ICQ
Tools 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),
			right:  new MovieMaterial(c2, false ,true),
			left:   new 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 и нет такого класса. Может кто то знает где его найти или какой то иной способ помочь мне решить задачу? Подскажите, люди добрые кто чем может

Старый 09.04.2009, 12:41
mre вне форума Посмотреть профиль Отправить личное сообщение для mre Посетить домашнюю страницу mre Найти все сообщения от mre
  № 2  
Ответить с цитированием
mre
 
Аватар для mre

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
А что мешает из RUSSIA_MAP слать события и подписаться на них?
Кстати, так называют константы, а не классы.
__________________
Griver

Старый 09.04.2009, 13:37
Мечтатель вне форума Посмотреть профиль Отправить личное сообщение для Мечтатель Найти все сообщения от Мечтатель
  № 3  
Ответить с цитированием
Мечтатель
 
Аватар для Мечтатель

Регистрация: Aug 2008
Адрес: 53 E
Сообщений: 60
От куда у него этот:import org.papervision3d.materials.InteractiveMovieMateri al; ?

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

Старый 09.04.2009, 14:37
3Desian вне форума Посмотреть профиль Отправить личное сообщение для 3Desian Найти все сообщения от 3Desian
  № 4  
Ответить с цитированием
3Desian
 
Аватар для 3Desian

Регистрация: Mar 2007
Сообщений: 142
Отправить сообщение для 3Desian с помощью ICQ
Цитата:
Сообщение от mre Посмотреть сообщение
А что мешает из RUSSIA_MAP слать события и подписаться на них?
Кстати, так называют константы, а не классы.
От это интересно. Я и хотел бы узнать как это сделать.
Т.е. мне нужно в кадре с кнопкой мувика RUSSIA_MAP написать некую функцию:
Код AS3:
public function OnPressBut (event:MouseEvent)
{
plane.z+=100;
}
а во внешнем коде что написать?

Старый 09.04.2009, 16:48
mre вне форума Посмотреть профиль Отправить личное сообщение для mre Посетить домашнюю страницу mre Найти все сообщения от mre
  № 5  
Ответить с цитированием
mre
 
Аватар для mre

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
Не пишите код в кадрах.
Код AS3:
dispatchEvent(new Event("doSomething"));
У экземпляра слушайте событие:
Код AS3:
clip.addEventListener("doSomething", doSomethingHandler);
__________________
Griver

Старый 09.04.2009, 17:31
3Desian вне форума Посмотреть профиль Отправить личное сообщение для 3Desian Найти все сообщения от 3Desian
  № 6  
Ответить с цитированием
3Desian
 
Аватар для 3Desian

Регистрация: Mar 2007
Сообщений: 142
Отправить сообщение для 3Desian с помощью ICQ
Эээ... в код кадра пишу:
Код 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.


Последний раз редактировалось 3Desian; 09.04.2009 в 17:35.
Старый 09.04.2009, 17:48
mre вне форума Посмотреть профиль Отправить личное сообщение для mre Посетить домашнюю страницу mre Найти все сообщения от mre
  № 7  
Ответить с цитированием
mre
 
Аватар для mre

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
Код AS3:
private function MouseClickBut(event:Event):void
__________________
Griver

Старый 09.04.2009, 18:16
3Desian вне форума Посмотреть профиль Отправить личное сообщение для 3Desian Найти все сообщения от 3Desian
  № 8  
Ответить с цитированием
3Desian
 
Аватар для 3Desian

Регистрация: Mar 2007
Сообщений: 142
Отправить сообщение для 3Desian с помощью ICQ
Теперь не ругается, а просто не реагирует

Старый 09.04.2009, 18:22
mre вне форума Посмотреть профиль Отправить личное сообщение для mre Посетить домашнюю страницу mre Найти все сообщения от mre
  № 9  
Ответить с цитированием
mre
 
Аватар для mre

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
А при создании материала используется этот же экземпляр movie?
__________________
Griver

Старый 09.04.2009, 20:56
3Desian вне форума Посмотреть профиль Отправить личное сообщение для 3Desian Найти все сообщения от 3Desian
  № 10  
Ответить с цитированием
3Desian
 
Аватар для 3Desian

Регистрация: Mar 2007
Сообщений: 142
Отправить сообщение для 3Desian с помощью ICQ
Материал:
Код 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.


Последний раз редактировалось 3Desian; 10.04.2009 в 10:30.
Создать новую тему Ответ Часовой пояс GMT +4, время: 12:25.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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