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

📄 main.as

📁 AS3代码 用于检测碰撞面积 请使用FLASH CS3或其他支持AS3语言的软件打开
💻 AS
字号:
package {
	import flash.display.*;
	import flash.filters.*;
	import flash.geom.*;
	import flash.text.*;
	
	public class main extends Sprite{
		private var tx:Number, ty:Number;
		private var bmd1:BitmapData, bmd2:BitmapData;
		private var rect:Rectangle, bc1:BitmapData, bc2:BitmapData, bc;
		
		public function main(){
			//让mc1元件有按钮模式, 并去掉mc3的鼠标事件
			mc1.buttonMode = true; 
			mc3.mouseEnabled = false;
			
			//侦听mc1按下,以便拖拽
			mc1.addEventListener("mouseDown", mousedownHandler); 
			
			//让mc2停止在第一帧上,表示没有碰撞
			mc2.gotoAndStop(1); 
			
			//取得mc1的bitmapdata数据
			bmd1 = new BitmapData(mc1.width, mc1.height, true, 0);
			bmd1.draw(mc1); 
			
			//取得mc2的bitmapdata数据
			bmd2 = new BitmapData(mc2.width, mc2.height, true, 0);
			bmd2.draw(mc2); 
		}
		
		private function getMaxRect(){ 
			//得到mc1,mc2的组合在一起的矩形,并生成两个相同新的bitmapdata,bc1,bc2,以便稍后相比较
			var bw = (mc1.x > mc2.x) ? Math.abs(mc1.x-mc2.x+mc1.width) : Math.abs(mc2.x-mc1.x+mc2.width);
			var bh = (mc1.y > mc2.y) ? Math.abs(mc1.y-mc2.y+mc1.height) : Math.abs(mc2.y-mc1.y+mc2.height);
			
			bc1 = new BitmapData(bw, bh, true, 0);
			bc2 = new BitmapData(bw, bh, true, 0);
		}
		
		private function compareRect(){ 
			//分别在得到的bc1,bc2中用不同的步骤画上mc1,mc2的bitmapdata
			bc1.copyPixels(bmd1, bmd1.rect, new Point(0, 0), null, null, true);
			bc1.copyPixels(bmd2, bmd2.rect, new Point(mc2.x-mc1.x, mc2.y-mc1.y), null, null, true);
			bc2.copyPixels(bmd2, bmd2.rect, new Point(mc2.x-mc1.x, mc2.y-mc1.y), null, null, true);
			bc2.copyPixels(bmd1, bmd1.rect, new Point(0, 0), null, null, true);
			
			//清除之前的bc,并且比较现在的两个大的bitmapdata,得到新的bc
			if(typeof(bc) == "object") {bc.dispose();}
			bc = bc1.compare(bc2);
			//画好后,比较bc1,bc2,如果bc1,bc2有不同的RGB 值,将会返回一个新的bitmapdata,否则返回0
			if(typeof(bc) == "object"){
				//显示这个比较后的相交的bitmapdata,如果要显示相交区域,把下面的注释去掉即可。
				/*var bmp = new Bitmap(bc);
				bmp.x = mc1.x;
				bmp.y = mc1.y;
				this.addChild(bmp);*/
				
				//得到相交部分的矩形,并用mc3来显示
				var r = bc.getColorBoundsRect(0xFFFFFF, 0x000000, false);
				mc3.x = mc1.x + r.x;
				mc3.y = mc1.y + r.y;
				mc3.width = r.width;
				mc3.height = r.height;
				txt.text = "有碰撞, 相对于mc1的位置是: x:" + r.x + " y:" + r.y + " width:" + r.width + " height:" + r.height;
			}else{
				//mc3复原
				mc3.x = -35;
				mc3.y = 35;
				mc3.width = mc3.height = 30;
				txt.text = "无碰撞";
			}
		}
		
		private function removeAllBitmapData(){
			bc1.dispose();
			bc2.dispose();
			bc1 = null;
			bc2 = null;
		}
		
		private function mousedownHandler(e){ //tx,ty为鼠标按下时,mc1的坐标相对原点的位置
			tx = e.stageX - mc1.x;
			ty = e.stageY - mc1.y;
			stage.addEventListener("mouseMove", mousemoveHandler);
			stage.addEventListener("mouseUp", mouseupHandler); //侦听stage的鼠标事件,以便拖拽
		}
		
		private function mousemoveHandler(e){
			mc1.x = e.stageX - tx;
			mc1.y = e.stageY - ty;
			getMaxRect(); //得到两个大的bitmapdata
			compareRect(); //比较这两个大的bitmapdata
			removeAllBitmapData(); //移除这两个大的bitmapdata
		}
		
		private function mouseupHandler(e){
			stage.removeEventListener("mouseMove", mousemoveHandler);
			stage.removeEventListener("mouseUp", mouseupHandler); //之前有侦听这两个事件,当松开鼠标时,需要除去这两个事件
		}
		
	}
}

⌨️ 快捷键说明

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