本のページを連続でめくる動作を表現する。
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);
}
}
}