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

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

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

Регистрация: May 2006
Сообщений: 52
Attention Sandy 3D, Не могу справиться с MovieMaterial

Пытаюсь сделать простую вещь, изменить один из примеров с оф. сайта Sandy 3D поставив вместо битмап-текстур свои мувиклипы:
Код AS3:
package
{
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.display.StageDisplayState;
	import flash.events.*;
	import flash.net.URLRequest;
	import flash.ui.*;
	import flash.utils.getTimer;
 
    import sandy.core.Scene3D;
    import sandy.core.data.*;
	import sandy.core.scenegraph.*;
	import sandy.events.*;
	import sandy.materials.*;
    import sandy.materials.attributes.*;
	import sandy.primitive.*;
	import sandy.util.*;
	import sandy.view.*;
 
 
	public class index extends BasicView
	{
		public function index():void
		{
			super();
			init( 800, 600 );
			camera.setPosition( 0, 0, 0 );
			camera.fov = 60;
			planeNames = [ "side2" , "side3", "side4", "side5", "side0", "side1" ];
			loadSideMovies();
		}
 
		private var shape:SkyBox;
		private var planeNames:Array;
		private var polygons:Array;
		private var textures:Array;	
		private var running:Boolean = false;
		private var keyPressed:Array = new Array();
		private var queue:LoaderQueue = new LoaderQueue();
 
 
		public function __onKeyDown(e:KeyboardEvent):void
		{
            keyPressed[e.keyCode] = true;
            if( e.keyCode == Keyboard.SPACE )
            	stage.displayState = StageDisplayState.FULL_SCREEN;
        }
 
        public function __onKeyUp(e:KeyboardEvent):void
        {
           keyPressed[e.keyCode] = false;
        }
 
		private function clickHandler( p_oEvt:Event ):void
		{
			if( p_oEvt.type == MouseEvent.MOUSE_DOWN )
			{
				lastPanAngle = panangle;
				lastTiltAngle = tiltangle;
				lastMouseX = stage.mouseX;
				lastMouseY = stage.mouseY;
				running = true;
			}
			else
			{
				running = false;
			}
		}
 
		//  -- 
		private function loadSideMovies():void
		{
			queue = new LoaderQueue();
	        queue.add( "side0", new URLRequest("superbox/side0.swf") );
	        queue.add( "side1", new URLRequest("superbox/side1.swf") ); 
			queue.add( "side2", new URLRequest("superbox/side2.swf") );
			queue.add( "side3", new URLRequest("superbox/side3.swf") );
			queue.add( "side4", new URLRequest("superbox/side4.swf") );
			queue.add( "side6", new URLRequest("superbox/side5.swf") );
	        queue.addEventListener(SandyEvent.QUEUE_COMPLETE, loadComplete );
	        queue.start();
		}
 
			var SideMat0:MovieMaterial = new MovieMaterial( queue.data["side0"],40 );
			var SideMat1:MovieMaterial = new MovieMaterial( queue.data["side1"],40 );
			var SideMat2:MovieMaterial = new MovieMaterial( queue.data["side2"],40 );
			var SideMat3:MovieMaterial = new MovieMaterial( queue.data["side3"],40 );
			var SideMat4:MovieMaterial = new MovieMaterial( queue.data["side4"],40 );
			var SideMat5:MovieMaterial = new MovieMaterial( queue.data["side5"],40 );
 
 
 
		private function loadComplete( event:QueueEvent ):void 
		{			
 
			createScene();
			// --
			shape.front.appearance = new Appearance(SideMat0);
			shape.back.appearance = new Appearance(SideMat1);
			shape.left.appearance = new Appearance(SideMat2);
			shape.right.appearance = new Appearance(SideMat3);
			shape.top.appearance = new Appearance(SideMat4);
			shape.bottom.appearance = new Appearance(SideMat5);				
			// --
			shape.front.enableClipping = true;
			shape.back.enableClipping = true;
			shape.left.enableClipping = true;
			shape.right.enableClipping = true;
			shape.top.enableClipping = true;
			shape.bottom.enableClipping = true;
			// --
			stage.addEventListener(MouseEvent.MOUSE_DOWN, clickHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, clickHandler);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, __onKeyDown);
			stage.addEventListener(KeyboardEvent.KEY_UP, __onKeyUp);
			// --
			render();
		}
 
		// Create the root Group and the object tree 
		private function createScene():void
		{
			shape = new SkyBox( "pano", 300, 1, 1 );
			rootNode.addChild( shape );
		}
 
		private var panangle:Number = 0;
		private var tiltangle:Number = 0;
		private var lastPanAngle:Number = 0;
		private var lastTiltAngle:Number = 0;
		private var lastMouseX:Number = 0;
		private var lastMouseY:Number = 0;
		private const toRADIANS:Number = Math.PI/180;
 
		override public function simpleRender( event : Event = null ) : void
		{
			if( running )
			{
				panangle 	=  0.3*(stage.mouseX - lastMouseX) + lastPanAngle;
				tiltangle 	= -0.3*(stage.mouseY - lastMouseY) + lastTiltAngle;
 
				if (tiltangle > 85)
					tiltangle = 85;
				if (tiltangle < -85)
					tiltangle = -85;
				camera.rotateY = panangle;
				camera.tilt = tiltangle;
				/*
				camera.lookAt(	100 * Math.sin(panangle * toRADIANS) * Math.cos(tiltangle * toRADIANS),// + camera.x,
								100 * Math.cos(panangle * toRADIANS) * Math.cos(tiltangle * toRADIANS),// + camera.z,
								100 * Math.sin(tiltangle * toRADIANS)// + camera.y
							);
				*/
			}
 
			super.simpleRender( event );
		}
	}
}
Флэш выдает:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at sandy.materials::MovieMaterial()
at index()

