Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибка дебагера Помогите устранить (http://www.flasher.ru/forum/showthread.php?t=120246)

MafiaBoy 15.01.2009 14:04

Ошибка дебагера Помогите устранить
 
Следующая ошибка TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать CubeWithDifferentSides_backAsset@42831f1 в flash.display.BitmapData.
at CubeWithDifferentSides()[C:\Documents and Settings\User\Рабочий стол\MagicCube\CubeWithDifferentSides.as:45]

Код не работает,только чёрный экран на странице, при компиляции также ошибок не было!
Но вот только дебагер замечает что что-то не так..

mre 15.01.2009 14:23

Если даже русский текст ошибки Вам непонятен, то тут ничем не поможешь.

MafiaBoy 15.01.2009 15:13

и что мне делать?
проблему решать же надо!

Добавлено через 2 минуты
Код AS3:

package
{
        import flash.display.Bitmap;
        import flash.events.Event;
 
        import org.papervision3d.lights.PointLight3D;
        import org.papervision3d.materials.BitmapMaterial;
        import org.papervision3d.materials.shaders.PhongShader;
        import org.papervision3d.materials.shaders.ShadedMaterial;
        import org.papervision3d.materials.shaders.Shader;
        import org.papervision3d.materials.utils.MaterialsList;
        import org.papervision3d.objects.primitives.Cube;
        import org.papervision3d.view.BasicView;
 
        [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
        public class CubeWithDifferentSides extends BasicView
        {
                [Embed(source="assets/back.jpg")]
                private var backAsset:Class;
 
                [Embed(source="assets/bottom.jpg")]
                private var bottomAsset:Class;
 
                [Embed(source="assets/front.jpg")]
                private var frontAsset:Class;
 
                [Embed(source="assets/left.jpg")]
                private var leftAsset:Class;
 
                [Embed(source="assets/right.jpg")]
                private var rightAsset:Class;
 
                [Embed(source="assets/top.jpg")]
                private var topAsset:Class;
 
                private var light:PointLight3D;
                private var cube:Cube;
 
                public function CubeWithDifferentSides()
                {
                        var materialsList:MaterialsList = new MaterialsList();
 
                        light = new PointLight3D();
 
                        materialsList.addMaterial(new BitmapMaterial( new backAsset(), true ), "back");
                        materialsList.addMaterial(new BitmapMaterial( new bottomAsset(), true ), "bottom");
                        materialsList.addMaterial(new BitmapMaterial( new frontAsset(), true ), "front");
                        materialsList.addMaterial(new BitmapMaterial( new leftAsset(), true ), "left");
                        materialsList.addMaterial(new BitmapMaterial( new rightAsset(), true ), "right");
                        materialsList.addMaterial(new BitmapMaterial( new topAsset(), true ), "top");
 
                        cube = new Cube(materialsList, 500, 500, 500, 5, 5, 5);
                        scene.addChild(cube);
                        cube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onCubeClick);
 
                        startRendering();
                }
 
 
                override protected function onRenderTick(event:Event=null):void
                {
                        cube.rotationY += (viewport.containerSprite.mouseX - cube.rotationY) * .1;
                        cube.rotationX += (viewport.containerSprite.mouseY - cube.rotationX) * .1;
                        renderer.renderScene(scene, camera, viewport);
                }
 
                private function onCubeClick(e:InteractiveScene3DEvent):void {
                        switch(e.face3d.material.name) {
      case 'front':
        navigateToURL(new URLRequest('http://mySite.com/1'));
      break;
      case 'back':
        navigateToURL(new URLRequest('http://mySite.com/2'));
      break;
      case 'left':
        navigateToURL(new URLRequest('http://mySite.com/3'));
      break;
      case 'right':
        navigateToURL(new URLRequest('http://mySite.com/4'));
      break;
  }
 
                }
        }
}


fljot 15.01.2009 15:36

Код AS3:

materialsList.addMaterial(new BitmapMaterial( new backAsset(), true ), "back");

вот здесь видимо вылазит ошибка и _русским языком_ вам пишет "не могу преобразовать CubeWithDifferentSides_backAsset@42831f1 в flash.display.BitmapData."
посмотрите, какие параметры (тип) принимает BitmapMaterial, и посмотрите что на самом деле вы туда передаёте

MafiaBoy 15.01.2009 15:39

а как это сделать?

etc 15.01.2009 15:47

Цитата:

Сообщение от MafiaBoy (Сообщение 790849)
а как это сделать?

Документацию к pv3d почитать.

MafiaBoy 15.01.2009 15:57

спасибо господа
я решил, но вот теперь только ссылки на гранях не работают...
Это почему?

Добавлено через 31 минуту
Может я чтоөто упустил, но щелчка по грани не происходит!

Добавлено через 47 минут
Код AS1/AS2:

private function onCubeClick(event:MouseEvent):void {
                        switch(e.face3d.material.name) {
                case 'back':
                        navigateToURL(new URLRequest('http://ebay.com/'));
                break;
                case 'front':
                        navigateToURL(new URLRequest('http://google.com/'));
                break;
                case 'left':
                        navigateToURL(new URLRequest('http://myspace.com/'));
                break;
                case 'right':
                        navigateToURL(new URLRequest('http://ebay.com/'));
                break;
                }
        }

я изменил код и при компиляции получаю следующую ошибку
C:\Documents and Settings\User\Рабочий стол\MagicCube\CubeWithDifferentSides.as(72): col: 33 Error: Обращение несуществующего свойства e.
switch(e.face3d.material.name) {

etc 15.01.2009 16:49

Потому что внимательнее надо писать код и понимать, что этот код делает.

MafiaBoy 15.01.2009 16:52

ну я школьник я же учусь...
что следует использовать за место e.face3d.material.name

etc 15.01.2009 16:53

Ну вы вообще понимаете, что делает этот switch? Что вообще это за обработчик, который вы написали?
Код нужно понимать, а не бездумно втыкать его куда-попало, даже не разбираясь в нём.

MafiaBoy 15.01.2009 16:55

конечно это оператор множественного перебора, который рассматривает ветвление по не скольким условиям, в данном случае их 4

Добавлено через 20 минут
Пока не нашол ответа в апиай доках папера!
В чём же есть ошибка?
Понимаете я же использую материалы граней, но почему функция клика не работает?

[

etc 15.01.2009 17:40

Цитата:

Сообщение от MafiaBoy (Сообщение 790887)
конечно это оператор множественного перебора, который рассматривает ветвление по не скольким условиям, в данном случае их 4

Я вас спрашивал не как работает switch, а какую логику в конкретно данном случае он реализует, в частности, что он перебирает?

MafiaBoy 15.01.2009 17:42

он перебирает имя материала, не Событие а именно имя материала

Добавлено через 1 час 17 минут
у меня ошибка в коде выше и я её устранить самостоятельно не могу.
Так как я не вижу в чём проблема

etc 15.01.2009 19:09

Вы зачем-то изменили тип события и имя переменной, его содержащего. Зачем — непонятно. Естесственно, локальной переменной с именем «e» больше нет.

MafiaBoy 15.01.2009 19:14

__etc
дело в том, что код, предложенный Obi впринципе правилен и программа собирается, но при тестировании продукта оказывается что ссылки не рабтают(не возможно кликнуть по какой-либо грани). Я стал менять не много код, но тщетно.
Код AS3:

 private function onCubeClick(e:InteractiveScene3DEvent):void {
                        switch(e.face3d.material.name) {
      case 'front':
        navigateToURL(new URLRequest('http://mySite.com/1'));
      break;
      case 'back':
        navigateToURL(new URLRequest('http://mySite.com/2'));
      break;
      case 'left':
        navigateToURL(new URLRequest('http://mySite.com/3'));
      break;
      case 'right':
        navigateToURL(new URLRequest('http://mySite.com/4'));
      break;
  }
 
                }


etc 15.01.2009 19:19

Значит можно сделать вывод, что обработчик не вызывается, либо нет поверхностей с такими именами. Да поможет вам trace.

MafiaBoy 15.01.2009 19:26

Да я воспользовался trace
Результат: ничего.. Никакого текста.

Можно сделать вывод, что обработчик не вызывается!
Вопрос почему? Я такого нигде кроме Flash не видел, как ликвидировать эту мистику?

etc 15.01.2009 19:27

А что и где вы трейсили?

MafiaBoy 15.01.2009 19:33

Код AS3:

private function onCubeClick(e:InteractiveScene3DEvent):void {
                        switch(e.face3d.material.name) {
                        case 'front':
                                trace("It is working...");
                        break;
                        case 'back':
                                trace("It is working...");
                        break;
                        case 'left':
                                trace("It is working...");
                        break;
                        case 'right':
                                trace("It is working...");
                        break;
                        }
                }


etc 15.01.2009 19:36

Ну и какой смысл в трейсе кейсов, когда в них раньше был navigateToURL, который не работает? Протрейсите само событие, поверхность, материал, имя материала.

MafiaBoy 15.01.2009 19:39

trace на события клика - результат: ничего
Цитата:

поверхность, материал, имя материала.
А это то как потрейсить
?

etc 15.01.2009 19:41

Боже мой, у вас же пришло событие, там есть ссылка на поверхность, у поверхности ссылка на материал. Разбирайтесь уже в коде, в конце-концов.

Я ковыряться с pv3d ради вашего кода не буду, ибо лень.

MafiaBoy 15.01.2009 19:43

ок
но вот только скажите такие странности часто встречаются во флеш?
А то я Рубикодер

etc 15.01.2009 19:46

Какие странности?

MafiaBoy 15.01.2009 19:50

Эти!
Когда весь код правилен вроде бы? Лист статуса компилирования чист,
а при использовании проекта замечается что ссылки не работают..

etc 15.01.2009 20:01

А что, руби такой крутой язык, что в состоянии понять, что от него хочет разработчик, предугадывает его действия и заранее вываливает ошибку? Если в коде нет синтаксической ошибки и нет ошибок при выполнении, это вовсе не означает, что он будет работать ровно так, как планировалось. А не работает он так, как планировалось, потому что разработчик (в данном случае вы) не до конца понимает суть кода, который пишет или не понимает, как работать с конкретным фреймворком. Код, написанный наобум, скорее всего работать не будет, о чём и свидетельствует данный топик.

darksranger 15.01.2009 20:29

о ужас .... _etc нужно вручить медаль ... я бы уже давно забил ...
вобщем по делу, что вам мешает разобратся в обьектах, на которые вы вешаете обработку событий, возможно что то их перекрывает, возможно сообщение ставится не правильно, ( хотя не пресдтавляю как это можно сделать ) да и вобще, как вам уже посоветовали, trace всемогущь и тут скорей не страности языка ,а странности вашего понимания мира :) ,персматрите свое мировозрение на програмирование .. .

и еще поделу
если хотите реальной помощи, приведите код обработчиков обьектов ,на которые вы ставите обработку событий ,тогда можно будет более подробно помочь, а так телепаты в отпуск ушли, когда вернутся не сказали :(

Vasik1 16.01.2009 04:44

вообще, у BitmapMaterial должен быть
bitmapMaterial.interactive = true;

Проверьте, если заработает, напишите пожалуйста. Просто у меня такая же проблема, но bitmapMaterial.interactive = true; стоит, а event, гад, не вызывается.

MafiaBoy 16.01.2009 12:22

ПРИВОЖУ КОД СНОВА
Код AS3:

package
{
        import flash.display.Bitmap;
        import flash.events.Event;
        import flash.net.navigateToURL;
    import flash.net.URLRequest;
        import flash.events.MouseEvent;
 
        import org.papervision3d.lights.PointLight3D;
        import org.papervision3d.materials.BitmapMaterial;
        import org.papervision3d.materials.utils.MaterialsList;
        import org.papervision3d.objects.primitives.Cube;
        import org.papervision3d.view.BasicView;
        import org.papervision3d.events.InteractiveScene3DEvent;
 
        [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
        public class CubeWithDifferentSides extends BasicView
        {
                [Embed(source="assets/smallgrid.png")]
                private var backAsset:Class;
 
                [Embed(source="assets/smallgrid.png")]
                private var bottomAsset:Class;
 
                [Embed(source="assets/smallgrid.png")]
                private var frontAsset:Class;
 
                [Embed(source="assets/smallgrid.png")]
                private var leftAsset:Class;
 
                [Embed(source="assets/smallgrid.png")]
                private var rightAsset:Class;
 
                [Embed(source="assets/smallgrid.png")]
                private var topAsset:Class;
 
                private var light:PointLight3D;
                private var cube:Cube;
 
                public function CubeWithDifferentSides()
                {
                        var materialsList:MaterialsList = new MaterialsList();
 
                        light = new PointLight3D();
 
 
                        materialsList.addMaterial(createShadedMaterial( new backAsset() ), "back");
                        materialsList.addMaterial(createShadedMaterial( new bottomAsset() ), "bottom");
                        materialsList.addMaterial(createShadedMaterial( new frontAsset() ), "front");
                        materialsList.addMaterial(createShadedMaterial( new leftAsset() ), "left");
                        materialsList.addMaterial(createShadedMaterial( new rightAsset() ), "right");
                        materialsList.addMaterial(createShadedMaterial( new topAsset() ), "top");
                        cube = new Cube(materialsList, 500, 500, 500, 5, 5, 5);
                        cube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onCubeClick);
                        scene.addChild(cube);
                        startRendering();
                }
 
                private function createShadedMaterial(bitmap:Bitmap):BitmapMaterial
                {
                        return new BitmapMaterial(bitmap.bitmapData, true);
                }
 
                override protected function onRenderTick(event:Event=null):void
                {
                        cube.rotationY += (viewport.containerSprite.mouseX - cube.rotationY) * .1;
                        cube.rotationX += (viewport.containerSprite.mouseY - cube.rotationX) * .1;
                        renderer.renderScene(scene, camera, viewport);
                }
 
                  private function onCubeClick(e:InteractiveScene3DEvent):void {
                          trace("It is not working...");
                  }
        }
}


Vasik1 16.01.2009 12:38

Даж не знаю. я бы
createShadedMaterial( new backAsset() )
заменил на
var bitmapMaterial:BitmapMaterial = new BitmapFileMaterial("assets/smallgrid.png", true);
bitmapMaterial.interactive = true;
Можно использовать [Embed(source="assets/smallgrid.png")], тогда я бы делал
materialsList.addMaterial(BitmapMaterial( new backAsset(), false), "back");

Я не уверен сейчас в суждениях ибо не проверял... но всё же...

Вот ещё хорошие уроки: http://blog.tartiflop.com/first-steps-in-papervision3d/

MafiaBoy 16.01.2009 12:40

спасибо, кстати
bitmapMaterial.interactive = true;
никак не влияет на работу

Vasik1 16.01.2009 12:43

у меня у самого сейчас примерно та же проблема... в доках везде interactive = true;
А что его ставь, что нет, все равно у меня не срабатывает... хотя, если примеры из доков брать, то всё нормально... непонятно. :(

MafiaBoy 16.01.2009 12:45

то есть у тебя из доков примеры с кликами работают?

Vasik1 16.01.2009 12:46

ага... сам не пойму почему так...

может ICQ, вместе разбираться бум... ;)

MafiaBoy 16.01.2009 12:49

можно

Ну я и говорю... Это мистика какая то..

Vasik1 16.01.2009 12:59

ХАХАХА!!!!
Я кажись нашел нюанс...!!!
viewport.interactive = true;
у меня это из ReflectionView
viewport.viewport.interactive = true;

MafiaBoy 16.01.2009 16:46

Обращаюсь к опытным людям!
Почему в этом коде не срабатывает клик по любой грани?
Код AS3:

package
{
        import flash.display.Bitmap;
        import flash.events.Event;
        import flash.net.navigateToURL;
    import flash.net.URLRequest;
        import flash.events.MouseEvent;
        import org.papervision3d.objects.DisplayObject3D;
 
        import org.papervision3d.materials.BitmapMaterial;
        import org.papervision3d.materials.utils.MaterialsList;
        import org.papervision3d.objects.primitives.Cube;
        import org.papervision3d.view.BasicView;
        import org.papervision3d.events.InteractiveScene3DEvent;
 
        [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
        public class CubeWithDifferentSides extends BasicView
        {
                [Embed(source="assets/smallgrid.png")]
                private var backAsset:Class;
 
                [Embed(source="assets/smallgrid.png")]
                private var bottomAsset:Class;
 
                [Embed(source="assets/smallgrid.png")]
                private var frontAsset:Class;
 
                [Embed(source="assets/smallgrid.png")]
                private var leftAsset:Class;
 
                [Embed(source="assets/smallgrid.png")]
                private var rightAsset:Class;
 
                [Embed(source="assets/smallgrid.png")]
                private var topAsset:Class;
 
                private var cube:Cube;
 
                public function CubeWithDifferentSides()
                {
                        var materialsList:MaterialsList = new MaterialsList();
 
                        viewport.interactive = true;
 
                        materialsList.addMaterial(createShadedMaterial( new backAsset() ), "back");
                        materialsList.addMaterial(createShadedMaterial( new bottomAsset() ), "bottom");
                        materialsList.addMaterial(createShadedMaterial( new frontAsset() ), "front");
                        materialsList.addMaterial(createShadedMaterial( new leftAsset() ), "left");
                        materialsList.addMaterial(createShadedMaterial( new rightAsset() ), "right");
                        materialsList.addMaterial(createShadedMaterial( new topAsset() ), "top");
                        cube = new Cube(materialsList, 500, 500, 500, 5, 5, 5);
                        scene.addChild(cube);
                        cube.addEventListener(MouseEvent.CLICK, onCubeClick);
                        startRendering();
                }
 
                private function createShadedMaterial(bitmap:Bitmap):BitmapMaterial
                {
                        return new BitmapMaterial(bitmap.bitmapData, true);
                }
 
                private function onCubeClick(event:MouseEvent):void {
                          trace("It is not working...");
                }
 
                override protected function onRenderTick(event:Event=null):void
                {
                        cube.rotationY += (viewport.containerSprite.mouseX - cube.rotationY) * .1;
                        cube.rotationX += (viewport.containerSprite.mouseY - cube.rotationX) * .1;
                        renderer.renderScene(scene, camera, viewport);
                }
        }
}

Добавлено через 18 часов 55 минут
Как сделать клик во флеш?

Вообщем привожу код простого зд объекта. Это простой куб с шестью грнаями. Вопрос как изменить этот код чтобы по каждой из шести граней можно было бы кликнуть и увидеть текст "Грань номер n работает!" ???
Код AS3:

package
{
        import flash.display.Bitmap;
        import flash.events.Event;
 
        import org.papervision3d.core.proto.MaterialObject3D;
        import org.papervision3d.lights.PointLight3D;
        import org.papervision3d.materials.BitmapMaterial;
        import org.papervision3d.materials.utils.MaterialsList;
        import org.papervision3d.objects.primitives.Cube;
        import org.papervision3d.view.BasicView;
 
        [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
        public class InsideFacesOfACube extends BasicView
        {
                [Embed(source='../assets/back.jpg')]
                private var backAsset:Class;
 
                [Embed(source='../assets/bottom.jpg')]
                private var bottomAsset:Class;
 
                [Embed(source='../assets/front.jpg')]
                private var frontAsset:Class;
 
                [Embed(source='../assets/left.jpg')]
                private var leftAsset:Class;
 
                [Embed(source='../assets/right.jpg')]
                private var rightAsset:Class;
 
                [Embed(source='../assets/top.jpg')]
                private var topAsset:Class;
 
                [Embed(source='../assets/287.jpg')]
                private var environmentAsset:Class;
 
                private var light:PointLight3D;
                private var cube:Cube;
 
                public function InsideFacesOfACube()
                {
                        light = new PointLight3D();
 
                        var materialsList:MaterialsList = new MaterialsList();
 
                        materialsList.addMaterial(createShadedMaterial( new backAsset() ), "back");
                        materialsList.addMaterial(createShadedMaterial( new bottomAsset() ), "bottom");
                        materialsList.addMaterial(createShadedMaterial( new frontAsset() ), "front");
                        materialsList.addMaterial(createShadedMaterial( new leftAsset() ), "left");
                        materialsList.addMaterial(createShadedMaterial( new rightAsset() ), "right");
                        materialsList.addMaterial(createShadedMaterial( new topAsset() ), "top");
 
                        cube = new Cube(materialsList, 500, 500, 500, 5, 5, 5);
                        scene.addChild(cube);
 
                        startRendering();
 
                }
 
 
                private function createShadedMaterial(bitmap:Bitmap):BitmapMaterial
                {
                        return new BitmapMaterial(bitmap.bitmapData, true);
                }
 
 
 
                override protected function onRenderTick(event:Event=null):void
                {
                        cube.rotationY += (viewport.containerSprite.mouseX - cube.rotationY) * .1;
                        cube.rotationX += (viewport.containerSprite.mouseY - cube.rotationX) * .1;
                        renderer.renderScene(scene, camera, viewport);
                }
        }
}


Obi 18.01.2009 19:12

onCubeClick InteractiveScene3DEvent а не MouseEvent.

MafiaBoy 19.01.2009 13:05

Obi
дело в том что твой код с которым ты мне помог до этого момента, не работает
Всё компилируется но клика нет. Я не знаю как эту мистику исправить, честно я не знаю.

Vasik1 20.01.2009 19:24

http://www.gotoandlearn.com/play?id=68 - видео урок, как делать куб с кликабельными плоскостями.


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

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