로 늦어졌습니다.-_-;
step1. Element 접근
파괴를 하기 위해선 Board에 위치한 각각의 Element를 Coord로 접근할 수 있어야한다.
예를들어 getElement(4,4) 라는 함수를 호출하면 4,4 째 위치한 원소에 접근해야 할 것이다.
여기서 약간 UITable을 집고 넘어가고자 한다.
UITable안에서 각각의 원소를 rep-osition하기전에 가지고 있는 List
clear하는 만행(?)을 저지른다. 이후 다시 getChild로 List를 만들고 다시 Sorting한 다음에
배열하는 방식을 쓰고 있다. 왜 이러는지는 모르겠지만 역시나 좀 안좋아 보인다고
엔진을 건드리는 일은 하지말자.
아무튼 이전에 썼던 OnDragOver를 보자
이것을 보면 좌표를 바꾼 후 Rep-osition을 하는 대신 이제 원을 그리며 움직이는 함수를 넣고있다.
하지만 Rep-osition을 안하면 UITable 내부에 있는 children List에는 sorting 되지 않은체
단지 좌표만 바뀌게 되어버린다. 좌표를 바꾼후 List를 Sorting 하려면 다음 코드를 추가하면된다.
board.children.Sort(board.compareCoord);
하지만 단지 두개의 원소가 뒤바뀔뿐인데 소팅까지 하는건 별로 좋아보이지 않는다.
단순히 Swap(a,b)만 하면 될인인데 List
이미 정의되어 있는 함수에 Swap을 추가하는 방법은 다음과 같다.
이미 copyPDTool 이라는 클래스가 있으니 이 클래스를 다음과 같이 고쳐보자.
static 클래스로 고쳤고 swap이라는 함수를 추가했는데 매게변수로
this라는 키워드도 보인다. 역시 C#에서 확장메서드를 추가하는 방법인데
필자도 그냥 외우고 있는 방법이다.
1.1 추가
여기서 List
아래와 같이 수정해주면 된다.
이렇게 추가하면
다음과 같은 방식으로 리스트에 있는 원소를 바꿀 수 있다.
이제 당초 목적인 getElement 함수를 만들면 된다.
step 2. 이제 우리는 찾아낼 것이다. 파괴할 Element를
이제 무엇을 파괴할것인지 찾아내야 한다. 필자가 사용한 알고리즘은 다음과 같다.
0. List
1. 아래 방향으로 움직이면서 3개이상 연속된 Element들을 찾아 List에 넣는다.
2. 옆 방향으로 움직이면서 3개이상 연속된 Element들을 찾는다. 여기서 1. 에서 중복된 원소를 넣지 않는다.
DectectionColumn()와 DectectionRow() 함수를 추가했다.
이제 잘 동작되는지 살피기 위해 Label 하나를 추가했고
파괴할 드롭은 검정색으로 변하게 만들었다.
소스 주소 : https://github.com/geniikw/copy-of-puzzleD/
다음번엔 드롭을 파괴하고 내려오는 것까지 올리겠습니다. 12시쯤에 올릴 수 있으면 올립니다.
질문이나 피드백 오류지적 환영합니다.
질문이나 추가사항은 다음 마이피에 추가되어 올라갑니다.