ActionScript Learning 110618-2

6.18.2011

本のページを連続でめくる動作を表現する。

ActionScript Learning 110618で制作したアクションを改良して、 ドラッグではなくボタンからの呼び出しでページを連続でめくる表現を制作する。

連続でめくる時の、ページと影の重なりの順番を調整するのに苦労した。何ページ目をめくっているか(めくったか)を監視しておくのに、右ページと左ページを個別に任意のタイミングでカウントする必要があった。 (ページは永遠にめくれます。)

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 var currentpid_l:int;
		private var currentpid_r:int;

		private function setup():void {
			
			currentpid_l = 1;
			currentpid_r = 2;
			
			sheetwid = 280;
			sheethei = 280;
			hitarea = 40;
			
			setup_pages();
			
			setup_chainflip();
			
			setup_buttons();
		}
		
		/**
		 * setup buttons
		 */
		private var _btn_next:MovieClip;
		private var _btn_back:MovieClip;
		
		private function setup_buttons():void {
			
			_btn_next = new btn_next();
			_btn_next.x = Math.round(_stage.stageWidth / 2) + 30;
			_btn_next.y = 420;
			_btn_next.buttonMode = true;
			_btn_next["ov"].visible = false;
			_this.addChildAt(_btn_next, 0);
			
			_btn_next.addEventListener(MouseEvent.MOUSE_OVER, function(){_btn_next["ov"].visible = true;});
			_btn_next.addEventListener(MouseEvent.MOUSE_OUT, function(){_btn_next["ov"].visible = false;});
			_btn_next.addEventListener(MouseEvent.CLICK, btn_next_click);
			
			
			_btn_back = new btn_back();
			_btn_back.x = Math.round(_stage.stageWidth / 2) - 30;
			_btn_back.y = 420;
			_btn_back.buttonMode = true;
			_btn_back["ov"].visible = false;
			_this.addChildAt(_btn_back, 0);
			
			_btn_back.addEventListener(MouseEvent.MOUSE_OVER, function(){_btn_back["ov"].visible = true;});
			_btn_back.addEventListener(MouseEvent.MOUSE_OUT, function(){_btn_back["ov"].visible = false;});
			_btn_back.addEventListener(MouseEvent.CLICK, btn_back_click);
		}
		//
		private function btn_next_click(eo:* = null):void {
			
			if(_chainflip.numChildren >= 70) return;
			
			chainflip_next();
		}
		//
		private function btn_back_click(eo:* = null):void {
			
			if(_chainflip.numChildren >= 70) return;
			
			chainflip_prev();
		}
		
		/**
		 * setup pages
		 */
		private var _page_l:MovieClip;
		private var _page_r:MovieClip;
		
		private function setup_pages():void {
			
			_page_l = page();
			_page_l.x = Math.round(_stage.stageWidth / 2 - sheetwid);
			_page_l.y = Math.round(_stage.stageHeight / 2 - sheethei / 2) - 20;
			
			page_settext(_page_l, currentpid_l);
			_this.addChild(_page_l);
			
			_page_r = page();
			_page_r.x = Math.round(_stage.stageWidth / 2);
			_page_r.y = Math.round(_stage.stageHeight / 2 - sheethei / 2) - 20;
			
			page_settext(_page_r, currentpid_r);
			_this.addChild(_page_r);
		}
		
		/**
		 * chainflip
		 */
		private var _chainflip:MovieClip;
		private var flippages_next:Array;
		private var flippages_prev:Array;
		private var flipet:Number;
		private var returnet:Number;
		
		private function setup_chainflip():void {
			
			flippages_next = new Array();
			flippages_prev = new Array();
			
			_chainflip = new MovieClip();			
			_chainflip.x = _page_l.x;
			_chainflip.y = _page_l.y;			
			_this.addChild(_chainflip);
			
			flipet = 1;
			returnet = 1;
		}		
		/** */
		private function chainflip_next():void {
			
			for(var i = 0; i < flippages_prev.length; i ++) {
				
				if(flippages_prev[flippages_prev.length - 1 - i].autoflipType == "turn") flippages_prev[flippages_prev.length - 1 - i].returnAutoFlip(returnet);
			}

			var pagename = "flip_" + (currentpid_r + 2);

			if(flippages_next.length < 1 || flippages_next[flippages_next.length - 1].name != pagename) {
				
				var _flippage_next = flippage_next();
				_flippage_next.name = pagename;
				_flippage_next.pageIdShow = currentpid_r + 1;
				_flippage_next.pageIdHide = currentpid_r;				
				flippages_next.push(_flippage_next);
				
				_flippage_next.startAutoFlip(flipet);
				
				currentpid_r += 2;
				
				page_settext(_page_r, currentpid_r);
			}
			
			for(var j = 0; j < flippages_next.length; j ++) {
				
				if(flippages_next[j].autoflipType == "return") flippages_next[j].startAutoFlip(flipet);
			}
		}
		/** */
		private function chainflip_prev():void {
			
			for(var i = 0; i < flippages_next.length; i ++) {
				
				if(flippages_next[flippages_next.length - 1 - i].autoflipType == "turn") flippages_next[flippages_next.length - 1 - i].returnAutoFlip(returnet);
			}

			var pagename = "flip_" + (currentpid_l - 2);
			
			if(flippages_prev.length < 1 || flippages_prev[flippages_prev.length - 1].name != pagename) {
				
				var _flippage_prev = flippage_prev();
				_flippage_prev.name = pagename;
				_flippage_prev.pageIdShow = currentpid_l - 1;
				_flippage_prev.pageIdHide = currentpid_l;				
				flippages_prev.push(_flippage_prev);
				
				_flippage_prev.startAutoFlip(flipet);
				
				currentpid_l -= 2;
				
				page_settext(_page_l, currentpid_l);
			}
			
			for(var j = 0; j < flippages_prev.length; j ++) {
				
				if(flippages_prev[j].autoflipType == "return") flippages_prev[j].startAutoFlip(flipet);
			}
		}

		/**
		 * flippage_next
		 */
		private function flippage_next():MovieClip {
			
			var _flippage = new NM_Autoflip();
			
			var args = {};
			args.stage = _stage;
			args.fliptype = "rl";
			args.sheetwid = sheetwid;
			args.sheethei = sheethei;
			args.hitarea = hitarea;
			args.chainflip = _chainflip;
			args.chainflipgroup = flippages_next;
			
			_flippage.Init(args);
			
			var _flip_show = page();
			var _flip_hide = page();
			
			_flippage.setPageShow(_flip_show);
			_flippage.setPageHide(_flip_hide);
			
			page_settext(_flip_show, currentpid_r + 1);
			page_settext(_flip_hide, currentpid_r);
	
			_flippage.addEventListener("autoflip_complete", flip_complete_next);	
			_flippage.addEventListener("autoflip_returned", flip_returned_next);

			return _flippage;
		}
		//
		private function flip_complete_next(eo:* = null):void {
			
			var _flippage_next = eo.currentTarget;
			
			page_settext(_page_l, _flippage_next.pageIdShow);
			
			flippages_next.shift();

			currentpid_l = _flippage_next.pageIdShow;
				
			page_settext(_page_l, _flippage_next.pageIdShow);
			
			if(flippages_next.length == 0) page_settext(_page_r, currentpid_r);
			
			if(flippages_next.length == 0) trace("flip_complete_next:" + currentpid_l + "_" + currentpid_r);
		}
		//
		private function flip_returned_next(eo:* = null):void {
			
			var _flippage_next = eo.currentTarget;

			page_settext(_page_r, _flippage_next.pageIdHide);
			
			flippages_next.pop();
			
			//trace("flip_returned_next:" + _chainflip.numChildren);
		}
		
		/**
		 * flippage_prev
		 */
		private function flippage_prev():MovieClip {
			
			var _flippage = new NM_Autoflip();
			
			var args = {};
			args.stage = _stage;
			args.fliptype = "lr";
			args.sheetwid = sheetwid;
			args.sheethei = sheethei;
			args.hitarea = hitarea;
			args.chainflip = _chainflip;
			args.chainflipgroup = flippages_prev;
			
			_flippage.Init(args);
			
			var _flip_show = page();
			var _flip_hide = page();
			
			_flippage.setPageShow(_flip_show);
			_flippage.setPageHide(_flip_hide);
			
			page_settext(_flip_show, currentpid_l - 1);
			page_settext(_flip_hide, currentpid_l);
	
			_flippage.addEventListener("autoflip_complete", flip_complete_prev);	
			_flippage.addEventListener("autoflip_returned", flip_returned_prev);
			
			return _flippage;
		}
		//
		private function flip_complete_prev(eo:* = null):void {
			
			var _flippage_prev = eo.currentTarget;
			
			flippages_prev.shift();
				
			currentpid_r = _flippage_prev.pageIdShow;
			
			page_settext(_page_r, _flippage_prev.pageIdShow);
			
			//currentpid_r = pagecounter_r;
			//currentpid_l = pagecounter_l;
			
			if(flippages_prev.length == 0) page_settext(_page_l, currentpid_l);
			
			if(flippages_prev.length == 0) trace("flip_complete_prev:" + currentpid_l + "_" + currentpid_r);
		}
		//
		private function flip_returned_prev(eo:* = null):void {
			
			var _flippage_prev = eo.currentTarget;
			
			page_settext(_page_l, _flippage_prev.pageIdHide);
			
			flippages_prev.pop();
			
			//trace("flip_returned_prev:" + _chainflip.numChildren);
		}

		
		/**
		 * page
		 */
		private function page():MovieClip {
			
			var _page:MovieClip = new MovieClip();
			_page.cacheAsBitmap = true;
			
			var g = _page.graphics;
			g.lineStyle(1, 0xEFEFEF, 1);
			g.beginFill(0xFFFFFF, 1);
			g.drawRect(0, 0, sheetwid, sheethei);
			g.endFill();
			
			g.lineStyle(1, 0x222222, 1);
			g.beginFill(0xFFFFFF, 1);
			g.drawRect(15, 15, sheetwid - 30, sheethei - 30);
			g.endFill();
			
			var _textmc = new textmc();
			_textmc.name = "textmc";
			
			_page.addChild(_textmc);
			
			return _page;
		}
		/** */
		private function page_settext(tgtpage:MovieClip, textnum:int):void {
			
			var _textmc = tgtpage.getChildByName("textmc");
			var t = _textmc.getChildByName("t");
			
			t.width = 0;
			t.height = 0;
			t.autoSize = "left";
			t.multiline = false;
			t.wordWrap = false;
			//t.border = true;
			
			var f:TextFormat = new TextFormat();
			f.size = 1000;
			f.color = 0x222222;
			f.letterSpacing = -10;
			f.indent = 0;
			f.rightMargin = -new Number(f.letterSpacing);
			
			t.defaultTextFormat = f;			
			t.text = new String(textnum);
			
			tgtpage.name = t.text;
			
			var offset = 60;
			
			_textmc.width = sheetwid - offset;
			_textmc.scaleY = _textmc.scaleX;

			if(_textmc.height > sheethei - offset * 2) {
				
				_textmc.height = sheethei - offset * 2;
				_textmc.scaleX = _textmc.scaleY;
			}
			
			_textmc.x = Math.round((sheetwid - _textmc.width) / 2);
			_textmc.y = Math.round((sheethei - _textmc.height) / 2);
		}
	}
}




category : ActionScript / Flash

Demonstrations

Feature Samples

Author

虹村 マキオウ (nizimura makiou)

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

logo

Demo and Sample

Category