flash与游戏笔记:滚动数字(2)

      除了copy 像素的办法,还有一种是beginfillBitmap的做法来填充我们想要的数据,现在提供另外一种方法做一个简单实验。

     第一种方式是继承bitmap ,第二种方式是先把位图裁剪后再拼合,代码方面有一些区别,实验的功能基本上可以达到想要的效果,至于性能那个好还要多做测试。

  bitmap copy像素效率比较高,相对而言多少会增大一点内存,而使用shape 结合tweenlite 来使用,内存增加速度也有一点,不知道是不是错觉。

 在这个方面也可以尝试去做更加试验,最近比较忙碌,想写博客做实验时间都变得少了。

 好吧,有兴趣可以玩玩。

 

测试的代码,其中nums 为素材

package
{
	import flash.display.Sprite;
	import com.greensock.TweenLite;
	import com.greensock.plugins.TweenPlugin; 
	import com.greensock.plugins.EndArrayPlugin; 
	import flash.events.MouseEvent;
	import flash.events.Event;
	
	
	public class Main extends Sprite
	{
		private var rollText:RollTextField;
		public function Main()
		{
			
			TweenPlugin.activate([EndArrayPlugin]);
			rollText=new RollTextField();
			addChild(rollText);
			rollText.x=200;
			rollText.y=200;
			rollText.init(new nums(0,0),10);
			stage.addEventListener(MouseEvent.CLICK,onClick);
			 addEventListener(Event.ENTER_FRAME,onRender);
			
		}
		
		private function onRender(event:Event):void
		{
			
			rollText.text=Math.random()*5000;
			//removeEventListener(Event.ENTER_FRAME,onRender);
		}
		
		private function onClick(event:MouseEvent):void
		{
			
			rollText.rollText=Math.random()*5000;
			
		}
		
		
	}
	
	
}

package  
{
	
	import com.greensock.TweenLite;
	import com.greensock.plugins.*;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Shape;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.utils.Dictionary;
	import flash.display.Sprite;
	
	 
	public class RollTextField extends Shape
	{
		
		private var source:BitmapData;
		private var w:Number;
		private var h:Number;
		private var rect:Rectangle;
		private var pt:Point;
		private var curValue:int = 0; 
		private var offX:int = 0; 
		
		private var bitmapData:Dictionary;
		private var matrix:Matrix;
		public var filterArr:Array = ["+","-"];
		public var endFun:Function;
		public function ArtTextField()
		{
		 		
		}
		
		/**
		 * @param source 一个数字的资源(0123456789)
		 * @param len 裁剪的长度,默认为资源数字的长度  
		 * @param offX 图片数字的偏移,有时候资源是带符号 +0123456789 或者-0123456789 ,如果不需要偏移则默认为0
		 */
		public function init(source:BitmapData,len:int,offX:int=0):void
		{
			this.source = source;
			this.offX = offX;
			w = source.width / len;
			h = source.height;
			bitmapData=new Dictionary();
			if (! rect)
			{
				rect = new Rectangle(0,0,w,h);
			}
			if (! pt)
			{
				pt=new Point();
			}
			if (! matrix)
			{
				matrix=new Matrix();
			}
			for (var i:int=0; i<len; i++)
			{
				var bit:BitmapData = new BitmapData(w,h,true,0x00ffffff);
				rect.x = i * w;
				rect.width = w;
				rect.height = h;
				bit.copyPixels(source,rect,pt);
				bitmapData[i] = bit;
			}
		}
		
		public function set text(value:int):void
		{
			if (! source || value == curValue)
			{
				return;
			}
			this.curValue = value;
			
			this.graphics.clear();
			var myNewStr:String = String(value);
			var len:int = myNewStr.length;
			
			for (var i:int=0; i<len; i++)
			{
				var num:int = 0;
				if (filterArr.indexOf(myNewStr.charAt(i)) == -1)
				{
					//过滤数组
					num = int(myNewStr.charAt(i)) + offX;
				}
				
				if (bitmapData[num])
				{
					matrix.tx = i * w;
					this.graphics.beginBitmapFill(bitmapData[num],matrix,false);
					this.graphics.drawRect(i*w,0,w,h);
					this.graphics.endFill();
				}
			}
			
		}
		
		public function dispose():void
		{
			for each (var bit:BitmapData in bitmapData)
			{
				bit.dispose();
				bit = null;
			}
		}
		
		public function set rollText(value:int):void
		{
			if (! source || value == curValue)
			{
				return;
			}			
			var myArray:Array = [curValue];
			this.curValue = value;
			TweenLite.to(myArray, 1, {endArray:[value],onUpdate:onUpdateView,onComplete:onComplete});
			
			function onUpdateView():void
			{
				text = myArray[0];
			}
			
			function onComplete():void
			{
				if (endFun!=null)
				{
					endFun.apply(null,null);
				}
			}
		}
		
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值