Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Eclipse и FlashDevelop - код один, результат разный! (http://www.flasher.ru/forum/showthread.php?t=98624)

xintrea 17.07.2007 19:26

Eclipse и FlashDevelop - код один, результат разный!
 
Здравствуйте дорогие флешеры.

Доканало меня окончательно пользование Eclipse на ноутбуке с 256Mb озу, и решил я переползать с FDT на FlashDevelop.

Для начала взял небольшой проектик, перенес его в FlashDevelop. Проект - просто тестовый, подключает один внешний swf, и печатает список всех мувиков. Такой же, как обсуждался здесь.

Так вот, данный проект, скомпиленый в Eclipse, выдает такой список мувиков

Код:

First run giperTrace
_level0
_level0.resource
_level0.resource.mcCellBall
_level0.resource.mcCellEnemyPlayer
_level0.resource.mcCellCommandPlayer
Second run giperTrace
_level0
_level0.resource
_level0.resource.commandplayer0
_level0.resource.mcCellBall
_level0.resource.mcCellEnemyPlayer
_level0.resource.mcCellCommandPlayer

А скомпиленый в FlashDevelop выдает такой список

Код:

First run giperTrace
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
Second run giperTrace
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]

Распечатка мувиков делается через метод giperTrace, его код дан в этом посте. Вызов пробую делать и как giperTrace(_root) и как giperTrace(_level0), всеравно список мувиков получить не могу. Видимо в Eclipse, в результате компиляции и выполнения AS2 кода, получаются мувики, а во FlashDevelop получается объекты.


Напоминаю - весь код проекта в Eclipse и FlashDevelop полностью идентичен.


Строка компилирования в Eclipse

C:\TOOLS\win\MTASC_compiler\mtasc.exe -swf C:\WORK\ECLIPSE_WORKSPACE\flashos\deploy\application.swf -cp C:\WORK\ECLIPSE_WORKSPACE\flashos\src -main application.as -trace Flashout.traceReplacer -header 800:600:20 -cp C:\TOOLS\win\MTASC_class


Строка компилирования в FlashDevelop

C:\Program Files\FlashDevelop\tools\fdbuild\fdbuild.exe "C:\WORK\ECLIPSE_WORKSPACE\flashos_fd\flashos\flashos.fdp" -cp "C:\TOOLS\win\MTASC_class"


Подозреваю, что различие в результатах компиляции идет из-за каких-то настроек FlashDevelop. Поковырял, поменял некоторые, результата не увидел, поставил на место.

Вопрос - где чего во FlashDevelop надо крутануть, чтобы получить результат, идентичный в Eclipse?

iNils 18.07.2007 00:38

Попробывать указать все пути к классам. В строке Eclipse есть параметр "-cp C:\WORK\ECLIPSE_WORKSPACE\flashos\src" которого нет в FD.
Надо зайти в свойства меню Project, вкладка Classpaths и посмотреть какие пути стоят для классов проекта и глобальные пути.

xintrea 18.07.2007 03:20

В Eclipse путь C:\WORK\ECLIPSE_WORKSPACE\flashos\src - это путь к файлам классов проекта (грубо говоря к рабочей директории c AS2 стриптами).

Для FlashDevelop попробовал добавить путь к директории проекта, в которой лежат классы. (Думаю что для FlashDevelop это делать бессмысленно, но попробовал). Результат тот же.

Мужет быть это из-за того, что FlashDevelop как-то определяет extend-информацию для класса, и принудительно делает его объектом, даже если используется хак для связывания с мувиклипом? Если находясь на закладке с любым as-кодом, в панеле навигации переключиться на закладку ActionScript, то для любого as-кода в отображаемом дереве будет раздел Extends, в котором находится object.as следующего содержания

Код:

intrinsic class Object
{
        function Object();
        function watch(name:String, callback:Function, userData:Object):Boolean;
        function unwatch(name:String):Boolean;
        function addProperty(name:String, getter:Function, setter:Function):Boolean;
        function toString():String;
        function valueOf():Object;
        function hasOwnProperty(name:String):Boolean;
        function isPrototypeOf(theClass:Object):Boolean;
        function isPropertyEnumerable(name:String):Boolean;
        function toLocaleString():String;
        static function registerClass(name:String, theClass:Function):Boolean;
        static var prototype:Object;
        var constructor:Object;
        var __proto__:Object;
}

