сценарий с эластичной строкой приводит к аварийному завершению - PullRequest
0 голосов
/ 05 февраля 2012

Я над головой в этом проекте AS3.

Я не эксперт в ActionScript и, конечно, не в AS3, но мне удалось создать (с помощью этого: http://swamy-techtalk.blogspot.com/2011/07/elastic-string-to-mouse-pointer-effect.html) эффект эластичной строки из точки в перетаскиваемый фрагмент ролика.

Проблема в сценариикажется, сбой флэш-памяти или браузера, когда я тестирую его.(Не сразу, когда я играю с мувиклипом)

Так как я нахожусь над головой в скомпилированном мной сценарии, я не совсем уверен, что не так.Небольшое исследование Google намекнуло, что это может быть связано с removeChildAt (), который я изменил с removeChildAt (0) на removeChildAt (1), чтобы предотвратить удаление моего мувиклипа.Прочитайте мой сценарий, чтобы увидеть, что я сделал неправильно.

Пример здесь: http://www.madsringblom.dk/flash/pullstring.html (будьте осторожны, это может привести к сбою вашего браузера) Код ниже:

Object(this).leaf_mc.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 

var origX:int = Object(this).leaf_mc.x + 1; 
var origY:int = Object(this).leaf_mc.y + 2; 
var pullbackX:int = Object(this).leaf_mc.x; 
var pullbackY:int = Object(this).leaf_mc.y; 
var dragging:Boolean = false; 

//speed of pulling and rotating back when stop dragging. 

var speed:int = 15; 
var addX:int = 2 
var addY:int = 3 

function mouseDownHandler(e:MouseEvent):void 
{ 
    var obj = e.target; 
    obj.startDrag(); 
    dragging = true; 

} 

function mouseUpHandler(e:MouseEvent):void 
{  
    var obj = e.target; 
    Object(this).leaf_mc.stopDrag(); 
    dragging = false; 

} 

import flash.display.*; 
import flash.events.MouseEvent; 
import flash.events.Event; 

var haschild:Boolean = false; 
var gotonodes:Array = new Array(); 
var currentnodes:Array = new Array(); 

var posX:int = Object(this).leaf_mc.x + addX; 
var posY:int = Object(this).leaf_mc.y + addY; 
gotonodes = Interpolate(posX,posY,origX,origY,25); 
currentnodes = gotonodes; 
stage.addEventListener(Event.ENTER_FRAME, onmove1); 

function onmove1(e:Event)
{ 
    for (var node = 0; node < gotonodes.length - 1; node++)
    { 
        currentnodes[node].xco=currentnodes[node].xco+(gotonodes[node].xco-currentnodes[node].xco)/(node*node/30+1); 
        currentnodes[node].yco=currentnodes[node].yco+(gotonodes[node].yco-currentnodes[node].yco)/(node*node/30+1); 
    }

    var posX:int = Object(this).leaf_mc.x + addX; 
    var posY:int = Object(this).leaf_mc.y + addY; 
    gotonodes=Interpolate(posX,posY,origX,origY,25); 

    // pull leaf_mc back to starting point when released. And rotate back. 

    if (dragging == false)
    { 
        Object(this).leaf_mc.x-=(Object(this).leaf_mc.x-pullbackX)/speed; 
        Object(this).leaf_mc.y-=(Object(this).leaf_mc.y-pullbackY)/speed; 
        Object(this).leaf_mc.rotation+=Object(this).leaf_mc.rotation/speed; 
    } 

    // rotating the leaf_mc according to the point (origX,origY) 

    var theX:int = origX - Object(this).leaf_mc.x; 
    var theY:int = (origY - Object(this).leaf_mc.y) * -1; 
    var angle = Math.atan(theY/theX)/(Math.PI/180); 
    Math.atan( -5 / 10) / (Math.PI / 180); 

    if (theX < 0) 
    { 
        angle += 180; 
    } 

    if (theX >= 0 && theY < 0) 
    { 
        angle += 360; 
    } 

    Object(this).leaf_mc.rotation = (angle*-1) + 90; 

    DrawNodes(currentnodes); 

} 

function FindAngle(x1, x2, y1, y2):Number 
{ 
    return Math.atan2(y2-y1, x2-x1); 
}; 

function Distance(x1, x2, y1, y2):Number
{ 
    return Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2)); 
} 

function Interpolate(x1, y1, x2, y2, n):Array
{ 
    var dist= Distance(x1,x2,y1,y2); 
    var ang = FindAngle(x1,x2,y1,y2); 
    var points = [];

    for (var l = 0; l <= dist; l += dist / n)
    { 
        var x3 =x1+l*Math.cos(ang); 
        var y3 = y1+l*Math.sin(ang); 
        points.push({xco:x3,yco:y3}); 
    } 

    points.push( { xco:x1, yco:y1 } ); 

    return points; 

} 

function DrawNodes(array):void
{ 
    if(haschild) 
    { 
        this.removeChildAt(1); 
        haschild=false; 
    } 

    var shape:Shape = new Shape(); 
    shape.graphics.lineStyle(1,0x331100,40); 
    shape.graphics.moveTo(array[0].xco, array[0].yco);

    for (var i = 0; i < array.length - 1; i++)
    { 
        shape.graphics.lineTo(array[i].xco,array[i].yco); 
    } 

    shape.graphics.beginFill(0xFBFFA4,1); 
    shape.graphics.drawCircle(array[0].xco,array[0].yco,1); 
    shape.graphics.endFill(); 
    this.addChild(shape); 
    haschild = true;

} 

1 Ответ

0 голосов
/ 06 февраля 2012

Где находится этот код?Из того, что вы вставили, я думаю о сцене.

A stop(); где-то в сценарии может послужить началом и немного помочь - в противном случае Flash-ролик будет зацикливаться, и каждый раз, когда он попадает в этокадр (каждый кадр, если у вас есть только один), вы добавите новые обработчики событий и т. д. В конце концов вам не хватит памяти, а обработчик событий onmove1 израсходует ваш ЦП, работая 50 раз за кадр после 50 кадров, 200 раз после 200 кадров и т. Д.

...