Форум 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=175378)

MikroAcse 15.02.2012 20:00

Мой твин ускоряется со временем.
 
Вот код твина:
Код AS3:

package  MikroacseAS3Lib.Tween{
        import flash.utils.Timer;
        import flash.events.TimerEvent;
        import flash.display.Sprite;
        import flash.system.System;
 
        public class MTween {
 
 
        private var p:Object;
                private var o:Object;
                private var osp:Sprite;
                private var c:Number;
                private var vars:Array;
                private var t:Timer;
                private var finishFunction:Function;
                private var playFunction:Function;
                private var startFunction:Function;
                public var currentCount:Number;
                public var stopped:Boolean;
                public var paused:Boolean;
 
                public function MTween(objectToTween:Object,countOfMoves:Number,parameters:Object) {
                        osp=new Sprite()
 
                        c=Math.floor(countOfMoves)||60
                        p=parameters
                        o=objectToTween
                        currentCount=0
                        vars=[]
                        stopped=false
                        paused=false
                        finishFunction=parameters['onFinish']
                        playFunction=parameters['onPlay']
                        startFunction=parameters['onStart']
 
 
                        t=new Timer(1,c)
 
                        for(var strObj:String in p){
                                if(strObj!='onFinish'&&strObj!='onPlay'&&strObj!='onStart'){
 
                            osp[strObj]=o[strObj]
 
                                vars.push([p[strObj], (osp[strObj]-p[strObj])/c ,strObj])
 
                                }
                        }
 
                        if(p['onStart']){
                        startFunction()
                    }
 
                        t.start()
            t.addEventListener(TimerEvent.TIMER,EnterTimer)
                        t.addEventListener(TimerEvent.TIMER_COMPLETE,EnterTimerFinish)
                }
                //--------------------------------
            private function EnterTimer(e:TimerEvent){
 
                        if(currentCount==c){
                                currentCount=0
                                stop()
                        }
 
                        for(var param=0;param<vars.length;param++){
                                osp[vars[param][2]]-=vars[param][1]
 
                                o[vars[param][2]]=osp[vars[param][2]]
 
                                vars[param]=[p[vars[param][2]], (osp[vars[param][2]]-p[vars[param][2]])/(c-currentCount) ,vars[param][2]]
                        }
 
                        if(p['onPlay']){
                                playFunction()
                        }
 
                    currentCount++
                }
                private function EnterTimerFinish(e:TimerEvent){
                        for(var paramFinish=0;paramFinish<vars.length;paramFinish++){
                                o[vars[paramFinish][2]]=vars[paramFinish][0]
                                osp[vars[paramFinish][2]]=vars[paramFinish][0]
                        }
 
                        if(p['onFinish']){
                                finishFunction()
                        }
 
                        stopped=true
                }
                //--------------------------------
                public function play(){
                        if(!t.running&&!stopped){
                                t.start()
                                paused=false
                        }
                }
                public function pause(){
                        if(t.running&&!stopped){
                                t.stop()
                                paused=true
                        }
                }
                public function stop(){
                        if(t.running&&!stopped){
                                t.stop()
                                t.reset()
                                stopped=true
                                currentCount=0
                        }
                }
                public static function create(target:Object,counts:Number,objectParameters:Object):MTween{
                        return new MTween(target,counts,objectParameters)
                }
        }
 
}

Данные о MovieClip передаю в Sprite, т.к. если использовать сразу MovieClip, то в нем параметры округляются до 0.05 .

Вызываю так:
Код AS3:

import MikroacseAS3Lib.Tween.*
MTween.create(mc,705,{rotation:1000})

Собственно, вот что выходит:
Dropbox

Добавлено через 15 минут
Такое ощущение, что с формулой что-то не так:
Код AS3:

(osp[vars[param][2]]-p[vars[param][2]])/(c-currentCount)

Перевод :)
(объект[переменная(например,x)]-параметры[переменная])/(количество движений-количество сделанных движений)

Stitch512 15.02.2012 20:36

Ужос какой, куча скобочек, @#$ что разбереш, вы бы оформили что ле код...
А на вскидку, возможно у вас нелинейная зависимость, вот к примеру как я интерполирую.
Код AS3:

left / time * (_to - _from) + _from;

Перевод
left - прошедшее время
time - время анимации
_to - начальное значение параметра
_from - конечное значение параметра

Добавлено через 3 минуты
зы.
Зачем же на блог то код выкладывать если он не рабочий...
И ссылка на дропбокс авторизации требует.

MikroAcse 15.02.2012 22:17

Код AS3:

Зачем же на блог то код выкладывать если он не рабочий...

На блоге рабочий код.

Спасибо за формулу. Скоро испробую

-De- 15.02.2012 22:30

И напишите, пожалуйста, Object вместо Sprite %)

MikroAcse 15.02.2012 23:16

Цитата:

И напишите, пожалуйста, Object вместо Sprite %)
Object округляет значения до 0.05
Например:
Код AS3:

var obj:Object=new Object()
obj.x=0.188
trace(obj.x) //0.185


udaaff 15.02.2012 23:25

О боже... Ознакомьтесь с конвенциями по написанию кода. Например, тут http://opensource.adobe.com/wiki/dis...ng+Conventions

Вместо того, чтобы городить огород из скобок, записывайте значения в переменные.

-De- 15.02.2012 23:37

У меня 0.188 трейсит. Вы сами-то запускали перед тем как //0.185 написать?

Inet_PC 15.02.2012 23:56

А void и ; Вам религия не позволяет использовать? Ну подписались Вы на события таймера, а отписываться кто будет?

MikroAcse 15.02.2012 23:56

-De-, ну да, только немного другие параметры.
Странно, только что испробовал obj.myX=0.123456 и выдало в Output: 0.123456.
Ну ладно, спасибо, что подправил.

Добавлено через 9 минут
Все, исправил.
Заработало.
Поменял Sprite на Object.
Подправил:
Код AS3:

(osp[vars[param][2]]-p[vars[param][2]])/(c-currentCount)

На:
Код AS3:

paramDifferenceNumber/timeDivisionNumber

Добавлено через 10 минут
Зачем void нужен?


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

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