Думаю я упускаю что-то простое и очевидное для программиста, но будучи дизигнером в упор не вижу в чем проблема, научный тык и гугление пока не помогли, помогите люди добрые, ткните носом

Добавлено через 5 минут
UPD: Уточню что именно я менял: добавил импорт недостающих классов sandy из примера с клипами, добавил функцию loadSideMovies(), задал материалы так:
Код AS3:
var SideMat0:MovieMaterial = new MovieMaterial( queue.data["side0"],40 );
, назначил материалы поверхностям.


Последний раз редактировалось unused_name; 18.03.2010 в 14:40.
Старый 18.03.2010, 17:07
petri вне форума Посмотреть профиль Отправить личное сообщение для petri Найти все сообщения от petri
  № 2  
Ответить с цитированием
petri
 
Аватар для petri

Регистрация: Dec 2009
Сообщений: 60
Цитата:
at sandy.materials::MovieMaterial()
at index()
Это подсказывает посмотреть внутрь класса MovieMaterial. Скорее всего вы передаете параметр, который равен null.

А если смотреть на ваш код, становится понятно, откуда ошибка - вы инициируете переменные:
Цитата:
var SideMat0:MovieMaterial = new MovieMaterial( queue.data["side0"],40 );
var SideMat1:MovieMaterial = new MovieMaterial( queue.data["side1"],40 );
ДО того как загрузка окончена, то есть передаете несуществующий еще объект в качестве параметра.
Задайте переменные после окончания загрузки.

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

Регистрация: May 2006
Сообщений: 52
Спасибо за наводку, сейчас попробую все расставить по местам.

Я сделал так: заключил инициацию переменных в функцию:
Код AS3:
 public function SetMats():void
		{
			var SideMat0:MovieMaterial = new MovieMaterial( queue.data["side0"],40 );
			var SideMat1:MovieMaterial = new MovieMaterial( queue.data["side1"],40 );
			var SideMat2:MovieMaterial = new MovieMaterial( queue.data["side2"],40 );
			var SideMat3:MovieMaterial = new MovieMaterial( queue.data["side3"],40 );
			var SideMat4:MovieMaterial = new MovieMaterial( queue.data["side4"],40 );
			var SideMat5:MovieMaterial = new MovieMaterial( queue.data["side5"],40 );
		}
И вызвал эту функцию при событии окончания загрузки:
Код AS3:
private function loadComplete( event:QueueEvent ):void 
		{			
			SetMats();
// Бла-бла-бла
}
Теперь 1120: Access of undefined property SideMat0. - Для каждого материала соответственно. =(


Последний раз редактировалось unused_name; 18.03.2010 в 19:31.
Старый 18.03.2010, 19:33
petri вне форума Посмотреть профиль Отправить личное сообщение для petri Найти все сообщения от petri
  № 4  
Ответить с цитированием
petri
 
Аватар для petri

Регистрация: Dec 2009
Сообщений: 60
А это потому, что вы объявили локальные переменные - их не видно ВНЕ метода SetMats().

Объявите нужные переменные перед конструктором класса
Код AS3:
private var sideMat0:MovieMaterial; 
........
private function setMats():void{
sideMat0 = new MovieMaterial( queue.data["side0"],40 );
}
upd Стоило об этом сказать еще в первом ответе, извините =)


Последний раз редактировалось petri; 18.03.2010 в 19:36.
Старый 18.03.2010, 20:23
unused_name вне форума Посмотреть профиль Отправить личное сообщение для unused_name Посетить домашнюю страницу unused_name Найти все сообщения от unused_name
  № 5  
Ответить с цитированием
unused_name
 
Аватар для unused_name

