ActionScript Learning 110701

7.1.2011

2次ベジェ曲線のう渦巻きをアニメーションさせる。

ActionScript Learning 110630-2で制作したうずまきをアニメーションさせる。

ステージをクリックすると渦巻きがアニメーションしながら描かれます。始点か終点をクリックすると巻き戻しのアニメーションをします。

SAMPLE VIEW CODE


package {
	
	import flash.display.*;
	import flash.geom.*;
	import flash.events.*;
	
	
	import org.libspark.betweenas3.BetweenAS3;
	import org.libspark.betweenas3.events.TweenEvent;
	import org.libspark.betweenas3.tweens.*;
	import org.libspark.betweenas3.easing.*;
	

	public class NMain extends MovieClip {
		
		//-------------------------------------------------------------------------------- Properties
		
		private var _this:*;
		private var _stage:Stage;
		

		
		
		//-------------------------------------------------------------------------------- Constractor
		
		public function NMain() {
			
			_this = this;
			_stage = stage;
			
			_stage.scaleMode = StageScaleMode.NO_SCALE;
			_stage.align = StageAlign.TOP_LEFT;		
			
			Init();
		}
		
		
		//-------------------------------------------------------------------------------- Function
		 
		 
		/**
		 * initialize
		 */
		public function Init():void {
			
			setup();
		}
		
		/**
		 * setup
		 */
		private function setup():void {
			
			setup_main();
			
			_stage.addEventListener(MouseEvent.MOUSE_DOWN, _mousedown);
		}
		//
		private function _mousedown(eo:* = null):void {
			
			if(dotover) return;
			
			var _convolution = convolution();
			_convolution.x = _main.mouseX;
			_convolution.y = _main.mouseY;
			
			_main.addChild(_convolution);
		}

		/**
		 * setup
		 */
		private var _main:MovieClip;
		
		private function setup_main():void {
			
			_main = new MovieClip();
			_main.x = Math.round(_stage.stageWidth / 2);
			_main.y = Math.round(_stage.stageHeight / 2);			
			_this.addChild(_main);
		}

		
		/**
		 * convolution
		 */		
		private function convolution():MovieClip {
			
			var _convolution = new MovieClip;
			_convolution.pntsarr = [];
			
			var pntsleng = 24 * 3;
			
			var radius = 200;
			var grawval = radius / pntsleng;
			var repeat = 4;
			var angle = 360 * repeat / pntsleng;			

			for (var i:int = 0; i < pntsleng; i++) {
				
				var pnt = dot(4);//new Object();
				pnt.id = i + 1;
				pnt.x = 0;
				pnt.y = 0;
				pnt.tgtangle = 0;
				pnt.tgtgrawx = 0;
				pnt.tgtgrawy = 0;
				pnt.goalangle = i * angle;
				pnt.goalgrawx = i * grawval;
				pnt.goalgrawy = i * grawval;
				pnt.convolution = _convolution;
				
				//_convolution.addChild(pnt);
				
				_convolution.pntsarr.push(pnt);
			}
			
			//_convolution.goalgraw_ri = grawval * (pntsleng - 1.5);
			_convolution.goalangle_ri = angle * (pntsleng - 1.5);
			
			
			var _dot_s = dot();
			_dot_s.convolution = _convolution;
			_dot_s.addEventListener(MouseEvent.CLICK, dot_s_click);
			
			_convolution.dot_s = _dot_s;
			_convolution.addChild(_dot_s);
			
			var _dot_e = dot(6, 0xAAFFFF);
			_dot_e.convolution = _convolution;
			_dot_e.addEventListener(MouseEvent.CLICK, dot_e_click);
			
			_convolution.dot_e = _dot_e;
			_convolution.addChild(_dot_e);
			
			forward_in(_convolution);

			return _convolution;
		}
		//
		private function pnt_update(eo:* = null):void {
			
			var pnt = eo.currentTarget.target;

			pnt.x = pnt.tgtgrawx * Math.cos(pnt.tgtangle * (Math.PI / 180));
			pnt.y = pnt.tgtgrawy * Math.sin(pnt.tgtangle * (Math.PI / 180));
			
			if(pnt.id == 1) drawaction(pnt.convolution);
		}
		//
		private function dot_s_click(eo:* = null):void {
			
			var _dot_s = eo.currentTarget;
			
			var _convolution = _dot_s.convolution;
			
			var currentstate = _convolution.currentstate;
			
			if(currentstate == "forward_out"|| currentstate == "reverse_in") return;
			
			var pntsarr = _convolution.pntsarr;
			
			for (var i = 0; i < pntsarr.length; i++) {
				
				pntsarr[i].bt.stop();
			}

			if(currentstate == "stop" || currentstate == "forward_in") reverse_out(_convolution);
			else if(currentstate == "reverse_out") forward_in(_convolution);
		}
		//
		private function dot_e_click(eo:* = null):void {			
			
			var _dot_e = eo.currentTarget;
			
			var _convolution = _dot_e.convolution;
			
			var currentstate = _convolution.currentstate;
			
			if(currentstate == "forward_in"|| currentstate == "reverse_out") return;
			
			var pntsarr = _convolution.pntsarr;
			
			for (var i = 0; i < pntsarr.length; i++) {
				
				pntsarr[i].bt.stop();
			}
			
			if(currentstate == "stop" ||currentstate == "forward_out") reverse_in(_convolution);
			else if(currentstate == "reverse_in") forward_out(_convolution);
		}
		/** */
		private function forward_out(tgtmc:MovieClip):void {
			
			forward_in(tgtmc);
			
			tgtmc.currentstate = "forward_out";
		}
		/** */
		private function forward_in(tgtmc:MovieClip):void {
			
			tgtmc.currentstate = "forward_in";
			
			var pntsarr = tgtmc.pntsarr;
			
			for (var i = 0; i < pntsarr.length; i++) {
				
				var pnt = pntsarr[i];
				pnt.bt = BetweenAS3.tween(pnt, {tgtgrawx:pnt.goalgrawx, tgtgrawy:pnt.goalgrawy, tgtangle:pnt.goalangle}, null, 2, Sine.easeOut);
				if(i == 1) pnt.bt.addEventListener(TweenEvent.COMPLETE, forward_complete);	
				pnt.bt.addEventListener(TweenEvent.UPDATE, pnt_update);
				pnt.bt.play();
			}
		}
		/** */
		private function reverse_in(tgtmc:MovieClip):void {
			
			tgtmc.currentstate = "reverse_in";
			
			var pntsarr = tgtmc.pntsarr;
			
			var goalgrawx_ri = Point.distance(new Point(tgtmc.dot_e.x, tgtmc.dot_e.y),  new Point(0, 0));
			var goalgrawy_ri = goalgrawx_ri;
			
			for (var i = 0; i < pntsarr.length; i++) {
				
				var pnt = pntsarr[i];
				pnt.bt = BetweenAS3.tween(pnt, {tgtgrawx:goalgrawx_ri, tgtgrawy:goalgrawy_ri,  tgtangle:tgtmc.goalangle_ri}, null, 1.2, Sine.easeOut);				
				pnt.bt.addEventListener(TweenEvent.UPDATE, pnt_update);	
				if(i == 0) pnt.bt.addEventListener(TweenEvent.COMPLETE, reverse_complete);	
				pnt.bt.play();
			}
			
			pntsarr[pntsarr.length - 1].x = tgtmc.dot_e.x;
			pntsarr[pntsarr.length - 1].y = tgtmc.dot_e.y;
		}
		/** */
		private function reverse_out(tgtmc:MovieClip):void {
			
			tgtmc.currentstate = "reverse_out";
			
			var pntsarr = tgtmc.pntsarr;
			
			for (var i = 0; i < pntsarr.length; i++) {
				
				var pnt = pntsarr[i];				
				pnt.bt = BetweenAS3.tween(pnt, {tgtgrawx:0, tgtgrawy:0, tgtangle:0}, null, 1.2, Sine.easeOut);				
				pnt.bt.addEventListener(TweenEvent.UPDATE, pnt_update);	
				if(i == pntsarr.length - 1) pnt.bt.addEventListener(TweenEvent.COMPLETE, reverse_complete);	
				pnt.bt.play();
			}
		}
		//
		private function reverse_complete(eo:* = null):void {
			
			var pnt = eo.currentTarget.target;
			
			var _convolution = pnt.convolution;
			
			_main.removeChild(_convolution);
		}
		//
		private function forward_complete(eo:* = null):void {
			
			var pnt = eo.currentTarget.target;
			
			var _convolution = pnt.convolution;
			
			_convolution.currentstate = "stop";
		}

		
		/**
		 * draw action
		 */		
		private function drawaction(tgtmc:MovieClip):void {
			
			var pntsarr = tgtmc.pntsarr;
			var currentstate = tgtmc.currentstate;
			
			var _dot_s = tgtmc.dot_s;
			var _dot_e = tgtmc.dot_e;

			var g = tgtmc.graphics;
			g.clear();			
			g.lineStyle(4, 0xEEEEEE, .6);
			
			var stax:Number;
			var stay:Number;
			var ancx:Number;
			var ancy:Number;
			
			if(currentstate == "forward_in" || currentstate == "reverse_out") {
				
				stax = pntsarr[0].x;
				stay = pntsarr[0].y;
				g.moveTo(stax, stay);
				
				_dot_s.x = pntsarr[0].x;
				_dot_s.y = pntsarr[0].y;
				
				for(var i = 1; i < pntsarr.length - 1; i ++) {				
						
					ancx = (pntsarr[i].x + pntsarr[i + 1].x) / 2;
					ancy = (pntsarr[i].y + pntsarr[i + 1].y) / 2;
					
					g.curveTo(pntsarr[i].x, pntsarr[i].y, ancx, ancy);
				}

				_dot_e.x = ancx;
				_dot_e.y = ancy;
			}
			else {
				
				stax = (pntsarr[pntsarr.length - 1].x + pntsarr[pntsarr.length - 2].x) / 2;
				stay = (pntsarr[pntsarr.length - 1].y + pntsarr[pntsarr.length - 2].y) / 2;
				
				g.moveTo(stax, stay)
				
				for(var j = 1; j < pntsarr.length - 1; j++) {				
						
					ancx = (pntsarr[pntsarr.length - 1 - j].x + pntsarr[pntsarr.length - 1 - j - 1].x) / 2;
					ancy = (pntsarr[pntsarr.length - 1 - j].y + pntsarr[pntsarr.length - 1 - j - 1].y) / 2;
					
					g.curveTo(pntsarr[pntsarr.length - 1 - j].x, pntsarr[pntsarr.length - 1 - j].y, ancx, ancy);
				}

				_dot_s.x = ancx;
				_dot_s.y = ancy;
			}
		}
		
		/**
		 * dot
		 */
		private var dotover:Boolean;
		
		private function dot(rad:Number = 6, col:Number = 0xFFAAFF):MovieClip {
		
			var _dot = new MovieClip();
			
			var g = _dot.graphics;
			g.beginFill(col, 1);
			g.drawCircle(0, 0, rad);
			
			_dot.buttonMode = true;
			
			_dot.addEventListener(MouseEvent.MOUSE_OVER, function(){dotover = true});
			_dot.addEventListener(MouseEvent.MOUSE_OUT, function(){dotover = false});
			
			return _dot;
		}
    }
}



category : ActionScript / BetweenAS3 / Flash

Demonstrations

Feature Samples

Author

虹村 マキオウ (nizimura makiou)

猫と太極拳を愛する横浜在住のフリーランスクリエイターです。

logo

Demo and Sample

Category