Это показывается содержимое файла Object.as, который находится в библиотеке стандартных flash классов. Этот файл виден в extends для каждого класса. Может в этом вся загвоздка? Может можно extends object как-то убрать, или заменить extends на MovieClip? Как это правильно сделать?

iNils 18.07.2007 04:28

Object.as в Extends у меня виден только если не задан extends или там Object, а так все гуд. То есть я напишу
class NewClass extends MovieClip
то в Extends у меня будет указан MovieClip

xintrea 18.07.2007 17:20

Вложений: 1
Блин, ну я уже не знаю что делать. Начались тупые пляски с бубном. Упростил пример, убрал лишнее, оставил только задействованый код. Выкладываю сюда.

Уважаемый iNils, не могли бы вы открыть проект в вашем FlashDevelop-е, и сказать какой лог в результате у вас?


Обратите внимание на то, что в giperTraceRecurse() условие

Код:

if(typeof(o)!='movieclip' || _checked_[o._target] ) return;
не даст печатать путь для объектов, не являющихся мувиклипами. Следовательно, появление строк [object Object] - это перечисление таких странных мувиков, у которых отсутсвует this?


Так же обратите внимание, что в onLoadResourceMovie() после выполнения в команды

Код:

// Копирование мувиклипа из ресурсов
scopeRef.resource.mcCellCommandPlayer.duplicateMovieClip("commandplayer0",15);

количество строк [object Object] в логе на единицу больше. То есть функция duplicateMovieClip() нормально скопировала мувиклип (а не объект). Однако, для этого мувика размещение всеравно неопределено раз вместо пути печатается [object Object].


Еще один момент - если скомпилированный swf открыть во Flash IDE и посмотреть Object List, то все мувиклипы видны (оставил в листинге только мувики)

Код:

Level #0: // кстати _level0 то же мувиклип, см. список мувиков в первом посте
Movie Clip: Frame=1 Target="_level0.resource"
Movie Clip: Frame=1 Target="_level0.resource.mcCellCommandPlayer"
Movie Clip: Frame=1 Target="_level0.resource.mcCellEnemyPlayer"
Movie Clip: Frame=1 Target="_level0.resource.mcCellBall"
Movie Clip: Frame=1 Target="_level0.resource.commandplayer0"

То есть возможно, все мувики нормально создаются, а метод giperTrace() в FlashDevelop по каким-то причинам не может нормально распечатать их местоположение. Да, видимо трабла в giperTrace()... Но почему тогда в Eclipse этот код работает нормально? И как его исправить?

iNils 18.07.2007 17:54

Это какие то проблемы класса FlashOut. Вместо trace(o) я поставил trace("+" + o) и сразу же трейсе пошли мувиклипы.

UPD. Точно, в FlashOut один метод, который делает msg.toString()... Это и создает проблемы.
Если в самом флеше написать
Код:

trace (_root.toString ());
то результатом будет [object Object]

Kikasso 18.07.2007 18:48

Тогда можно такую приставку приделать:
Код:

MovieClip.prototype.toString = function(){ return this._target; }
trace (_root.toString ());

Это, правда, вернет в слеш-нотации.

iNils 18.07.2007 19:11

Можно определять по typeof является ли объект мувиклипом и toString для него убирать.

xintrea 18.07.2007 23:05

Вот жеж, никогда бы этот вопрос не решил, спасибо!

Метод исправления выбрал такой - в каталоге куда установлен FlashDevelop находим подкаталог Library\org\flashdevelop\utils. Там будет лежать файл FlashOut.as. Заменяем его содержимое на

Код:

class org.flashdevelop.utils.FlashOut
{
 static function trace(msg:Object)
  {
  if(typeof(msg)!='movieclip')
    fscommand("trace", msg.toString());
  else
    fscommand("trace", msg);
  }
}

И трассировка начинает работать правильно.

Racer 07.08.2007 00:16

2 iNils и xintrea:
Друзья! Поделитесь Snippetами для Flashdevelop!


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

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