AS3 퍼 즐 게임 분석
퍼 즐 게임 코드 를 보 니 수확 이 많 았 다.
기본 원리:
절단 이미지 코드:
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
게임 발전 사 (Shell 디지털 게임)원래 셸 스 크 립 트 연습 자 를 쓰 려 고 했 는데 갑자기 궁금 해서 디지털 게임 을 해 보 려 고 했 습 니 다. 가장 먼저 가장 원시 적 인 디지털 스 크 립 트 를 썼 습 니 다. 기능 이 든 미관 도 든 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.