`
lizhuang
  • 浏览: 903959 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

flash拼图源代码

 
阅读更多

package {
	import flash.display.*;
	import flash.events.*;
	import flash.net.URLRequest;
	import flash.geom.*;
	import flash.utils.Timer;
	
	public class JigsawPuzzle extends MovieClip {
		// number of pieces
		const numPiecesHoriz:int = 3;
		const numPiecesVert:int = 3;
		
		// size of pieces
		var pieceWidth:Number;
		var pieceHeight:Number;

		// game pieces
		var puzzleObjects:Array;
		
		// two levels of sprites
		var selectedPieces:Sprite;
		var otherPieces:Sprite;
		
		// pieces being dragged
		var beingDragged:Array  = new Array();
		
		// load picture and set up sprites
		public function startJigsawPuzzle() {
			// load the bitmap
			loadBitmap("jigsawimage.jpg");
			
			// set up two sprites
			otherPieces = new Sprite();
			selectedPieces = new Sprite();
			addChild(otherPieces);
			addChild(selectedPieces); // selected on top
		}
		
		// get the bitmap from an external source
		public function loadBitmap(bitmapFile:String) {
			var loader:Loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingDone);
			var request:URLRequest = new URLRequest(bitmapFile);
			loader.load(request);
		}
		
		// bitmap done loading, cut into pieces
		private function loadingDone(event:Event):void {
			// create new image to hold loaded bitmap
			var image:Bitmap = Bitmap(event.target.loader.content);
			pieceWidth = Math.floor((image.width/numPiecesHoriz)/10)*10;
			pieceHeight = Math.floor((image.height/numPiecesVert)/10)*10;
			
			// place loaded bitmap in image
			var bitmapData:BitmapData = image.bitmapData;
			
			// cut into puzzle pieces
			makePuzzlePieces(bitmapData);
			
			// set up movement and mouse up events
			addEventListener(Event.ENTER_FRAME,movePieces);
			stage.addEventListener(MouseEvent.MOUSE_UP,liftMouseUp);
		}
		
		// cut bitmap into pieces
		private function makePuzzlePieces(bitmapData:BitmapData) {
			puzzleObjects = new Array();
			for(var x:uint=0;x<numPiecesHoriz;x++) {
				for (var y:uint=0;y<numPiecesVert;y++) {
					// create new puzzle piece bitmap and sprite
					var newPuzzlePieceBitmap:Bitmap = new Bitmap(new BitmapData(pieceWidth,pieceHeight));
					newPuzzlePieceBitmap.bitmapData.copyPixels(bitmapData,new Rectangle(x*pieceWidth,y*pieceHeight,pieceWidth,pieceHeight),new Point(0,0));
					var newPuzzlePiece:Sprite = new Sprite();
					newPuzzlePiece.addChild(newPuzzlePieceBitmap);
					
					// place in bottom sprite
					otherPieces.addChild(newPuzzlePiece);
					
					// create object to store in array
					var newPuzzleObject:Object = new Object();
					newPuzzleObject.loc = new Point(x,y); // location in puzzle
					newPuzzleObject.dragOffset = null; // offset from cursor
					newPuzzleObject.piece = newPuzzlePiece;
					newPuzzlePiece.addEventListener(MouseEvent.MOUSE_DOWN,clickPuzzlePiece);
					puzzleObjects.push(newPuzzleObject);
				}
			}
			
			// randomize locations of pieces
			shufflePieces();
			
		}
		
		// random locations for the pieces
		public function shufflePieces() {
			// pick random x and y
			for(var i in puzzleObjects) {
				puzzleObjects[i].piece.x = Math.random()*400+50;
				puzzleObjects[i].piece.y = Math.random()*250+50;
			}
			// lock all pieces to 10x10 grid
			lockPiecesToGrid();
		}
		
		public function clickPuzzlePiece(event:MouseEvent) {
			// click location
			var clickLoc:Point = new Point(event.stageX, event.stageY);
			
			beingDragged = new Array();
			
			// find piece clicked
			for(var i in puzzleObjects) {
				if (puzzleObjects[i].piece == event.currentTarget) { // this is it
					// add to drag list
					beingDragged.push(puzzleObjects[i]);
					// get offset from cursor
					puzzleObjects[i].dragOffset = new Point(clickLoc.x - puzzleObjects[i].piece.x, clickLoc.y - puzzleObjects[i].piece.y);
					// move from bottom sprite to top one
					selectedPieces.addChild(puzzleObjects[i].piece);
					// find other pieces locked to this one
					findLockedPieces(i,clickLoc);
					break;
				}
			}
		}
		
		// move all selected pieces according to mouse location
		public function movePieces(event:Event) {
			for (var i in beingDragged) {
				beingDragged[i].piece.x = mouseX - beingDragged[i].dragOffset.x;
				beingDragged[i].piece.y = mouseY - beingDragged[i].dragOffset.y;
			}
		}

		// find pieces that should move together
		public function findLockedPieces(clickedPiece:uint, clickLoc:Point) {
			// get list of puzzle objects sorted by distance to the clicked object
			var sortedObjects:Array = new Array();
			for (var i in puzzleObjects) {
				if (i == clickedPiece) continue;
				sortedObjects.push({dist: Point.distance(puzzleObjects[clickedPiece].loc,puzzleObjects[i].loc), num: i});
			}
			sortedObjects.sortOn("dist",Array.DESCENDING);
			
			// loop until all linked piece found
			do {
				var oneLinkFound:Boolean = false;
				// look at each object, starting with closest
				for(i=sortedObjects.length-1;i>=0;i--) {
					var n:uint = sortedObjects[i].num; // actual object number
					// get the position relative to the clicked object
					var diffX:int = puzzleObjects[n].loc.x - puzzleObjects[clickedPiece].loc.x;
					var diffY:int = puzzleObjects[n].loc.y - puzzleObjects[clickedPiece].loc.y;
					// see if this object is appropriately placed to be locked to the clicked one
					if (puzzleObjects[n].piece.x == (puzzleObjects[clickedPiece].piece.x + pieceWidth*diffX)) {
						if (puzzleObjects[n].piece.y == (puzzleObjects[clickedPiece].piece.y + pieceHeight*diffY)) {
							// see if this object is adjacent to one already selected
							if (isConnected(puzzleObjects[n])) {
								// add to selection list and set offset
								beingDragged.push(puzzleObjects[n]);
								puzzleObjects[n].dragOffset = new Point(clickLoc.x - puzzleObjects[n].piece.x, clickLoc.y - puzzleObjects[n].piece.y);
								// move to top sprite
								selectedPieces.addChild(puzzleObjects[n].piece);
								// link found, remove from array
								oneLinkFound = true;
								sortedObjects.splice(i,1);
							}
						}
					}
				}
			} while (oneLinkFound);
		}
		
		// takes an object and determines if it is directly next to one already selected
		public function isConnected(newPuzzleObject:Object):Boolean {
			for(var i in beingDragged) {
				var horizDist:int = Math.abs(newPuzzleObject.loc.x - beingDragged[i].loc.x);
				var vertDist:int = Math.abs(newPuzzleObject.loc.y - beingDragged[i].loc.y);
				if ((horizDist == 1) && (vertDist == 0)) return true;
				if ((horizDist == 0) && (vertDist == 1)) return true;
			}
			return false;
		}
		
		// stage sends mouse up event, drag is over
		public function liftMouseUp(event:MouseEvent) {
			// lock all pieces back to grid
			lockPiecesToGrid();
			// move pieces back to bottom sprite
			for(var i in beingDragged) {
				otherPieces.addChild(beingDragged[i].piece);
			}
			// clear drag array
			beingDragged = new Array();
			
			// see if the game is over
			if (puzzleTogether()) {
				cleanUpJigsaw();
				gotoAndStop("gameover");
			}
		}
		
		// take all pieces and lock them to the nearest 10x10 location
		public function lockPiecesToGrid() {
			for(var i in puzzleObjects) {
				puzzleObjects[i].piece.x = 10*Math.round(puzzleObjects[i].piece.x/10);
				puzzleObjects[i].piece.y = 10*Math.round(puzzleObjects[i].piece.y/10);
			}
		}
		
		public function puzzleTogether():Boolean {
			for(var i:uint=1;i<puzzleObjects.length;i++) {
				// get the position relative to the first object
				var diffX:int = puzzleObjects[i].loc.x - puzzleObjects[0].loc.x;
				var diffY:int = puzzleObjects[i].loc.y - puzzleObjects[0].loc.y;
				// see if this object is appropriately placed to be locked to the first one
				if (puzzleObjects[i].piece.x != (puzzleObjects[0].piece.x + pieceWidth*diffX)) return false;
				if (puzzleObjects[i].piece.y != (puzzleObjects[0].piece.y + pieceHeight*diffY)) return false
			}
			return true;
		}
					
		public function cleanUpJigsaw() {
			removeChild(selectedPieces);
			removeChild(otherPieces);
			selectedPieces = null;
			otherPieces = null;
			puzzleObjects = null;
			beingDragged = null;
			removeEventListener(Event.ENTER_FRAME,movePieces);
			stage.removeEventListener(MouseEvent.MOUSE_UP,liftMouseUp);
		}
		
	}
}
分享到:
评论

相关推荐

    flash 拼图源代码 及教程

    标题中的“flash 拼图源代码 及教程”揭示了这个压缩包包含的内容是关于一个基于Flash技术的拼图游戏的源代码和教学资源。这个项目使用了ActionScript 2.0,这是一种专用于Adobe Flash平台的编程语言,用于创建交互...

    flash拼图游戏源代码

    《深入解析Flash拼图游戏源代码》 Flash作为一种曾经风靡全球的交互式矢量图形和多媒体开发平台,为无数的网页游戏提供了丰富的创意空间。本文将围绕“Flash拼图游戏源代码”这一主题,深入探讨其背后的编程原理、...

    Flash拼图游戏源代码

    《深入解析Flash拼图游戏源代码》 Flash作为一种曾经风靡全球的交互式矢量图形和多媒体开发平台,为无数的开发者提供了丰富的创作空间。在众多的Flash应用中,拼图游戏是一种简单而有趣的项目,它能吸引各年龄段的...

    flash cs3 纯代码拼图游戏源代码

    《深入解析Flash CS3拼图游戏源代码》 在数字媒体和互动娱乐领域,Flash CS3是一款曾经广泛应用的动画和游戏开发工具。本篇将详细探讨一个基于Flash CS3开发的纯代码拼图游戏,旨在帮助读者理解其背后的编程原理和...

    flash源代码,包括射击游戏.fla,拼图游戏.fla,华容道.fla等

    本资源包含了一系列的Flash源代码文件,这些源代码对于学习和理解Flash编程、游戏开发以及动画制作具有很高的价值。 首先,我们要明确的是,".fla"是Adobe Flash Professional的源文件格式,它包含了所有用于创建...

    flash 拼图 SWF 开源 源代码

    flash制作的拼图游戏,文件格式SWF,可以从电脑里任意选择一张图进行游戏。 联系作者可获得源代码。

    又一个Flash拼图游戏 Flash源码.rar

    在给定的“又一个Flash拼图游戏 Flash源码.rar”中,我们可以深入研究一个基于Flash制作的拼图游戏的源代码,了解其工作原理和实现方式。 这个游戏的核心是利用了Flash ActionScript语言来控制游戏逻辑。...

    收集的几个Flash小游戏源代码

    例如,拼图游戏的源代码可能包含解决谜题的算法,而射击游戏则需要实现敌人的AI行为。 5. **音频处理**:许多Flash小游戏会包含背景音乐和音效。ActionScript提供了`Sound`和`SoundChannel`类来加载、播放和控制...

    flash as3.0拼图小游戏源代码

    在本文中,我们将深入探讨如何使用Flash AS3.0来创建一个拼图小游戏。AS3.0(ActionScript 3.0)是Adobe Flash平台上的一种编程语言,它为开发交互式内容提供了强大的功能,尤其适合制作各种类型的小游戏,如拼图...

    一个flashas3.0的拼图游戏代码

    《AS3.0 Flash拼图游戏开发详解》 在Flash编程领域,ActionScript 3.0(AS3.0)以其强大的性能和丰富的功能,成为了创建互动内容的首选语言。本篇文章将深入探讨如何利用AS3.0开发一款拼图游戏,通过分析提供的...

    flash拼图游戏原文件fla

    flash拼图游戏原文件fla 9宫格源代码文件

    flash拼图游戏很好玩的,有难度级别选择

    对于压缩包内的"flash拼图游戏"文件,我们可以预期这是一个包含所有游戏资源和源代码的压缩包。解压后,我们可以找到FLA文件,打开并查看其时间轴、库资源和AS脚本。在AS脚本中,我们可能看到用于生成拼图碎片、打乱...

    FLASH小游戏源代码

    在这个“FLASH小游戏源代码”压缩包中,我们主要关注的是使用Adobe Flash技术开发的小游戏的源文件。Flash是一种曾经广泛用于创建交互式内容、网页动画和在线游戏的平台。尽管现代浏览器不再支持Flash,但它在早期...

    30个网页常用FLASH特效源代码打包

    这些源代码打包文件包含了30种不同的FLASH特效,适用于各种网页应用场景。每个.FLA文件都是一个Adobe Flash的专业项目文件,包含了动画、交互性和编程逻辑的源代码。 在深入探讨这些FLASH特效之前,我们首先需要...

    flash 3.0拼图游戏.zip_as3 拼图游戏_as3.0拼图制作_flash_flash 3.0游戏_flash游戏3.

    《AS3.0拼图游戏开发详解》 在IT领域,尤其是互动娱乐和教育软件开发中,Flash技术一直扮演着重要角色。...在压缩包“flash 3.0拼图游戏”中,你可以找到源代码和资源,进一步探索和研究AS3.0在拼图游戏开发中的应用。

    Flash制作的19个小游戏源码

    Flash制作的小游戏,有AS2.0,也有3.0,大家可以用于学习!,美女来找茬,拼图游戏,射击,扫雷,flash 3.0太空战机,flash 3.0五子棋

    flash+as3.0九宫格拼图游戏

    FLA文件则包含源代码和设计资源,用于编辑和重新编译游戏。 总的来说,这个项目涉及了Flash动画制作、AS3.0编程、游戏逻辑设计以及视觉素材的整合,是学习和实践Flash游戏开发的好实例。开发者可以通过研究这个项目...

    智力拼图_flash_as3_源文件_fla

    标题中的“智力拼图_flash_as3_源文件_fla”揭示了这个压缩包包含的是一个基于Flash ActionScript 3(AS3)开发的智力拼图游戏的源代码。Flash是一种曾经广泛用于创建交互式网页内容的技术,而AS3是其编程语言,提供...

    Flash CS5 as3.0制作的拼图游戏

    这个文件是游戏的主要源代码,包含游戏逻辑。可能包括拼图的生成、碎片的移动和旋转功能、游戏状态的管理(如开始、暂停、重置)以及与用户的交互事件处理。 4. **JigsawPuzzle.fla**: 这是一个Flash文档,包含...

    flash builder 拼图游戏源码 含开发文档

    6. `src`:源代码目录,包含了游戏的主程序和所有类文件。在这里,开发者可以找到游戏的逻辑控制、图形渲染、事件处理等核心代码。 7. `resource`:资源文件夹,存储了游戏所需的图片、音频、XML配置文件等静态资源...

Global site tag (gtag.js) - Google Analytics