/**
* Copyright hankuro ( http://wonderfl.net/user/hankuro )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/m7Wy
*/
package
{
import flash.display.*;
import flash.events.*;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import flash.utils.Timer;
import flash.geom.*;
[SWF(width=500, height=400, backgroundColor=0xFFFFFF)]
/**
*
* matrix3Dを使ったEFFECTを作ってみました。
* flashは最初からActionscript3.0から始めたのでflash-CSなんて使ったことないし、また、使えないと思います。
* ですから、プログラムの書き方が少し変ですので、ご注意願います。
* 今回のEFFECTはごく一般的なものですが、matrix3Dを勉強がてら使いました。
* (汗)1ピクセル分列が欠損しています。現在解析中←ステージを大きくしたら目立たなくなりました。
*/
public class Main extends Sprite
{
public var cut_image1:Array
public var cut_image2:Array
public var timer1:Timer;
public var crent_num:Number = 0;
public var crent_rotation:Number = 0;
public var image1:Array;
public var image2:Array;
public var load_cnt:Number = 0;
public var cat:Loader = new Loader();
public var dog:Loader = new Loader();
public var i_width:Number = 270;
public var i_height:Number = 200;
public var w:Number = 30;
public var dsp1:Sprite;
public var cat_url:URLRequest = new URLRequest("http://farm4.static.flickr.com/3532/3927209027_9553d9d33c.jpg");
public var dog_url:URLRequest = new URLRequest("http://farm3.static.flickr.com/2615/3927761699_2603592842.jpg");
public function Main() {
//
// 画像ロード
// 私はさくらサーバーを使用していますが、crossdomain.xmlを入れてもflashが認識してくれません。さくらサーバーをご使用の方で、何か対処法
// をご存じであれば教えていただけないでしょうか?
//
var context : LoaderContext = new LoaderContext(true);
cat.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
cat.load(cat_url, context);
dog.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
dog.load(dog_url,context);
}
public function onImageLoaded(event:Event):void {
load_cnt++;
if (load_cnt == 2) effct_start();
}
public function effct_start():void
{
// 裏面画像初期化
var bmp:Bitmap = Tools.Cut_image(cat, 43,95,i_width, i_height);
var bmp_data:BitmapData = new BitmapData(i_width, i_height);
bmp_data.draw(bmp);
cut_image1 = Tools.Image_width_cut(bmp_data, 0, 0 , w, bmp.height);
// 表面画像初期化
bmp = Tools.Cut_image(dog,105,80,i_width,i_height);
bmp_data = new BitmapData(i_width, i_height);
bmp_data.draw(bmp);
cut_image2 = Tools.Image_width_cut(bmp_data, 0, 0, w, bmp.height);
// ステージ上に画面設定
image1 = new Array(cut_image1.length);
image2 = new Array(cut_image2.length);
var image1_x:Number = 0;
var image2_x:Number = 0;
for (var i:Number = 0; i < cut_image1.length; i++) {
//
// 画像が二枚一組で半回転しますので、裏側の画像は反転しておく必要があります。
// 参考サイト http://www.adobe.com/jp/devnet/flash/articles/reflect_class_as3.html
//
cut_image1[i].scaleY = -1;
cut_image1[i].y += i_height / 2;
cut_image1[i].x = -i_width / 2 ;
cut_image1[i].visible = false;
image1[i] = new Sprite();
image1[i].x = ((i * w) + i_width / 2) + 100;
image1[i].y = (i_height / 2) + 100;
image1[i].addChild(cut_image1[i]);
cut_image2[i].y = -i_height / 2 ;
cut_image2[i].x = -i_width / 2 ;
image2[i] = new Sprite();
image2[i].addChild(cut_image2[i]);
image2[i].y = (i_height / 2) + 100;
image2[i].x = ((i * w) + i_width / 2) + 100;
this.addChildAt(image2[i], 0);
this.addChildAt(image1[i], 0);
}
dsp1 = new Sprite();
dsp1.graphics.beginFill(0xFFFFFF, 0);
dsp1.graphics.drawRect(0, 0, 500, 400);
dsp1.graphics.endFill();
dsp1.buttonMode = true;
this.addChild(dsp1);
dsp1.addEventListener(MouseEvent.CLICK, onClick);
}
public function onClick(evt:Event):void {
removeEventListener(MouseEvent.CLICK, onClick);
addEventListener(Event.ENTER_FRAME, onLoop);
}
public function onLoop(evt:Event):void {
//
// matrix3Dを使用して画像を回転させています。
//
if (crent_num < image1.length) {
if (crent_rotation < 90) {
cut_image1[crent_num].visible = false;
cut_image2[crent_num].visible = true;
}else {
cut_image1[crent_num].visible = true;
cut_image2[crent_num].visible = false;
}
if (crent_num < image2.length / 2) {
this.setChildIndex(image2[crent_num], 2);
this.setChildIndex(image1[crent_num], 2);
}
image1[crent_num].z = 0;
image2[crent_num].z = 0;
image2[crent_num].transform.matrix3D.prependRotation(3, Vector3D.X_AXIS);
image1[crent_num].transform.matrix3D.prependRotation(3,Vector3D.X_AXIS);
crent_rotation += 3;
if (crent_rotation > 180) {
if (crent_num < image2.length / 2) {
this.setChildIndex(image1[crent_num], 0);
}
crent_num++;
crent_rotation = 0;
}
}else {
//
// restart処理
//
removeEventListener(Event.ENTER_FRAME, onLoop);
for (var i:Number = 0; i < image1.length; i++) {
removeChild(image1[i]);
removeChild(image2[i]);
}
crent_num = 0;
removeChild(dsp1);
effct_start();
}
}
}
}
import flash.display.*;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.geom.Matrix;
/**
*
* 画像カットツール
*
*/
class Tools
{
public static function Image_width_cut(b_map:BitmapData,xx:Number, yy:Number, w:Number, h:Number):Array {
var rect:Rectangle;
var m_bitmap:Bitmap;
var cut_image:Array = new Array(int((b_map.width + (w - 1)) /w));
var copy_w:Number = w;
var copy_h:Number = b_map.height;
for (var n:Number = 0; n < cut_image.length; n++) {
if (n + 1 != cut_image.length) copy_w = w;
else if(int( b_map.width % w) == 0) copy_w = w;
else copy_w = int(b_map.width % w);
var penguinCopyBmd:BitmapData = new BitmapData(copy_w,copy_h);
rect = new Rectangle(n * w, 0, copy_w, copy_h);
//
// 画像カットはcopyPixelsを使用しています。
// 詳細は、「初めてのActionScript3.0(O'REILLY)9章 ピクセルによる描画」を参照願います。
//
penguinCopyBmd.copyPixels(b_map, rect, new Point());
var bmp:Bitmap = new Bitmap(penguinCopyBmd);
cut_image[n] = new Bitmap(bmp.bitmapData.clone());
}
return cut_image;
}
public static function Cut_image(l:Loader,xx:Number,yy:Number,w:Number,h:Number):Bitmap {
var bit_data:BitmapData = new BitmapData(l.width,l.height);
var bmp:Bitmap = Bitmap(l.content);
bit_data.draw(bmp);
var rect:Rectangle = new Rectangle(xx, yy, w, h);
var penguinCopyBmd:BitmapData = new BitmapData(w,h);
penguinCopyBmd.copyPixels(bit_data, rect, new Point());
var c_bmp:Bitmap = new Bitmap(penguinCopyBmd);
bmp = new Bitmap(c_bmp.bitmapData.clone());
return bmp;
}
}