⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skew.as

📁 flash 三维算法 图片翻动
💻 AS
字号:
/* Class Skew 
* @date:2007.8.1
* @version:AS2.0
*/
import flash.display.BitmapData;
import flash.geom.Point;
import flash.geom.Matrix;
class com.ycccc.MovieClip.Skew {
	//切割成多个三角形
	private var _mc:MovieClip;
	private var _w:Number;
	private var _h:Number;
	private var _sMat:Matrix;
	private var _tMat:Matrix;
	private var _xMin, _xMax, _yMin, _yMax:Number;
	private var _hP:Number;
	private var _vP:Number;
	private var _hsLen:Number;
	private var _vsLen:Number;
	private var _dotList:Array;
	private var _pieceList:Array;
	private var _imageBitmap:BitmapData;
	/* Constructor
	     *
	     * @param mc MovieClip :   图片容器
	     * @param imageLink String : 图片库连接名
	     * @param vP Number : 横向切割刀数
	     * @param hP Number : 纵向切割刀数
	     */
	public function Skew(mc:MovieClip, imageLink:String, vP:Number, hP:Number) {
		_mc = mc;
		_imageBitmap = BitmapData.loadBitmap(imageLink);
		_vP = vP > 20 or vP <0 ? 2 : vP;
		_hP = hP > 20 or hP <0 ? 2 : hP;
		_w = _imageBitmap.width;
		_h = _imageBitmap.height;
		init();
	}
	private function init():Void {
		_dotList = [];
		_pieceList = [];
		var ix:Number;
		var iy:Number;
		var w2:Number = _w/2;
		var h2:Number = _h/2;
		_xMin = _yMin=0;
		_xMax = _w;
		_yMax = _h;
		_hsLen = _w/(_hP+1);
		//纵向每块的高
		_vsLen = _h/(_vP+1);
		//横向每块的宽(根据精度来分割三角形)
		var x:Number, y:Number;
		for (ix=0; ix<_vP+2; ix++) {
			//分割的顶点集合
			for (iy=0; iy<_hP+2; iy++) {
				x = ix*_hsLen;
				y = iy*_vsLen;
				_dotList.push({x:x, y:y, sx:x, sy:y});
			}
		}
		for (ix=0; ix<_vP+1; ix++) {
			//分割成的三角形的顶点集合
			for (iy=0; iy<_hP+1; iy++) {
				_pieceList.push([_dotList[iy+ix*(_hP+2)], _dotList[iy+ix*(_hP+2)+1], _dotList[iy+(ix+1)*(_hP+2)]]);
				_pieceList.push([_dotList[iy+(ix+1)*(_hP+2)+1], _dotList[iy+(ix+1)*(_hP+2)], _dotList[iy+ix*(_hP+2)+1]]);
			}
		}
		render();
		//渲染
	}
	/* setTransform
	     *
	     * @param x0,y0 矩形左上控制点
	     * @param x1,y1 矩形右上控制点
	     * @param x2,y2 矩形右下控制点
	     * @param x3,y4 矩形左下控制点
	     *
	     */
	function setTransform(x0:Number, y0:Number, x1:Number, y1:Number, x2:Number, y2:Number, x3:Number, y3:Number):Void {
		var w:Number = _w;
		var h:Number = _h;
		var dx30:Number = x3-x0;
		var dy30:Number = y3-y0;
		var dx21:Number = x2-x1;
		var dy21:Number = y2-y1;
		var l:Number = _dotList.length;
		while (--l>-1) {
			var point:Object = _dotList[l];
			var gx = (point.x-_xMin)/w;
			var gy = (point.y-_yMin)/h;
			var bx = x0+gy*(dx30);
			var by = y0+gy*(dy30);
			point.sx = bx+gx*((x1+gy*(dx21))-bx);
			point.sy = by+gx*((y1+gy*(dy21))-by);
		}
		render();
	}
	private function render():Void {
		var t:Number;
		var p0, p1, p2:Object;
		var c:MovieClip = _mc;
		var a:Array;
		c.clear();
		_sMat = new Matrix();
		_tMat = new Matrix();
		var l:Number = _pieceList.length;
		while (--l>-1) {
			a = _pieceList[l];
			p0 = a[0];
			p1 = a[1];
			p2 = a[2];
			var x0:Number = p0.sx;
			var y0:Number = p0.sy;
			var x1:Number = p1.sx;
			var y1:Number = p1.sy;
			var x2:Number = p2.sx;
			var y2:Number = p2.sy;
			var u0:Number = p0.x;
			var v0:Number = p0.y;
			var u1:Number = p1.x;
			var v1:Number = p1.y;
			var u2:Number = p2.x;
			var v2:Number = p2.y;
			_tMat.tx = u0;
			_tMat.ty = v0;
			_tMat.a = (u1-u0)/_w;
			_tMat.b = (v1-v0)/_w;
			_tMat.c = (u2-u0)/_h;
			_tMat.d = (v2-v0)/_h;
			_sMat.a = (x1-x0)/_w;
			_sMat.b = (y1-y0)/_w;
			_sMat.c = (x2-x0)/_h;
			_sMat.d = (y2-y0)/_h;
			_sMat.tx = x0;
			_sMat.ty = y0;
			_tMat.invert();
			_tMat.concat(_sMat);
			c.beginBitmapFill(_imageBitmap, _tMat, false, false);
			c.moveTo(x0, y0);
			c.lineTo(x1, y1);
			c.lineTo(x2, y2);
			c.endFill();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -