ActionScript Learning 110615

6.15.2011

Flashでめくる動作を表現するアクションを制作する。

紙やシールなどの薄いものをめくる表現を制作する。MatrixとPointを使用してなるべくシンプルなコードになるように制作した。

ピンで止められたような移動制限も実装してみた。てんとう虫を移動すると移動制限の変化を確認できる。
めくる動作を開始する位置で、めくりのアクションの方向を決定する必要があったので ActionScript Learning 110613で制作したコードを使用する。
めくる途中でおかしな動作をさせないために、移動制限のある場合と無い場合で、マウス座標の取得方法に調整が必要だった。

SAMPLE VIEW CODE

package {
	
	import flash.display.*;
	import flash.text.*;
	import flash.filters.*;
	import flash.geom.*;
	import flash.events.*;
	import flash.ui.*;

	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 var sheetwid:Number;
		private var sheethei:Number;
		private var hitarea:Number;

		private function setup():void {
			
			sheetwid = 260;
			sheethei = 260;
			hitarea = 40;
			
			setup_seal_1();			
			setup_seal_2();
		}
		
		/**
		 * setup seal_1
		 */
		private var _seal_1:MovieClip;
		private var _ladybug:MovieClip;
		
		private function setup_seal_1():void {
			
			_seal_1 = new NM_Sealflip();
			
			_seal_1.x = Math.round(_stage.stageWidth / 2 - sheetwid - 40);
			_seal_1.y = Math.round(_stage.stageHeight / 2 - sheethei / 2);
			
			var _sheet_base = new sheet_a();
			var _sheet_hide = new sheet_b();
			var _sheet_show = new sheet_show();
			
			setup_sheets(_seal_1, _sheet_base, _sheet_hide, _sheet_show);
			
			var args = {};
			args.stage = _stage;
			args.sheetwid = sheetwid;
			args.sheethei = sheethei;
			args.hitarea = hitarea;
			args.sheet_hide = _sheet_hide;
			args.sheet_show = _sheet_show;
			
			_seal_1.Init(args);
			
			_ladybug = new ladybug();
			_ladybug.scaleX = _ladybug.scaleY = .6;
			_ladybug.filters = [new DropShadowFilter(4, 50, 0x000000, .4, 10, 10)];
			_ladybug.buttonMode = true;
			
			_seal_1.setLimitPin(_ladybug, 50, 50);
			
			_seal_1.addEventListener("limitpinmove", limitpinmove);
			
			_seal_1.addEventListener("start", function(){
														_this.setChildIndex(_seal_1, _this.numChildren - 1);
														_seal_2.mouseEnabled = false;
														_seal_2.mouseChildren = false;
														Mouse.cursor = "hand";
														});
			
			_seal_1.addEventListener("stop", function(){
														Mouse.cursor = "auto";
														});
			
			_seal_1.addEventListener("over", function(){
														Mouse.cursor = "hand";
														});
			
			_seal_1.addEventListener("return", function(){
														_seal_2.mouseEnabled = true;
														_seal_2.mouseChildren = true;
														Mouse.cursor = "auto";
														});
			
			
			
			_this.addChild(_seal_1);
		}
		//
		private function limitpinmove(eo:* = null):void {
			
			var _limitpin = _seal_1.limitPin;
			
			_ladybug.Rotation = -90 + Math.atan2(sheethei / 2 - _limitpin.y, sheetwid / 2 - _limitpin.x) * (180 / Math.PI);
		}

		/**
		 * setup seal_2
		 */
		private var _seal_2:MovieClip;
		
		private function setup_seal_2():void {
			
			_seal_2 = new NM_Sealflip();
			
			_seal_2.x = Math.round(_stage.stageWidth / 2 + 40);
			_seal_2.y = Math.round(_stage.stageHeight / 2 - sheethei / 2);
			
			var _sheet_base = new sheet_a();
			var _sheet_hide = new sheet_b();
			var _sheet_show = new sheet_show();
			
			setup_sheets(_seal_2, _sheet_base, _sheet_hide, _sheet_show);
			
			var args = {};
			args.stage = _stage;
			args.sheetwid = sheetwid;
			args.sheethei = sheethei;
			args.hitarea = hitarea;
			args.sheet_hide = _sheet_hide;
			args.sheet_show = _sheet_show;
			
			_seal_2.Init(args);
			
			_seal_2.addEventListener("start", function(){
														_this.setChildIndex(_seal_2, _this.numChildren - 1);
														_seal_1.mouseEnabled = false;
														_seal_1.mouseChildren = false;
														Mouse.cursor = "hand";
														});
			
			_seal_2.addEventListener("stop", function(){
														Mouse.cursor = "auto";
														});
			
			_seal_2.addEventListener("over", function(){
														Mouse.cursor = "hand";
														});
			
			_seal_2.addEventListener("return", function(){
														_seal_1.mouseEnabled = true;
														_seal_1.mouseChildren = true;
														Mouse.cursor = "auto";
														});
			

			_this.addChild(_seal_2);
		}

		/**
		 * setup sheets
		 */
		private function setup_sheets(tgtseal:MovieClip, _sheet_base:MovieClip, _sheet_hide:MovieClip, _sheet_show:MovieClip):void {
			
			var sheettextnum = new String(Math.floor(Math.random() * 10) + 1);
			
			setsheettext(_sheet_base["t"], sheettextnum);
			tgtseal.addChild(_sheet_base);			
			
			setsheettext(_sheet_hide["t"], sheettextnum);
			tgtseal.addChild(_sheet_hide);			
			
			var sheetshowmc = new MovieClip();
			var sheetshowbitmapdata = new BitmapData(sheetwid, sheethei, false, 0xFFFFFF);
			var sheetshowbitmapmatrix = new Matrix();
			sheetshowbitmapmatrix.scale(-1, 1);
			sheetshowbitmapmatrix.translate(sheetwid, 0);
			sheetshowbitmapdata.draw(_sheet_hide, sheetshowbitmapmatrix);
			sheetshowmc.addChild(new Bitmap(sheetshowbitmapdata));
			var filter = new BlurFilter();
			filter.blurX = filter.blurY = 1.2;
			filter.quality = 100;
			sheetshowmc.filters = [filter];
			sheetshowmc.mask = _sheet_show["m"];
			sheetshowmc.alpha = .6;
			_sheet_show.addChildAt(sheetshowmc, 1);
		}
		//
		private function setsheettext(tgttg:TextField, sheettextnum:String):void {
			
			tgttg.width = 0;
			tgttg.height = 0;
			tgttg.autoSize = "left";
			tgttg.multiline = false;
			tgttg.wordWrap = false;
			//tgttg.border = true;			
			
			var f:TextFormat = new TextFormat();
			
			if(sheettextnum.length > 1) {
				
				f.letterSpacing = -30;
				f.rightMargin = 40;
			}
			
			tgttg.defaultTextFormat = f;
			
			tgttg.text = sheettextnum;
			
			tgttg.x = (sheetwid - tgttg.width) / 2;
			tgttg.y = (sheethei - tgttg.height) / 2;
		}
		

		
	}
}



category : ActionScript / Flash

Demonstrations

Feature Samples

Author

虹村 マキオウ (nizimura makiou)

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

logo

Demo and Sample

Category