Flashでめくる動作を表現するアクションを制作する。
紙やシールなどの薄いものをめくる表現を制作する。MatrixとPointを使用してなるべくシンプルなコードになるように制作した。
ピンで止められたような移動制限も実装してみた。てんとう虫を移動すると移動制限の変化を確認できる。
めくる動作を開始する位置で、めくりのアクションの方向を決定する必要があったので
ActionScript Learning 110613で制作したコードを使用する。
めくる途中でおかしな動作をさせないために、移動制限のある場合と無い場合で、マウス座標の取得方法に調整が必要だった。
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;
}
}
}