Показать сообщение отдельно
Старый 15.02.2012, 20:00
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 1  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
По умолчанию Мой твин ускоряется со временем.

Вот код твина:
Код 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)]-параметры[переменная])/(количество движений-количество сделанных движений)


Последний раз редактировалось MikroAcse; 15.02.2012 в 20:16.