Адаптация кода AS2 к Flex 4.5 - PullRequest
       16

Адаптация кода AS2 к Flex 4.5

0 голосов
/ 31 августа 2011

У меня есть источник вспышки маятника.Я хочу использовать его во Flex.Я заменяю видеоклипы (ball0_mc и ball2_mc) на изображение (hand.png и pend.png) в исходном коде.Но я получаю в конечном приложении другой вид физики, движение замедляется, веревка разрывается от изображений.

Кто-нибудь может посоветовать, что я сделал не так в этом конкретном примере?

Источник AS2:

function lines(Void)
{
   _root.createEmptyMovieClip("lines", _root.getNextHighestDepth());
   with (lines)
   {
       clear();
       lineStyle(1, 0);
       _root.moveTo(ball0_mc._x, ball0_mc._y);
       _root.lineTo(ball2_mc._x, ball2_mc._y);
   }
   return undefined;
}
function verlet(ball)
{
   var __reg3 = ball.mc._x;
   var __reg2 = ball.mc._y;
   ball.mc._x = ball.mc._x + (ball.mc._x - ball.oldx);
   ball.mc._y = ball.mc._y + (ball.mc._y - ball.oldy);
   ball.mc._y = ball.mc._y + grav * dt * dt;
   ball.oldx = __reg3
   ball.oldy = __reg2
}
function constraints(ball0, ball1)
{
   var __reg7 = new flash.geom.Point(ball0.mc._x, ball0.mc._y);
   var __reg6 = new flash.geom.Point(ball1.mc._x, ball1.mc._y);
   var __reg1 = __reg6.subtract(__reg7);
   var __reg5 =Math.sqrt(__reg1.x * __reg1.x) + Math.sqrt(__reg1.y * __reg1.y);
   var __reg4 = (__reg5 - restlength) / __reg5 * (ball0.mass * 1 + ball1.mass * 1);
   ball0.mc._x = ball0.mc._x + ball0.mass * 1 * __reg1.x * __reg4;
   ball0.mc._y = ball0.mc._y + ball0.mass * 1 * __reg1.y * __reg4;
   ball1.mc._x = ball1.mc._x - ball1.mass * 1 * __reg1.x * __reg4;
   ball1.mc._y = ball1.mc._y - ball1.mass * 1 * __reg1.y * __reg4;
   return undefined;
}
var t = 0;
var ct = 0;
var dt = 0;
var particles = new Array();
var ball = new Object();
ball.oldx = ball0_mc._x;
ball.oldy = ball0_mc._y;
ball.mc = ball0_mc;
ball.mass = 0.2;
particles.push(ball);

var ball = new Object();
ball.oldx = ball2_mc._x;
ball.oldy = ball2_mc._y;
ball.mc = ball2_mc;
ball.mass =0.2;
particles.push(ball);
var grav = 0.5;
var restlength = 120;
_root.onEnterFrame = function (Void)
{
   ++t;
   dt = t - ct;
   ct = t;
   var __reg1 = 1;
   while (__reg1 < particles.length) 
   {
       var __reg2 = particles[__reg1];
       verlet(__reg2);
       ++__reg1;
   }
   constraints(particles[0], particles[1]);
   particles[0].mc._x = _xmouse;
   particles[0].mc._y = _ymouse;
   lines();
   return undefined;
}
;

Результат в Flex:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
     xmlns:s="library://ns.adobe.com/flex/spark"
     xmlns:mx="library://ns.adobe.com/flex/mx"
     width="760" height="760" minWidth="760" minHeight="760"
      creationComplete="application1_creationCompleteHandler(event)">

