Просмотр полной версии : As2 -> As3, проблемы с преобразованием кода
kaliban92
13.04.2013, 22:15
Привет ребята.
Есть исходник as2 ( выдранный декомпилером )
На сцене много много мувиклипов, на каждом висит код:
********
Итого, не получается добиться того же эффекта что и оригинале. Несколько дней пробую по разному, но результат совершенно не похож на нужный.
Моих знаний as3 видимо не хватает, подскажите что не так с кодом ?
Заранее спасибо за любой ответ.
KumoKairo
13.04.2013, 23:02
Есть подозрения на неверную точку начала отсчета координат мыши. в AS3 координаты мыши могут быть как глобальными, на весь стейдж, так и локальными, на мувиклип. Глобальная координата считается от верхнего левого угла стейджа, а локальная от верхнего левого угла (или точки привязки, поправьте если кто точно знает) мувиклипа. У вас скорее всего координата мыши считается локально, у каждого шарика в отдельности.
Могу предложить следующее - заменить слушатель события EnterFrame на MouseMove, при этом сам слушатель насильно привязывать к stage, тогда координаты точно будут абсолютными.
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
public class MC extends MovieClip
{
var homex:int;
var homey:int;
var magnet:int;
var x0:int;
var y0:int;
var x1:int;
var y1:int;
var distancex:int;
var distancey:int;
var distance:int;
var powery:int;
var powerx:int;
var forcex:int;
var forcey:int;
public function MC()
{
this.addEventListener(Event.ADDED_TO_STAGE,addS);
/*Переносим регистрацию обработчика в слушатель добавления на сцену (нужно слушать именно там, так как только там узнаем ссылку на stage*/
}
function addS(e:Event):void
{
homex=this.x;
homey=this.y;
magnet=5000;
//Слушатель добавляем после получения ссылки на stage (после добавления на экран) и именно на stage, а не на this.
stage.addEventListener(MouseEvent.MOUSE_MOVE, mousePosition);
}
//Для приличия поменяем название обработчика
function mousePosition(e:MouseEvent):void
{
x0=this.x;// КООРДИНАТЫ В ДАННОМ КАДРЕ
y0=this.y;
x1=mouseX;// КООРДИНАТЫ МЫШИ
y1=mouseY;
/*
*Как вариант можно написать
x1 = stage.mouseX;
y1 = stage.mouseY;
*/
distancex=x1-x0;// РАСТОЯНИЕ МЕЖДУ КУРСОРОМ И this ПО Х И У
distancey=y1-y0;
distance=Math.sqrt(distancex*distancex+distancey*distancey);//ДИАГОНАЛЬ
powerx=this.x-distancex/distance*magnet/distance;
powery=this.y-distancey/distance*magnet/distance;
forcex = (forcex + (homex - x0) / 2) / 1.660000;
forcey = (forcey + (homey - y0) / 2) / 1.660000;
this.x=powerx+forcex;
this.y=powery+forcey;
}
}
}
Хотя вполне возможно что не придется возиться с проверкой события на stage, а просто поменять две строчки
x1=mouseX;// КООРДИНАТЫ МЫШИ
y1=mouseY;
на
x1=stage.mouseX;// КООРДИНАТЫ МЫШИ
y1=stage.mouseY;
Но тогда есть вероятность получения ошибки нулевой ссылки если обработчик нового кадра начнет выполняться раньше добавления на сцену. В общем событие MouseMove или EnterFrame лучше регистрировать по добавлению на сцену, в вашей addS(e);
Попробуйте и так и так, отпишитесь о результатах)
kaliban92
14.04.2013, 00:21
Спасибо огромное, за помощь.
Частично получилось(после нескольких десятков попыток), координаты определятся правильно. Всей логики уже не упомню, т.е сам не понимаю как работает, но работает ))
Код:
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
public class Part extends MovieClip
{
var homeX:int;
var homeY:int;
var magnet:int;
var x0:int;
var y0:int;
var x1:int;
var y1:int;
var distancex:int;
var distancey:int;
var distance:int;
var powery:int;
var powerx:int;
var forcex:int;
var forcey:int;
public function Part()
{
this.addEventListener(Event.ADDED_TO_STAGE,addS);
}
function addS(e:Event):void
{
homeX=this.x;
homeY=this.y;
magnet=5000;
//Слушатель добавляем после получения ссылки на stage (после добавления на экран) и именно на stage, а не на this.
this.addEventListener(Event.ENTER_FRAME, ent_frame);
}
//Для приличия поменяем название обработчика
function ent_frame(e:Event):void
{
x0=this.x;
y0=this.y;
x1=stage.mouseX;
y1=stage.mouseY;
distancex=x1-x0;
distancey=y1-y0;
distance=Math.sqrt(distancex*distancex+distancey*distancey);
powerx=this.x-distancex/distance*magnet/distance;
powery=this.y-distancey/distance*magnet/distance;
forcex = (forcex + (homeX - x0) / 2) / 1.660000;
forcey = (forcey + (homeY - y0) / 2) / 1.660000;
this.x=powerx+forcex;
this.y=powery+forcey;
}
}
}
Но, осталась 2я проблема. Объекты не возвращаются на свои места. Т.е они не образуют прямую линию какой она была в начале, а смещаются на пару пикселей.
Это очень странно, т.к нигде в коде(вроде как) homeX и homeY не изменяются.
Приведу оригинальный эффект, и то что получилось у меня, для наглядности.
strangedk
14.04.2013, 00:53
Привет ребята.
Есть исходник as2 ( выдранный декомпилером )
Я думаю что на этом можно остановиться. Я терпеть не могу когда люди вместо того чтобы думать головой, просто воруют код.
kaliban92
14.04.2013, 01:45
Во первых, этот алгоритм публичен, его неоднократно выкладывали на разные форумы, а автор использовал в своем блоге, в котором значится, что все что нужно, что бы получить исходник - написать ему. У меня не получилось отправить ему сообщения в google+(не умею пользоваться этим сервисом), поэтому и пошел на это. По твоему я преступление совершил ?
Во вторых,лично ты не разу не пользовался чужим кодом ? Не использовал чужие ресурсы ( картинки, фотографии, не качал с торрентов и.т.д ) ?
P.S Я терпеть не могу, когда туповатые лицемеры, вместо того что бы думать головой, обвиняют других в том, в чем виноваты не меньше, а возможно и больше, чем тот кого они обвиняют.
kaliban92, правила читали? Несмотря на то, что вы не можете воспользоваться google+`ом для того, чтобы спросить автора об исходнике (удивительно, но "не умею пользоваться этим сервисом"), вы умудрились декомпилировать (а вот это получилось успешно!) и теперь в ас3 переводите, наплевав на какое-либо уважение к чужому труду, по-сути, украв.
Во первых, этот алгоритм публичен, его неоднократно выкладывали на разные форумы
— ну так напишите код as3 с нуля, раз алгоритм публичен. Только и можете, что декомпилировать, а потом десятки раз пытаться запустить и подправить, чтоб работало, не разбираясь с сутью.
Вот и получается абсолютно верное замечание:
Я терпеть не могу когда люди вместо того чтобы думать головой, просто воруют код.
— Вы и головой не думаете (алгоритмы же публичны) и код своровали ( разрешения не спросили, декомпилировали ).
kaliban92
14.04.2013, 08:26
Черт возьми, еще один святоша ))
Господа, вы на линуксе с пеленок сидели ? Или может все винду-лицензию пользовали ? Не качали с торрентов ? Не передавали музыку с телефонов в былые времена ?
Вы, уважаемый Hauts, так же как и предыдущий обвинитель, ворюги не меньше моего. Вот только мне, хватает здравого смысла, не упрекать других. Программисты, а бревно в глазу у себя разглядеть не можете.
Я смеюсь в голос ))) Меня поражает степень вашего лицемерия.
p.s. Google+ я открыл тогда в первый раз, т.к других контактов автора я не увидел. А разбираться что да как(пусть даже 5 минут) мне было лень.
p.s.s С исходником я разобрался, все работает. Нужно было изменить тип на Number, и инициализировать начальными значениями.
Тема нарушает правила форума.
На форуме запрещается обсуждение кода, полученного в результате декомпиляции.
Закрыто.
PS. К прочим участникам - прошу воздержаться от флуда по поводу нарушений.
Все меры так или иначе будут приянты.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.