一条只能往前走的路,叫时光.
1.画饼图:author:ycccc8202
/** * @class:DrawPieGraph(画饼状图) * @author:ycccc8202 * @date:2007.8.16 * @example: * import com.ycccc.Graphics.DrawPieGraph * var dataList:Array=[10,10,10,100,10,10,10,100]; * var pie:DrawPieGraph=new DrawPieGraph(200,200,150,90,15,dataList,null); * addChild(pie); * //pie.clearAll()--->清空 * //pie.contain--->获取所有分块的引用对象,方便类外进行操作 */ package com.ycccc.Graphics{ import fl.transitions.Tween; import fl.transitions.easing.*; import fl.transitions.TweenEvent; import flash.display.MovieClip; import flash.display.Sprite; import flash.display.Shape; import flash.display.Graphics; import flash.events.MouseEvent; public class DrawPieGraph extends MovieClip { public static var PIE_NAME:String="pie" //存放shape对象 private var __contain:Object; //设置角度从-90开始 private var R:int=-90; private var D:uint=30; private var _shape:Shape; //初始饼图的圆心位置 private var _x0:Number; private var _y0:Number; //椭圆饼图的长轴与短轴长度 private var _a:Number; private var _b:Number; //饼图的厚度 private var _h:Number; //透明度 private var _alpha:Number; //数据列表 private var _dataList:Array; private var _colorList:Array; private var _angleList:Array; private var _depthList:Array; // private var _tween1:Tween; private var _tween2:Tween; /** *@param:x0......>圆心x坐标 *@param:y0......>圆心y坐标 *@param:a......>长轴 *@param:b......>短轴 *@param:h......>厚度 *@param:dataList......>数据列表 *@param:dataList......>颜色列表 *@alpha:Number......>透明度(有确省值) */ public function DrawPieGraph(x0:Number,y0:Number,a:Number,b:Number,h:Number,dataList:Array,colorList:Array,alpha:Number=.7) { _x0=x0; _y0=y0; _a=a; _b=b; _h=h; _alpha=alpha _dataList=dataList==null?[1,1,1,1,1,1,1,1]:dataList; _colorList=colorList==null?[0xFF0F00,0xFF6600,0xFF9E01,0xFCD202,0xF8FF01,0xB0DE09,0x04D215,0x0D8ECF]:colorList; setAngleList(); drawPie(); setDepths(); } private function setAngleList():void { _angleList=[]; var totalData:int; var len:uint=_dataList.length; for (var j:uint=0; j < len; j++) { totalData+= _dataList[j]; } for (j=0; j < len; j++) { if (j == len - 1) { _angleList.push([R,270]); } else { var r:uint=Math.floor(_dataList[j] / totalData * 360); var posR:int=R + r; _angleList.push([R,posR]); R=posR; trace(r+"___r"); trace(R); } } trace(_angleList + ":::"); } private function setDepths():void { _depthList=[]; var len:uint=_angleList.length; for (var j:uint=0; j < len; j++) { var minJ:Number=_angleList[j][0]; var maxJ:Number=_angleList[j][1]; switch (true) { case minJ >= -90 && minJ <= 90 && maxJ<=90 : _depthList[j]=minJ; break; default : _depthList[j]=1000-minJ; } }//end for trace(_depthList + "::::_depthList"); _depthList=_depthList.sort(Array.NUMERIC | Array.RETURNINDEXEDARRAY); trace(_depthList); for (j=0; j<len; j++) { setChildIndex(__contain[DrawPieGraph.PIE_NAME+_depthList[j]],j); } } private function drawPie():void { __contain={}; var len:uint=_angleList.length; var step:uint=1; for (var j:uint=0; j < len; j++) { var pie:MovieClip=__contain[DrawPieGraph.PIE_NAME+j]=new MovieClip; // pie.out=false; //设置中心角,方便以下进行点中移动 pie.r=(_angleList[j][0]+_angleList[j][1])/2; pie.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownX); addChild(pie); var drakColor:uint=getDarkColor(_colorList[j]);//深色 var g:Graphics=pie.graphics; //g.lineStyle(1); //先画底 //内弧 g.beginFill(_colorList[j],_alpha); g.moveTo(_x0,_y0+_h); var r:Number=_angleList[j][0]; var minR:Number=r; var maxR:int=_angleList[j][1]; while (r + step < maxR) { g.lineTo(getRPoint(_x0,_y0 + _h,_a,_b,r).x,getRPoint(_x0,_y0 + _h,_a,_b,r).y); r+= step; } g.lineTo(getRPoint(_x0,_y0 + _h,_a,_b,maxR).x,getRPoint(_x0,_y0 + _h,_a,_b,maxR).y); // g.endFill(); //画内侧面 g.beginFill(drakColor,_alpha); g.moveTo(_x0,_y0+_h); g.lineTo(getRPoint(_x0,_y0 + _h,_a,_b,minR).x,getRPoint(_x0,_y0 + _h,_a,_b,minR).y); g.lineTo(getRPoint(_x0,_y0,_a,_b,minR).x,getRPoint(_x0,_y0,_a,_b,minR).y); g.lineTo(_x0,_y0); g.endFill(); //画外侧面 g.beginFill(drakColor,_alpha); g.moveTo(_x0,_y0+_h); g.lineTo(getRPoint(_x0,_y0 + _h,_a,_b,maxR).x,getRPoint(_x0,_y0 + _h,_a,_b,maxR).y); g.lineTo(getRPoint(_x0,_y0,_a,_b,maxR).x,getRPoint(_x0,_y0,_a,_b,maxR).y); g.lineTo(_x0,_y0); g.endFill(); //画外弧侧面 g.beginFill(drakColor,_alpha); //g.lineStyle(1); g.moveTo(getRPoint(_x0,_y0 + _h,_a,_b,minR).x,getRPoint(_x0,_y0 + _h,_a,_b,minR).y); g.lineTo(getRPoint(_x0,_y0,_a,_b,minR).x,getRPoint(_x0,_y0,_a,_b,minR).y); r=minR; while (r + step < maxR) { r+= step; g.lineTo(getRPoint(_x0,_y0,_a,_b,r).x,getRPoint(_x0,_y0,_a,_b,r).y); } g.lineTo(getRPoint(_x0,_y0,_a,_b,maxR).x,getRPoint(_x0,_y0,_a,_b,maxR).y); g.lineTo(getRPoint(_x0,_y0 + _h,_a,_b,maxR).x,getRPoint(_x0,_y0 + _h,_a,_b,maxR).y); while (r - step > minR) { g.lineTo(getRPoint(_x0,_y0 + _h,_a,_b,r).x,getRPoint(_x0,_y0 + _h,_a,_b,r).y); r-= step; } g.lineTo(getRPoint(_x0,_y0 + _h,_a,_b,minR).x,getRPoint(_x0,_y0 + _h,_a,_b,minR).y); g.endFill(); //画上表面 g.beginFill(_colorList[j],_alpha); g.moveTo(_x0,_y0); r=minR; while (r + step < maxR) { g.lineTo(getRPoint(_x0,_y0,_a,_b,r).x,getRPoint(_x0,_y0,_a,_b,r).y); r+= step; } g.lineTo(getRPoint(_x0,_y0,_a,_b,maxR).x,getRPoint(_x0,_y0,_a,_b,maxR).y); g.endFill(); } } private function onMouseDownX(e:MouseEvent):void { var TG:MovieClip=e.target as MovieClip; var posX:Number=getRPoint(0,0,D,D,TG.r).x; var posY:Number=getRPoint(0,0,D,D,TG.r).y; if (!TG.out) { trace("///////"); trace("起点"); trace(TG.name); trace("///////"); TG.removeEventListener(MouseEvent.MOUSE_DOWN,onMouseDownX); TG["tweenX"]=new Tween(TG,"x",Bounce.easeOut,0,posX,1.5,true); TG["tweenY"]=new Tween(TG,"y",Bounce.easeOut,0,posY,1.5,true); } else { trace("///////"); trace("终点"); trace(TG.name); trace("///////"); TG.removeEventListener(MouseEvent.MOUSE_DOWN,onMouseDownX); trace([TG.x,TG.y]); TG["tweenX"]=new Tween(TG,"x",Bounce.easeOut,TG.x,0,1,true); TG["tweenY"]=new Tween(TG,"y",Bounce.easeOut,TG.y,0,1,true); } TG["tweenX"].addEventListener(TweenEvent.MOTION_FINISH,onMotionFinish); } private function onMotionFinish(e:TweenEvent):void { //trace(e.position+"...position"); var TG:MovieClip=e.currentTarget.obj as MovieClip; TG["tweenX"].removeEventListener(TweenEvent.MOTION_FINISH,onMotionFinish); TG.out=!TG.out?true:false TG.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownX); } private function getDarkColor(color:uint):uint { var r:uint=color >> 16 & 0xFF / 1.3; var g:uint=color >> 8 & 0xFF / 1.3; var b:uint=color & 0xFF /1.1; return r << 16 | g << 8 | b; } private function getRPoint(x0:Number,y0:Number,a:Number,b:Number,r:Number):Object { r=r * Math.PI / 180; return {x:Math.cos(r) * a + x0,y:Math.sin(r) * b + y0}; } public function get contain():Object { return __contain; } public function clearAll():void {//清除内容 var len:uint=_dataList.length; for (var j:uint=0; j<len; j++) { removeChild(__contain[DrawPieGraph.PIE_NAME+j]); __contain[DrawPieGraph.PIE_NAME+j]=null; } } } }
2.游戏寻路(组件)
package { import flash.display.*; import flash.events.*; import flash.net.URLRequest; import flash.geom.*; import flash.filters.*; /** * @author CYPL * 设置图片元件实例名为Image */ public class CutImageTest extends Sprite { private var _imageBitmapData : BitmapData; private var _imageHotAreaData:BitmapData; private var _imageBitmap : Bitmap; private var _mouseRectContainer:Sprite; private var _mouseRectStartX:Number; private var _mouseRectStartY:Number; private var _imageClipDraging:Boolean; private var _currentDragClip:Sprite; public function CutImageTest() { _mouseRectContainer=new Sprite; Image.visible=false; _imageBitmapData=new BitmapData(Image.width,Image.height,true,0),_imageBitmapData.draw(Image); _imageBitmap=Bitmap(addChild(new Bitmap(_imageBitmapData))) _imageBitmap.x=30 _imageBitmap.y=30 configMouseEvent(); //----------hitTestArea------------------------ var c:ColorTransform=new ColorTransform; c.color=0xff0000; _imageHotAreaData=_imageBitmapData.clone(); _imageHotAreaData.draw(_imageHotAreaData,null,c); } private function configMouseEvent():void { stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler,false,0,true); stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler,false,0,true); } /**************************drawRect handler*******************************/ private function mouseDownHandler(evt:MouseEvent):void {//mouse_down if (_imageClipDraging) { return; } addChild(_mouseRectContainer); _mouseRectStartX=evt.stageX; _mouseRectStartY=evt.stageY; stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler); } private function mouseUpHandler(evt:MouseEvent):void {//mouse_up //_currentDragClip&&(); _imageClipDraging&&(_currentDragClip.stopDrag(),_imageClipDraging=false,_currentDragClip.alpha=1)||(cutImage(checkIntersection()),_mouseRectContainer.graphics.clear(),stage.removeEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler)) } private function mouseMoveHandler(evt:MouseEvent):void {//mouse_move evt.updateAfterEvent(); var minX:Number=Math.min(evt.stageX,_mouseRectStartX) var minY:Number=Math.min(evt.stageY,_mouseRectStartY) var maxX:Number=Math.max(evt.stageX,_mouseRectStartX) var maxY:Number=Math.max(evt.stageY,_mouseRectStartY) with(_mouseRectContainer.graphics){ clear(); lineStyle(0); beginFill(0xffff00,.5); drawRect(0,0,maxX-minX,maxY-minY);} _mouseRectContainer.x=minX; _mouseRectContainer.y=minY; } /************************************************************************/ /**************************drag handler*******************************/ private function clipMouseDownHandler(evt:MouseEvent):void {//mouse_down var target:Sprite=evt.target as Sprite; _currentDragClip=target; _currentDragClip.alpha=.5; _imageClipDraging=true; addChild(target); _currentDragClip.startDrag(false); } /************************************************************************/ private function checkIntersection():Rectangle { var intersectRect:Rectangle=_imageBitmapData.rect.intersection(new Rectangle(_mouseRectContainer.x-_imageBitmap.x,_mouseRectContainer.y-_imageBitmap.y,_mouseRectContainer.width,_mouseRectContainer.height)); trace("与源图BitmapData相交范围:"+intersectRect); if (intersectRect.width==0 || intersectRect.height==0) { return null; } var bitmapData:BitmapData=new BitmapData(intersectRect.width,intersectRect.height,true,0); bitmapData.draw(_imageHotAreaData,new Matrix(1,0,0,1,-intersectRect.x,-intersectRect.y),null,null,new Rectangle(0,0,intersectRect.width,intersectRect.height)); var intersectHotAreaRect:Rectangle=bitmapData.getColorBoundsRect(0xFFFF0000, 0xFFFF0000,true); trace("最终切图块的范围:"+intersectHotAreaRect); if (intersectHotAreaRect.width==0 || intersectHotAreaRect.height==0) { return null; } //扩展范围避免误差 intersectHotAreaRect.x-=1 intersectHotAreaRect.y-=1 intersectHotAreaRect.width+=2 intersectHotAreaRect.height+=2 return intersectHotAreaRect; } private function cutImage(rect:Rectangle):void {//关键的切图部分 if (!rect) { return; } var clipBitmapData:BitmapData=new BitmapData(rect.width,rect.height,true,0); var cliptX:Number=(_mouseRectContainer.x=_mouseRectContainer.x<_imageBitmap.x?0:_mouseRectContainer.x-_imageBitmap.x)+rect.x; var cliptY:Number=(_mouseRectContainer.y=_mouseRectContainer.y<_imageBitmap.y?0:_mouseRectContainer.y-_imageBitmap.y)+rect.y; clipBitmapData.draw(_imageBitmapData,new Matrix(1,0,0,1,-cliptX,-cliptY),null,null,new Rectangle(0,0,rect.width,rect.height));//intersectHotAreaRect) var clipBitmap:Bitmap=new Bitmap(clipBitmapData); clipBitmap.filters=[new GlowFilter(0,1,2,2,10,1)]; var sprite:Sprite=new Sprite with(sprite.graphics){ lineStyle(0); lineTo(rect.width,0); lineTo(rect.width,rect.height); lineTo(0,rect.height); lineTo(0,0);} sprite.x=_mouseRectContainer.x+rect.x+_imageBitmap.x sprite.y=_mouseRectContainer.y+rect.y+_imageBitmap.y sprite.addEventListener(MouseEvent.MOUSE_DOWN,clipMouseDownHandler); Sprite(addChild(sprite)).addChild(clipBitmap) var fillRect:Rectangle=new Rectangle(sprite.x-_imageBitmap.x,sprite.y-_imageBitmap.y,rect.width,rect.height); _imageBitmapData.fillRect(fillRect,0); _imageHotAreaData.fillRect(fillRect,0); } } }
Powered by: 博客园 Copyright © i'am sl