Регистрация: May 2006
Сообщений: 52
Сделал так:
Код AS3:
package
{
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.display.StageDisplayState;
	import flash.events.*;
	import flash.net.URLRequest;
	import flash.ui.*;
	import flash.utils.getTimer;
 
    import sandy.core.Scene3D;
    import sandy.core.data.*;
	import sandy.core.scenegraph.*;
	import sandy.events.*;
	import sandy.materials.*;
    import sandy.materials.attributes.*;
	import sandy.primitive.*;
	import sandy.util.*;
	import sandy.view.*;
 
 
 
 
	public class index extends BasicView
	{
 
		private  var sideMat0:MovieMaterial;
		private  var sideMat1:MovieMaterial;
		private  var sideMat2:MovieMaterial;
		private  var sideMat3:MovieMaterial;
		private  var sideMat4:MovieMaterial;
		private  var sideMat5:MovieMaterial;
 
 
		public function index():void
		{
			super();
			init( 800, 600 );
			camera.setPosition( 0, 0, 0 );
			camera.fov = 60;
            SetMats();
			loadSideMovies();
		}
 
		private var shape:SkyBox;
		private var planeNames:Array;
		private var polygons:Array;
		private var textures:Array;	
		private var running:Boolean = false;
		private var keyPressed:Array = new Array();
		private var queue:LoaderQueue = new LoaderQueue();
 
 
		public function __onKeyDown(e:KeyboardEvent):void
		{
            keyPressed[e.keyCode] = true;
            if( e.keyCode == Keyboard.SPACE )
            	stage.displayState = StageDisplayState.FULL_SCREEN;
        }
 
        public function __onKeyUp(e:KeyboardEvent):void
        {
           keyPressed[e.keyCode] = false;
        }
 
		private function clickHandler( p_oEvt:Event ):void
		{
			if( p_oEvt.type == MouseEvent.MOUSE_DOWN )
			{
				lastPanAngle = panangle;
				lastTiltAngle = tiltangle;
				lastMouseX = stage.mouseX;
				lastMouseY = stage.mouseY;
				running = true;
			}
			else
			{
				running = false;
			}
		}
 
		//  -- 
		private function loadSideMovies():void
		{
			queue = new LoaderQueue();
	        queue.add( "side0", new URLRequest("superbox/side0.swf") );
	        queue.add( "side1", new URLRequest("superbox/side1.swf") ); 
			queue.add( "side2", new URLRequest("superbox/side2.swf") );
			queue.add( "side3", new URLRequest("superbox/side3.swf") );
			queue.add( "side4", new URLRequest("superbox/side4.swf") );
			queue.add( "side5", new URLRequest("superbox/side5.swf") );
	        queue.addEventListener(SandyEvent.QUEUE_COMPLETE, loadComplete );
	        queue.start();
		}
        private function SetMats():void
		{
			SideMat0 = new MovieMaterial( queue.data["side0"],40 );
			SideMat1 = new MovieMaterial( queue.data["side1"],40 );
			SideMat2 = new MovieMaterial( queue.data["side2"],40 );
			SideMat3 = new MovieMaterial( queue.data["side3"],40 );
			SideMat4 = new MovieMaterial( queue.data["side4"],40 );
			SideMat5 = new MovieMaterial( queue.data["side5"],40 );
		}
 
 
 
		private function loadComplete( event:QueueEvent ):void 
		{			
 
			createScene();
 
			// --
			shape.front.appearance = new Appearance(SideMat0);
			shape.back.appearance = new Appearance(SideMat1);
			shape.left.appearance = new Appearance(SideMat2);
			shape.right.appearance = new Appearance(SideMat3);
			shape.top.appearance = new Appearance(SideMat4);
			shape.bottom.appearance = new Appearance(SideMat5);				
			// --
			shape.front.enableClipping = true;
			shape.back.enableClipping = true;
			shape.left.enableClipping = true;
			shape.right.enableClipping = true;
			shape.top.enableClipping = true;
			shape.bottom.enableClipping = true;
			// --
			stage.addEventListener(MouseEvent.MOUSE_DOWN, clickHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, clickHandler);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, __onKeyDown);
			stage.addEventListener(KeyboardEvent.KEY_UP, __onKeyUp);
			// --
			render();
		}
 
		// Create the root Group and the object tree 
		private function createScene():void
		{
			shape = new SkyBox( "pano", 300, 1, 1 );
			rootNode.addChild( shape );
		}
 
		private var panangle:Number = 0;
		private var tiltangle:Number = 0;
		private var lastPanAngle:Number = 0;
		private var lastTiltAngle:Number = 0;
		private var lastMouseX:Number = 0;
		private var lastMouseY:Number = 0;
		private const toRADIANS:Number = Math.PI/180;
 
		override public function simpleRender( event : Event = null ) : void
		{
			if( running )
			{
				panangle 	=  0.3*(stage.mouseX - lastMouseX) + lastPanAngle;
				tiltangle 	= -0.3*(stage.mouseY - lastMouseY) + lastTiltAngle;
 
				if (tiltangle > 85)
					tiltangle = 85;
				if (tiltangle < -85)
					tiltangle = -85;
				camera.rotateY = panangle;
				camera.tilt = tiltangle;
				/*
				camera.lookAt(	100 * Math.sin(panangle * toRADIANS) * Math.cos(tiltangle * toRADIANS),// + camera.x,
								100 * Math.cos(panangle * toRADIANS) * Math.cos(tiltangle * toRADIANS),// + camera.z,
								100 * Math.sin(tiltangle * toRADIANS)// + camera.y
							);
				*/
			}
 
			super.simpleRender( event );
		}
	}
}
Результат: 1120: Access of undefined property SideMat0.
Жутко надоело тупить...

