AS3 퍼 즐 게임 분석

3593 단어 게임.알고리즘

퍼 즐 게임 코드 를 보 니 수확 이 많 았 다.
 
기본 원리:
  • 그림 한 장 을 읽 고 작은 조각 으로 자 르 고 순서대로 위치 (XY) 를 배열 합 니 다.그리고 헝 클 어 짐
  • 마우스 가 눌 렀 을 때 이 슬라이스 와 연 결 된 다른 슬라이스 를 판단 하고 찾 아 drag 데이터
  • 에 추가 합 니 다.
  • 마우스 EMOVE 시간 을 감시 하고 drag 배열 의 슬라이스 가 마 우 스 를 따라 이동 하여 드래그 효과
  • MOUSEUP 시간 을 감시 하고 DRAG 데이터 중 절편 을 설정 격자 안 으로 이동 (접착 효과 유사)
  • 절편 들 의 위치 판단 을 통 해 게임 종료
  • 어 려 운 점 은 효과 적 인 알고리즘 이 특정한 절편 과 연 결 된 다른 절편 의 집합 을 구 하 는 데 있다.
     
    절단 이미지 코드:
    var bitmap:Bitmap = new Bitmap(new BitmapData(w,h));
    var rectangle:Rectangle = new Rectangle(x,y,w,h);
    bitmap.bitmapData.copyPixels(fromBitmapData,rectangle,new Point(0,1));
    //   sprite
    sprite.addChild(bitmap);

     
    판단 이 연결 되 어 있 는 절편 집합 은 오랫동안 보고 나 서 야 알 게 되 었 다.
     먼저 다른 절편 과 피 구 절편 I 의 거 리 를 구하 고 수 조 를 추진한다.
     대체로 작은 순서 로, 묘 하 다.
     가짜 로 표 시 를 설정 하고 순환 을 시작 합 니 다.
     -- 순서대로 슬라이스 (거리 에 따라 크 고 작 음) 를 꺼 내 상하 좌우 4 방향 에 DRAG 로 표 시 된 슬라이스 연결 이 있 는 지 판단 한다.
     -- 존재 하면 DRAG 배열 로 밀어 넣 고 순환 되 는 배열 의 위치 에서 제거 하고 진짜 로 표 시 됩 니 다.
     -- 진짜 로 표시, 계속 순환
     
     크 고 작은 순서 이기 때문에 연 결 된 절편 이 존재 한다 면 DRAG 에 밀어 넣 는 순 서 는 원본 절편 과 연 결 된 것 을 먼저 찾 은 다음 에 그 와 연 결 된 절편 을 층 층 이 찾 을 것 이다.내 가 생각 했 던 것 보다 검색 하 는 어 리 석 은 방법 으로 훨씬 간편 해 졌어, 짠.
    		// 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;
    		}

    좋은 웹페이지 즐겨찾기