<fx:Script>
 <![CDATA[
    import mx.core.IVisualElement;
    import mx.events.FlexEvent;

    private var t = 0;
    private var ct = 0;
    private var dt = 0;
    private var particles:Array = new Array();
    private var grav = 0.5;
    private var restlength = 120;
    private var mass = 0.2;

    protected function application1_creationCompleteHandler(event:FlexEvent):void
    {
   rope.xFrom = hand.x+30;
   rope.yFrom = hand.y+50;
   rope.xTo = pend.x + 10;
   rope.yTo = pend.y;

   addEventListener(MouseEvent.MOUSE_MOVE, startDragging);
   var ball = new Object();
   ball.oldx = hand.x;
   ball.oldy = hand.y;
   ball.mc = hand;
   ball.mass = 0.2;
   particles.push(ball);

   var ball = new Object();
   ball.oldx = pend.x;
   ball.oldy = pend.y;
   ball.mc = pend;
   ball.mass =0.2;
   particles.push(ball);

   //constraints(particles[1], particles[2]);
    }

    protected function verlet(ball):void
    {
   var __reg3 = ball.mc.x;
   var __reg2 = ball.mc.y;
   ball.mc.x = ball.mc.x + (ball.mc.x - ball.oldx);
   ball.mc.y = ball.mc.y + (ball.mc.y - ball.oldy);
   ball.mc.y = ball.mc.y + grav * dt * dt;
   ball.oldx = __reg3
   ball.oldy = __reg2
    }
    protected function constraints(ball0, ball1):void
    {
   var __reg7 = new flash.geom.Point(ball0.mc.x, ball0.mc.y);
   var __reg6 = new flash.geom.Point(ball1.mc.x, ball1.mc.y);
   var __reg1 = __reg6.subtract(__reg7);
   var __reg5 =Math.sqrt(__reg1.x * __reg1.x) + Math.sqrt(__reg1.y * __reg1.y);
   var __reg4 = (__reg5 - restlength) / __reg5 * (ball0.mass * 1 + ball1.mass * 1);
   ball0.mc.x = ball0.mc.x + ball0.mass * 1 * __reg1.x * __reg4;
   ball0.mc.y = ball0.mc.y + ball0.mass * 1 * __reg1.y * __reg4;
   ball1.mc.x = ball1.mc.x - ball1.mass * 1 * __reg1.x * __reg4;
   ball1.mc.y = ball1.mc.y - ball1.mass * 1 * __reg1.y * __reg4;
    }
    protected function startDragging(event:MouseEvent):void
    {
   hand.x = this.mouseX;
   hand.y = this.mouseY;
   rope.xFrom = hand.x+30;
   rope.yFrom = hand.y+50;
   rope.xTo = pend.x + 10;
   rope.yTo = pend.y;
   ++t;
   dt = t - ct;
   ct = t;
   var __reg1 = 1;
   while (__reg1 < particles.length) 
   {
    var __reg2 = particles[__reg1];
    verlet(__reg2);
    ++__reg1;
   }
   constraints(particles[0], particles[1]);
    }

 ]]>
</fx:Script>
<s:Line id="rope">
 <s:stroke>
    <s:SolidColorStroke color="black" weight="1.2"/>
 </s:stroke>
</s:Line>
<s:Image id="hand" x="365" y="76" smooth="true" source="@Embed('images/hand.png')"/>
<s:Image id="pend" x="410" y="392" smooth="true" source="@Embed('images/pend.png')"/>
</s:Application>

1 Ответ

1 голос
/ 01 сентября 2011

Ответ на эту проблему заключается в том, что вам необходимо понять 1) каков конечный результат каждой функции AS2 и 2) как часто вызывается эта функция.

Например, я не уверен, почему у вас нет проблемы AS2, эквивалентной onEnterFrame в вашей версии Flex. Или что приложение Flex работает со скоростью 24 кадра в секунду, и ваш проект AS2 .fla, вероятно, будет работать с другой частотой кадров.

В вашей гибкой версии вы добавляете этот бизнес перетаскивания, когда в версии AS2 его нет.

Здесь так много вещей, которые вы делаете неправильно, что все сводится к тому, что вам нужно понять назначение каждой функции.

Если это утешительно, имея опыт работы как с AS2, так и с Flex, возможен порт ... но за исключением того, что это невозможно сделать при скорости кадров Flex, превышающей стандартную частоту 24 кадра в секунду. Вы можете попытаться увеличить кадры выше, но вы рискуете, что Flex Framework может вести себя из-за своих изначально разработанных спецификаций и параметров.

...