본문 바로가기

창고/Backup_2013_0121

정현이도 할수 있는 안드로이드 어플개발 -3 : 테트리스 블럭 그리기 및 회전하기

반응형

저번 시간에 말했듯이 오늘은 블럭을 그리고 회전 뺑구리-ㅅ-를 해볼것이다.
자~ 그럼 슬슬 프로그램의 모습을 갖추기 위하여 블럭의 보든것을 담당할 Class 를 만들자.
이름은 Block 으로 하면 되고~
블럭이 할수 있는일은~
만들어질때 먼모양인지 정해지기 - 생성자
자신의 위치 어딘지 기억하기
움직이기 상은 아니고 하 좌우 ~ move
회전하기 시계방향 뱅글뱅글~ rotate

이정도를 갖는 클래스가 되겠다~
대충 쓰면

public class Block { 
 private int current_x; 
 private int current_y;
 private int[][] current_block;

 public Block(int start_x, int start_y, int blocktype)
 {
 }
 
 public void move(int direction)
 {
 }
 
 public void rotate()
 {
 }
 
 public void onDraw(Canvas canvas)
 {
 }
   
 }
}

요런 클래스가 되는거다.
자~ 그럼 이제 블럭모양을 어떻게 가지고 있는게 좋을까?
고민좀 해봤는가?
-ㅅ-;;
머 첫시간에 사각형을 하나 그렸으니 이를 이용해 블럭을 그려야 한다
그러므로 사각형이 어디에 있는지를 2차원 배열로 표현하고 이를 가지고 블럭타입을 정의 하면 편할것이다.
어떻게 그런생각을 하냐고? 잠자기전에 생각하면 다 떠오른다-_-;; ㅎㅎ
어쨌든 먼말인고? 하는 사람을 위해 막대기와 항상 나뭇가지가 생각나는 블럭두개를 이차원 배열로 정의하면

 private final int[][] BLOCK01 = { 
            {0,0,1,0},
            {0,0,1,0},
            {0,0,1,0},
            {0,0,1,0} }; 
 
 private final int[][] BLOCK02 = {  
            {0,0,1,0},
            {0,1,1,0},
            {0,1,0,0},
            {0,0,0,0} };

요렇게 되는것이다.  1이 있는곳이 우리의 블럭이 그려질곳이다.
매직아이로 보면 막대기 블럭과 나뭇가지 블럭이 보인다-_- (뻥~ )

자 그럼 블럭의 생성자에는 무어가 들어가야할까?
이렇게 질문하는거은 시간낭비;;
미안하다;; 앞으론 안물어보겠다;;

생성자에는 현재위치와 (초기화 0,0 이겠지?) 블럭타입이 들어가면 된다.
지금은 테스트니 위에 있는 블럭을 현재 블럭으로 복사 해주면된다.

그럼 생성자 모양은  요런모양이 된다.

 public Block(int start_x, int start_y, int blocktype)
 {
  current_x = start_x;
  current_y = start_y;
  /* blocktype 에 따라 블럭 배열 복사 */
  current_block = (int[][])BLOCK02.clone();
 }
Object 에 정의되어 있는 clone 이라는 고마운 함수땀시 배열을 순환하며 복사할 필요가 없다~ 웃흥~
위 생성자는 당연히 완성작이 아니다. 블럭타입이 아직 쓸모가 없으니.. 알아서 나중에 고치도록~

move 쪽은 당연히 현재 위치만 + 해주면 되므로 생략하고
그리는것도 저번시간에 그리는 방법을 배웠으니 배열을 돌면서 적당한 위치에 그리면 되므로 생략한다.

그럼 이번시간의 메인이라고 할수 있는 rotate 를 보자~
사실 블로그 글 쓰기 전까지 고민고민-_-;; 했는데 요거 생각보다 쉽지가 않다;;

4*4 방안지를 넣고 회전한 이후의 위치를 보니 그냥 좌표값으로 나타내기가 쉽지가 않다;;
sin 회전식까지 써서 돌려볼까하다가;;
구글신에게 검색해서 물어보니 의뢰로 쉽게 나온다;; -ㅁ-;;
자~ 각자 찾아보자 =-_- 응?;
..
바로~ 그방법으로 하면된다..
즉, 원래 좌표 (x,y) -> (y,-x) 로 하는데 -x 좌표는 음수이므로 배열의 크기 -x 하면 된다.
그럼 rotate 도 완성!~ 오예~

이젠 제대로 동작하는지 실제로 돌려보자~

저번에 만들어놨던 DrawSquare 클래스를 이용하면 된다.
OnDraw 쪽에 있는 사각형 그리기 로직을 지우고
Block 클래스를 생성하고 그린다~

아~ 회전도 해야 하므로
View의 onTouchEvent 함수를 오버라이딩 해서 로테이트를 집어넣고 테스트 하자

화면조작후에는 다시그리기 함수 invalidate 를 호출하면 된다.

나의 성공화면과 소스를 올리며 이번시간을 끝내겠다;;

추신 : 감기걸려서 길게 못써서 설명이 짧아 ㅈㅅ 버뜨 물어보면 다 가르쳐줌 ㅎㅎ
하지만 아무도 안물어볼꺼 알지렁-_-/ㅋㅋㅋ

다음시간에는 블럭쪽 정리 마무리 하고 좌우 아래로 움직이게 해보겠다
이거이거 이러다가 금방 만들겠는걸-ㅅ-?;;



반응형