티스토리 뷰

- Tile based games (http://www.tonypa.pri.ee/tbw/start.html)
위 튜토리얼을 기본으로 하여 Android에 사용될 수 있게끔 공부한 포스트 입니다.



이번에는 기초 과정도 함께 했으므로 이번 포스트는 짧고 간단하게 작성하도록 한다.
본래 Hit the wall에 나온 예제를 옮겨 봤다. 이번에 해보면서 너무 많은 시행착오를 겪었다. 무엇보다 나랑 방향이 어디서부턴가 어긋나고 있는지 알고리즘이 그대로 적용되지 않는다.. 그래서 수정된 부분 소스만 올리고 이번 포스트는 끝내도록 하겠다.

이제부터는 풀소스도 첨부하도록 함



1. 알고리즘 정리

 

 이전 응용과 다른 내용은 이전 포스트에서는 상,하,좌,우를 체크 했지만 이번엔 4개의 꼭지점을 체크 해야 한다는 것이다. 옆의 그림처럼 Hero 사각형의 각 꼭지점을 이용하여 벽의 길이를 체크하도록 처리 한다.

그러기 위해서 4개의 코너를 체크해야 하는 함수가 필요하며 각 꼭지점의 이동 가능 여부를 확인 하여 Hero를 움직여야 한다.

자세한 내용은 원본 튜토리얼 Site를 확인 하면 더 자세한 그림을 볼 수 있다.

소스를 놓고 비교해보자.

2. 소스


public void getMyCorner(MAP map) {
		
	int x = scr_posX;
	int y = scr_posY;
		
	switch(DataMgr.CURRENT_KEYPAD_DIRECTION) {
	case UI_Enum.KEY_DIRECTION_LEFT:
		x -= speed;
		break;
	case UI_Enum.KEY_DIRECTION_TOP:
		y -= speed;
		break;
	case UI_Enum.KEY_DIRECTION_RIGHT:
		x += speed;
		break;
	case UI_Enum.KEY_DIRECTION_BOTTOM:
		y += speed;
		break;
	}
		
	downY 	= (int) Math.floor((y+DataMgr.HERO_HEIGHT-1)/DataMgr.MAP_TILE_HEIGHT);
	upY 	= (int) Math.floor(y/DataMgr.MAP_TILE_HEIGHT);
	leftX 	= (int) Math.floor(x/DataMgr.MAP_TILE_WIDTH);
	rightX 	= (int) Math.floor((x+DataMgr.HERO_WIDTH-1)/DataMgr.MAP_TILE_WIDTH);
		
	Log.d("YSK","downY="+downY+" upY="+upY+" leftX="+leftX+" rightX="+rightX);
	
	upLeft		= map.isWalkable(leftX, upY);
	upRight		= map.isWalkable(rightX, upY);
	downLeft	= map.isWalkable(leftX, downY);
	downRight 	= map.isWalkable(rightX, downY);
		
	Log.d("YSK","upLeft="+upLeft+" upRight="+upRight+" downLeft="+downLeft+" downRight="+downRight);
}
 
4귀퉁이를 체크하여 이동 가능 지역인지 확인하여 변수에 셋팅 해주는 함수이다. 이전 포스트를 보면 크게 변경된 사항은 없다.

고려된 사항은 다음 항목과 같다.
가) Hero 이동시 speed 만큼 이동되므로 방향에 맞게 speed를 가감해준다.
나) downY, upY, leftX, rightX 체크를 통해 상하 좌우의 좌표를 확인 한다. 알고리즘은 어디서부턴가 꼬여서 프로젝트에 맞게 재수정 했다.
다) 상단 2꼭지점(upLeft, upRight), 하단 2꼭지점(downLeft, downRight)에 해당하는 좌표를 체크해준다.


switch(DataMgr.CURRENT_KEYPAD_DIRECTION) {
	case UI_Enum.KEY_DIRECTION_LEFT:
		if(upLeft == 1 && downLeft == 1)
			resultX-=speed;
		else
			resultX = (map_posX * DataMgr.MAP_TILE_WIDTH);				
		break;
		
	case UI_Enum.KEY_DIRECTION_TOP:
		if(upLeft == 1 && upRight == 1)
			resultY-=speed;
		else 
			resultY = (map_posY * DataMgr.MAP_TILE_HEIGHT);				
		break;
		
	case UI_Enum.KEY_DIRECTION_RIGHT:
		if(upRight == 1 && downRight == 1)
			resultX+=speed;
		else
			resultX = ((map_posX+1) * DataMgr.MAP_TILE_WIDTH) - DataMgr.HERO_WIDTH;
		break;
		
	case UI_Enum.KEY_DIRECTION_BOTTOM:
		if(downLeft == 1 && downRight == 1)
			resultY+=speed;
		else 
			resultY = ((map_posY+1) * DataMgr.MAP_TILE_HEIGHT) - DataMgr.HERO_HEIGHT;
		break;
			
	default:
		break;
	}

Move() 메소드는 위와 같이 처리 해주었다. 알고리즘 역시 지금 프로젝트와 맞지 않아서 수정한 상태이다.

댓글
댓글쓰기 폼