Старый 19.03.2010, 12:24
petri вне форума Посмотреть профиль Отправить личное сообщение для petri Найти все сообщения от petri
  № 6  
Ответить с цитированием
petri
 
Аватар для petri

Регистрация: Dec 2009
Сообщений: 60
Вы опять сделали ту же ошибку - инициация переменных происходит ДО загрузки.
Код AS3:
private function loadComplete( event:QueueEvent ):void 
		{			
                     //загрузка точно произошла потому что выполняется этот код, значит  queue.data["side0"] должен существовать, вызываем метод сетМатс
                        setMats(); //если все успешно загружено, то должно работать. 
 
                       createScene();
 
			// --
			shape.front.appearance = new Appearance(SideMat0);
			shape.back.appearance = new Appearance(SideMat1);
			shape.left.appearance = new Appearance(SideMat2);
			shape.right.appearance = new Appearance(SideMat3);
			shape.top.appearance = new Appearance(SideMat4);
			shape.bottom.appearance = new Appearance(SideMat5);				
			// --
			shape.front.enableClipping = true;
			shape.back.enableClipping = true;
			shape.left.enableClipping = true;
			shape.right.enableClipping = true;
			shape.top.enableClipping = true;
			shape.bottom.enableClipping = true;
			// --
			stage.addEventListener(MouseEvent.MOUSE_DOWN, clickHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, clickHandler);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, __onKeyDown);
			stage.addEventListener(KeyboardEvent.KEY_UP, __onKeyUp);
			// --
			render();
 
		}


Последний раз редактировалось petri; 19.03.2010 в 12:32.
Старый 19.03.2010, 13:26
unused_name вне форума Посмотреть профиль Отправить личное сообщение для unused_name Посетить домашнюю страницу unused_name Найти все сообщения от unused_name
  № 7  
Ответить с цитированием
unused_name
 
Аватар для unused_name

Регистрация: May 2006
Сообщений: 52
Загрузка происходит, т.к. клипы мелькают на сцене при запуске файла, все пути и наличие файлов я проверил.
SetMats(); я вызывал изначально в этой же функции окончания загрузки, на место в последнем примере она переползла уже от отчаяния =)
Инициализацию переменных я подставлял в любые места где только можно, но они то не видны нужному классу то не получают нужных значений.
В общем не въезжаю пока. Читаю параллельно хорошее описание as3, но пока не понял, можно ли все-таки сделать переменные видимыми вне своего метода, типа как global в as2, или я на неверном пути опять?


Последний раз редактировалось unused_name; 19.03.2010 в 13:29.
Старый 19.03.2010, 13:36
petri вне форума Посмотреть профиль Отправить личное сообщение для petri Найти все сообщения от petri
  № 8  
Ответить с цитированием
petri
 
Аватар для petri

Регистрация: Dec 2009
Сообщений: 60
Понятно. А код последнего примера копипаст? Там объявляете sideMat0 а использовать пробуете SideMat0.

И точно не нужно от отчаяния переносить в разные места вызов метода инициации =) Он должен быть после окончания загрузки но до начала использования переменных.

Попробуйте вывести trace-ом то, что вы загружаете.

Про область видимости переменных http://help.adobe.com/ru_RU/ActionSc...0204-7f31.html


Последний раз редактировалось petri; 19.03.2010 в 13:41.
Старый 19.03.2010, 13:48
unused_name вне форума Посмотреть профиль Отправить личное сообщение для unused_name Посетить домашнюю страницу unused_name Найти все сообщения от unused_name
  № 9  
Ответить с цитированием
unused_name
 
Аватар для unused_name

Регистрация: May 2006
Сообщений: 52
Так и знал что где-то у меня тупейшая ошибка! Спасибо =)
Действительно все дело в S/s! При компиляции ошибок больше не выдает, но клипы не отображаются, копаюсь дальше.

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

Регистрация: Dec 2009
Сообщений: 60
Пожалуйста, удачи! =)

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:42.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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