Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Почему объект ускоряется? (http://www.flasher.ru/forum/showthread.php?t=203003)

Chelovek 25.08.2013 23:45

Почему объект ускоряется?
 
Вложений: 1
Здравствуйте. Есть код:
Код AS3:

package 
{
        import flash.display.*;
        import flash.events.*;
        import flash.text.*;
        import flash.utils.*;
        import flash.net.*;
        import flash.media.*;
        import flash.geom.*;
 
        public class list extends Sprite
        {
                public function list()
                {
                        var list_new1:MiniList_new1 = new MiniList_new1();
                        var list_new2:MiniList_new2 = new MiniList_new2();
                        var list_new3:MiniList_new3 = new MiniList_new3();
                        var list_new4:MiniList_new4 = new MiniList_new4();
                        var list_new5:MiniList_new5 = new MiniList_new5();
                        addChild(list_new1);
                        list_new1.y = 0;
                        addChild(list_new2);
                        list_new2.y = 778.5;
                        addChild(list_new3);
                        list_new3.y = 1557;
                        addChild(list_new4);
                        list_new4.y = 2335.5;
                        addChild(list_new5);
                        list_new5.y = 3114;
                }
        }
}

Код AS3:

import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.*;
import flash.net.*;
import flash.media.*;
import list;
var l:Boolean = false;
var mcList:list = new list();
var mouse_y:int;
var speed:Number = 0;
var dd:Number = new Number();
mcList.x = stage.stageWidth / 2;
mcList.y = 450;
addChild(mcList);
stage.addEventListener(Event.ENTER_FRAME, _enterFrame);
stage.addEventListener(MouseEvent.MOUSE_DOWN, mcListDown);
stage.addEventListener(MouseEvent.MOUSE_UP, mcListUp);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mcListMove);
function _enterFrame(e:Event)
{
        if (mcList.y > 895)
        {
                mcList.y = 895;
        }
        if (mcList.y < -3088)
        {
                mcList.y = -3088;
        }
}
function mcListDown(e:MouseEvent)
{
        l = true;
}
function mcListUp(e:MouseEvent)
{
        l = false;
        for (var d:int = 0; d < 5; d++)
        {
 
                if (mcList.y > (450 + (-779 * d)) - 450 && mcList.y < (450 + (-779 * d)) + 450)
                {
                        speed = 0;
                        if (mcList.y < 450 + (-779 * d))
                        {
                                speed = 20;
                        }
                        if (mcList.y > 450 + (-779 * d))
                        {
                                speed = -20;
                        }
                        dd = d;
                        stage.addEventListener(Event.ENTER_FRAME, _enterFrame);
                        function _enterFrame(e:Event)
                        {
                                mcList.y +=  speed;
                                if (speed == 20)
                                {
                                        if (mcList.y > 450 + (-779 * dd))
                                        {
                                                speed = 0;
                                                mcList.y = 450 + (-779 * dd);
                                        }
                                }
                                if (speed == -20)
                                {
                                        if (mcList.y < 450 + (-779 * dd))
                                        {
                                                speed = 0;
                                                mcList.y = 450 + (-779 * dd);
                                        }
                                }
                        }
                }
        }
}
function mcListMove(e:MouseEvent)
{
        if (l == true)
        {
                mcList.y +=  stage.mouseY - mouse_y;
        }
        mouse_y = stage.mouseY;
        e.updateAfterEvent();
}

Здесь на сцену добавляются 5 квадратов 745х745. Реализовывается перетаскивание контейнера в котором они находятся и квадрат который находится ближе всех к центру двигается к центру(то есть контейнер двигается так что бы нужный квадрат находился по центру).
Но вот в чём проблема здесь скорость движения 20 пикселей, но потом (через несколько перемещений) они ускоряются и перемещаются мнгновенно. Я не могу понять почему. Помогите.

Wolsh 26.08.2013 00:13

Исходник не смотрел, по коду скажу:
1. Зачем называть функции одинаково? Сами не путаетесь?
2. У Вас две подписки на ENTER_FRAME и ни одной отписки.
3. Вторая функция _enterFrame вложенная. Когда условие выполняется, происходит подписка с этим обработчиком, и он будет выполняться каждый кадр по крайней мере, пока существует объект. Параллельно с другой функцией _enterFrame. Вам правда так нужно? И Вы уверены, что подписали именно этот вложенный обработчик, а не тот что на уровне класса? Зачем усложнять себе жизнь?

Chelovek 26.08.2013 13:52

Wolsh, спасибо! Сделал вот так:
Код AS3:

package 
{
        import flash.display.*;
        import flash.events.*;
        import flash.text.*;
        import flash.utils.*;
        import flash.net.*;
        import flash.media.*;
        import flash.geom.*;
 
        public class list extends Sprite
        {
                public function list()
                {
                        var list_new1:MiniList_new1 = new MiniList_new1();
                        var list_new2:MiniList_new2 = new MiniList_new2();
                        var list_new3:MiniList_new3 = new MiniList_new3();
                        var list_new4:MiniList_new4 = new MiniList_new4();
                        var list_new5:MiniList_new5 = new MiniList_new5();
                        addChild(list_new1);
                        list_new1.y = 0;
                        addChild(list_new2);
                        list_new2.y = 778.5;
                        addChild(list_new3);
                        list_new3.y = 1557;
                        addChild(list_new4);
                        list_new4.y = 2335.5;
                        addChild(list_new5);
                        list_new5.y = 3114;
                }
        }
}

Код AS3:

import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.*;
import flash.net.*;
import flash.media.*;
import list;
var timer:Timer = new Timer(1);
var l:Boolean = false;
var mcList:list = new list();
var mouse_y:int;
var speed:Number = 0;
var dd:Number = new Number();
mcList.x = stage.stageWidth / 2;
mcList.y = 450;
addChild(mcList);
stage.addEventListener(Event.ENTER_FRAME, _enterFrame);
stage.addEventListener(MouseEvent.MOUSE_DOWN, mcListDown);
stage.addEventListener(MouseEvent.MOUSE_UP, mcListUp);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mcListMove);
function _enterFrame(e:Event)
{
        if (mcList.y > 895)
        {
                mcList.y = 895;
        }
        if (mcList.y < -3088)
        {
                mcList.y = -3088;
        }
        mcList.y +=  speed;
        if (speed == 20)
        {
                if (mcList.y > 450 + (-779 * dd))
                {
                        speed = 0;
                        mcList.y = 450 + (-779 * dd);
                }
        }
        if (speed == -20)
        {
                if (mcList.y < 450 + (-779 * dd))
                {
                        speed = 0;
                        mcList.y = 450 + (-779 * dd);
                }
        }
}
function mcListDown(e:MouseEvent)
{
        l = true;
}
function mcListUp(e:MouseEvent)
{
        l = false;
        for (var d:int = 0; d < 5; d++)
        {
 
                if (mcList.y > (450 + (-779 * d)) - 450 && mcList.y < (450 + (-779 * d)) + 450)
                {
                        speed = 0;
                        if (mcList.y < 450 + (-779 * d))
                        {
                                speed = 20;
                        }
                        if (mcList.y > 450 + (-779 * d))
                        {
                                speed = -20;
                        }
                        dd = d;
                }
        }
        timer.start();
}
function mcListMove(e:MouseEvent)
{
        if (l == true)
        {
                mcList.y +=  stage.mouseY - mouse_y;
        }
        mouse_y = stage.mouseY;
        e.updateAfterEvent();
}

Теперь всё нормально работает!


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

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