![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: May 2006
Сообщений: 52
|
Пытаюсь сделать простую вещь, изменить один из примеров с оф. сайта Sandy 3D поставив вместо битмап-текстур свои мувиклипы:
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(), задал материалы так: , назначил материалы поверхностям. Последний раз редактировалось unused_name; 18.03.2010 в 14:40. |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 60
|
Цитата:
А если смотреть на ваш код, становится понятно, откуда ошибка - вы инициируете переменные: Цитата:
Задайте переменные после окончания загрузки. |
|
|||||
|
Регистрация: May 2006
Сообщений: 52
|
Спасибо за наводку, сейчас попробую все расставить по местам.
Я сделал так: заключил инициацию переменных в функцию: 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 ); } Теперь 1120: Access of undefined property SideMat0. - Для каждого материала соответственно. =( Последний раз редактировалось unused_name; 18.03.2010 в 19:31. |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 60
|
А это потому, что вы объявили локальные переменные - их не видно ВНЕ метода SetMats().
Объявите нужные переменные перед конструктором класса upd Стоило об этом сказать еще в первом ответе, извините =) Последний раз редактировалось petri; 18.03.2010 в 19:36. |
|
|||||
|
Регистрация: May 2006
Сообщений: 52
|
Сделал так:
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 ); } } } Жутко надоело тупить... |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 60
|
Вы опять сделали ту же ошибку - инициация переменных происходит ДО загрузки.
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. |
|
|||||
|
Регистрация: May 2006
Сообщений: 52
|
Загрузка происходит, т.к. клипы мелькают на сцене при запуске файла, все пути и наличие файлов я проверил.
SetMats(); я вызывал изначально в этой же функции окончания загрузки, на место в последнем примере она переползла уже от отчаяния =) Инициализацию переменных я подставлял в любые места где только можно, но они то не видны нужному классу то не получают нужных значений. В общем не въезжаю пока. Читаю параллельно хорошее описание as3, но пока не понял, можно ли все-таки сделать переменные видимыми вне своего метода, типа как global в as2, или я на неверном пути опять? Последний раз редактировалось unused_name; 19.03.2010 в 13:29. |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 60
|
Понятно. А код последнего примера копипаст? Там объявляете sideMat0 а использовать пробуете SideMat0.
И точно не нужно от отчаяния переносить в разные места вызов метода инициации =) Он должен быть после окончания загрузки но до начала использования переменных. Попробуйте вывести trace-ом то, что вы загружаете. Про область видимости переменных http://help.adobe.com/ru_RU/ActionSc...0204-7f31.html Последний раз редактировалось petri; 19.03.2010 в 13:41. |
|
|||||
|
Регистрация: May 2006
Сообщений: 52
|
Так и знал что где-то у меня тупейшая ошибка! Спасибо =)
Действительно все дело в S/s! При компиляции ошибок больше не выдает, но клипы не отображаются, копаюсь дальше. |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 60
|
Пожалуйста, удачи! =)
|
![]() |
![]() |
Часовой пояс GMT +4, время: 15:31. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|