PDA

Просмотр полной версии : Eclipse и FlashDevelop - код один, результат разный!


xintrea
17.07.2007, 19:26
Здравствуйте дорогие флешеры.

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

Для начала взял небольшой проектик, перенес его в FlashDevelop. Проект - просто тестовый, подключает один внешний swf, и печатает список всех мувиков. Такой же, как обсуждался здесь (http://www.flasher.ru/forum/showthread.php?t=98069).

Так вот, данный проект, скомпиленый в 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, его код дан в этом посте (http://www.flasher.ru/forum/showpost.php?p=658532&postcount=9). Вызов пробую делать и как 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
Блин, ну я уже не знаю что делать. Начались тупые пляски с бубном. Упростил пример, убрал лишнее, оставил только задействованый код. Выкладываю сюда.

Уважаемый 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!

iNils
07.08.2007, 05:19
2 Racer: Не надо создавать помойку в теме. Подобный вопрос надо было задать в Общих вопросах и ОТДЕЛЬНОЙ темой.

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

xintrea
08.08.2007, 03:56
Чем поделица? Чоза сниппеты.

Kikasso
08.08.2007, 07:30
xintrea, открой FDT и нажми ctrl+B