Просмотр полной версии : Разница в выполнении в разных плеерах
Здравствуйте.
Ситуация такая:
Есть ролик, с использованием stage3D.
Если запускать его из браузера — все хорошо, но если с помощью Flash Player 11.2 Projector, то 3д-объекта не видно.
Почему так может быть?
bublic_bicubic
23.04.2012, 16:08
может быть он подгружается отдельно?
Во флешке на него может быть локальная ссылка, либо у Projector не выставлены разрешения для общения с сетью.
может быть он подгружается отдельно?
Во флешке на него может быть локальная ссылка, либо у Projector не выставлены разрешения для общения с сетью.
Нет, 3д создается внутри флешки (используется альтернатива3д). оч странно, но исчезает даже надпись над 3д-объектом:
http://s019.***********/i618/1204/43/6b7bcabb5a51.png (http://www.***********)
Кэп подсказывает, что версии разные.
Кэп подсказывает, что версии разные.
Тоже так сначала подумал, для этого задал вопрос (http://www.flasher.ru/forum/showthread.php?t=178512), сделал маленькую флешку и запустил (в браузере и в прожекторе). Результат одинаков: WIN 11,2,202,228
bublic_bicubic
24.04.2012, 09:06
а можете выложить исходник аномальной флешки или ее части?
а можете выложить исходник аномальной флешки или ее части?
Он большой, но простой:
(для чего флешка: чтобы проверить работает ли передача/прием данных там, куда будет флешка вставлена, например, вставленная в программу на Delphi, и поддерживается ли 3д)
public class P7compatibility extends Sprite
{
private var t2:TextField = new TextField();
private var camera:Camera3D;
private var rootContainer:Object3D;
private var box:Box;
private var stage3D:Stage3D;
private var ibox:WireFrame;
private var cubeContainer:Object3D;
public function P7compatibility()
{
super();
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
draw();
}
private function draw():void{
// «кнопка» (текстфилд в спрайте)
var t1:TextField = new TextField();
t1.text = "Отправить данные";
t1.width = t1.textWidth+3;
t1.height = t1.textHeight+3;
t1.selectable = false;
var s1:Sprite = new Sprite();
s1.graphics.lineStyle(1, 0xcccccc, 1, true);
s1.graphics.beginFill(0xffffff);
s1.graphics.drawRect(0, 0, t1.textWidth+3, t1.textHeight+3);
s1.addChild(t1);
addChild(s1);
s1.x = 10;
s1.y = 10;
s1.addEventListener(MouseEvent.ROLL_OVER, setHandCursor);
s1.addEventListener(MouseEvent.ROLL_OUT, setArrowCursor);
s1.addEventListener(MouseEvent.CLICK, sendToExternalContainer);
// текстфилд
t2.text = "Принятые данные:";
addChild(t2);
t2.x = s1.x;
t2.y = s1.y + s1.height + 10;
// слушатель вызова внешним кодом функции sendToFlash во флеше
ExternalInterface.addCallback("sendToFlash", receivedFromExternalContainer);
// текстфилд
var t3:TextField = new TextField();
t3.text = "Проверка 3D:";
t3.x = s1.x;
t3.y = t2.y + 50;
addChild(t3);
// блок для проверки поддержки 3д
stage3D = stage.stage3Ds[0];
camera = new Camera3D(10, 1000);
camera.z = 250;
camera.rotationY = -Math.PI;
// кнтейнеры для камеры и куба
rootContainer = new Object3D();
cubeContainer = new Object3D();
// куб
box = new Box()
box.setMaterialToAllSurfaces(new FillMaterial(0xCCCCCC, 0.99));
// ребра куба (куб только из ребер)
ibox = new WireFrame();
ibox = WireFrame.createEdges((box as Mesh), 0x000000, 1, 2);
// камера
camera.view = new View(150, 150, false, 0xFFFFFF, 1, 7);
camera.view.hideLogo();
camera.fov = Math.PI/3;
camera.view.x = s1.x;
camera.view.y = t3.y + t3.textHeight + 10;
// корневой контейнер содержит камеру и контейнер для куба
rootContainer.addChild(camera);
// контейнер куба содержит куб и ребра куба
cubeContainer.addChild(box);
cubeContainer.addChild(ibox);
rootContainer.addChild(cubeContainer);
addChild(camera.view);
// ждем создания контекста 3д
stage3D.addEventListener(Event.CONTEXT3D_CREATE, init);
stage3D.requestContext3D();
}
// реакция на создание контекста 3д
private function init(e:Event):void{
stage3D.removeEventListener(Event.CONTEXT3D_CREATE, init);
// загрузка ресурсов в контекст
for each (var resource:Resource in rootContainer.getResources(true)) {
resource.upload(stage3D.context3D);
}
// слушатель на энтерфрейм
this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
// слушатель на энтерфрейм
private function enterFrameHandler(e:Event):void{
// вращение куба
cubeContainer.rotationX += 0.01;
cubeContainer.rotationY += 0.05;
cubeContainer.rotationZ += 0.05;
camera.render(stage3D);
}
// изменение вида курсора
private function setHandCursor(e:MouseEvent):void{
Mouse.cursor = MouseCursor.BUTTON;
}
private function setArrowCursor(e:MouseEvent):void{
Mouse.cursor = MouseCursor.AUTO;
}
// посылает по клику во внешнюю функцию sendFromFlash строку
private function sendToExternalContainer(e:MouseEvent):void{
ExternalInterface.call("sendFromFlash", "Hello, Im flash");
}
// принимает строку из внешней функции sendToFlash
private function receivedFromExternalContainer(value:String):void{
t2.text = "Принятые данные: \n" + value;
}
}
Тоже так сначала подумал, для этого задал вопрос (http://www.flasher.ru/forum/showthread.php?t=178512), сделал маленькую флешку и запустил (в браузере и в прожекторе). Результат одинаков: WIN 11,2,202,228Можно было просто кликнуть правой мышью по плееру и в контекстному меню посмотреть номер версии.
и в контекстному меню посмотреть номер версии
Может контекстное меню полностью отключено, плеер-то 11.2 ;)
Можно было просто кликнуть правой мышью по плееру и в контекстному меню посмотреть номер версии.
Да, конечно можно.
Но в любом случае — версия одна, а отображение разное.
Чем это может быть вызвано?
alexcon314
24.04.2012, 14:15
Если вы будете "вставлять" флешку в программу на делфи, т.е. по-сути будете использовать ехе-обертку на плеером, то вставится именно браузерный ActiveX-плеер. Это я к тому, что в браузере и в обертке скорее всего будет работать одинаково (не факт, но где-то близко, зависит от качества исполнения обертки). Штатный флеш-проектор - несколько другое. Но вопрос в своей изначальной формулировке остается открытым. Можно предположить, что при вставке плеера в хтмл вы используете какой-то режим, недоступный при работе в проекторе, типа direct или transparent. Другими словами, в проекторе изначально "зажимается" часть функционала.
PS. да, проектор или автономный плеер, в данном контексте не имеет значения. и, да, может быть айр в помощь?
swf-version при компиляции выставляете?
Если вы будете "вставлять" флешку в программу на делфи, т.е. по-сути будете использовать ехе-обертку на плеером, то вставится именно браузерный ActiveX-плеер. Это я к тому, что в браузере и в обертке скорее всего будет работать одинаково [..]
К сожалению в обертке выглядит точно так же, как и в прожекторе. Поэтому в прожекторе и гоняю (но и в обертке проверяю). Но что странно: в обертке определяет версию плеера правильно, а вот 3д не отображается.
PS. да, проектор или автономный плеер, в данном контексте не имеет значения. и, да, может быть айр в помощь?
А эйр можно «вставлять» в десктопные приложения, написанные на другом языке (том же Делфи, к примеру)?
А я думаю, что вылетает рантайм ошибка, но т.к. прожектор скорее всего релизный, то ничего не показывается.
Подозреваю, что выполнение кода не доходит до строчки
var t3:TextField = new TextField();
ну и все что ниже, тоже не выполняется и не отображается.
Настораживает предыдущая строчка:
ExternalInterface.addCallback("sendToFlash", receivedFromExternalContainer);
Возможно именно это является причиной падения в прожекторе, если действительно имеет место рантайм ошибка.
swf-version при компиляции выставляете?
Прописано так (Flash Builder):
Additional compiler arguments:
-swf-version=13
Нужно ли еще что-то дописывать или этого достаточно для нормальной компиляции?
swf-version при компиляции выставляете?
Если в браузере показывается корректно скомпилированый результат, то какой смысл советовать указать другие параметры компиляции? SWF валидная.
Настораживает предыдущая строчка:
ExternalInterface.addCallback("sendToFlash", receivedFromExternalContainer);
Возможно именно это является причиной падения в прожекторе, если действительно имеет место рантайм ошибка.
Да, вы правы... :)
А чем эта строчка неправильна?
Да, вы правы... :)
А чем эта строчка неправильна?
ExternalInterface доступен только, если плеер "располагается во внешнем контейнере" (не знаю как точно выразиться).
Не только. Его можно и запретить для контейнера.
Srednas, вы можете проверить доступность ExternalInterface с помощью свойства available
вы можете проверить доступность ExternalInterface с помощью свойства available
Да, спасибо, проверил — не доступен..
Будем думать чего делать.
У контейнера должен быть разрешен allowScriptAccess.
Основы можете почитать тут (http://help.adobe.com/ru_RU/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7cb2.html).
alexcon314
24.04.2012, 17:46
В обертке ExternalInterface доступен без "лишних телодвижений". Т.е. если явно его не отрубить (AllowNetworking="internal"), то оно работает. В проекторе и в автономе - не доступен никак. Впрочем, судя по коду, этот момент вряд ли играет существенную роль, имхо. Что там все-таки с параметрами эмбеда в хтмл?
К сожалению в обертке выглядит точно так же, как и в прожекторе.
Ну, выкладывай проблемный swf. Пощупаем на досуге.
По айру - это само по себе десктопное приложение. Что там с 3D - не знаю, если чесно, просто вариант. Встроить айр-приложение в обертку - это уже перебор. Такого, пожалуй, не добиться. Разве что через какой-нибудь "interprocess comunication". Чисто сделать будет трудно.
Оберните вызов ExternalInterface в try/catch блок
fish_r, зачем?
В смысле это не вопрос по сути а затравка для очередного холивара? Не, мне ещё один плюс не нужен просто так. Вы можете не оборачивать.
Это был просто вопрос. Зачем оборачивать в try...catch то, что имеет возможность проверить свою доступность?
P.S. Я вам плюсы не ставил.
Ок. Че то я нервный сегодня.
Ошибки запроса могут быть связаны не только с доступностью контейнера. В общем рекомендуется перехватывать возможные ошибки при внешнем запросе.
*где у меня написано что вы мне плюсы ставили?
При добавлении колбека других ошибок не будет.
http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7cb1.html
Добавлено через 6 минут
Собственно суть:
First of all, the code checks whether the external API is even available in the current container using the ExternalInterface.available property. If so, it begins the process of setting up communication. Because security exceptions and other errors can occur when you attempt communication with an external application, the code is wrapped in a try block (the corresponding catch blocks were omitted from the listing for brevity).
Это относится конкретно к приложению из примера. Там сразу call вызывается.
Там не конкретизируется, что блок try...catch нужно применять при вызове, а при регистрации не нужно ( если я правильно понял регистрация калбека не в плеере производится, то есть не формально, а браузере реально создается такая функция которая как бы js-овская ). Раз так, то не зная реализации этой связи я предпочитаю следовать рекомендациям хелпа.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.