본문 바로가기
창고/Backup_2013_0121

정현이도 할 수 있는 안드로이드 어플 개발 - 4 : 블럭정리 및 이동

by 가능성1g 2011. 2. 14.
반응형

자 이제 우리의 블럭들이 움직일수 있게 할날이 왔다 =ㅁ=/ ㅎㅎ

그전에 알아서들 블럭들을 잘그리시고~
참고로 나는 막대기와 ㅓ 자와 나뭇가지와 그거 반전 ㄴ 자와 반전 요렇게 6개의 블럭을 정리 했다.
행렬로 잘그리면 이쁘게 나온다-_-

혹시 못하겠으면 첨부 소스보면 된다.

음...

그리고 저번에 회전 할때 (x,y) -> (y,-x) 로 바꾸면 된다고 했는데
왜 이렇게 바꾸면 되는지는
아무도 안물어보았지만 =ㅅ=;;ㅋㅋ 그냥 혼자 궁상떨다가 고민 해보니~
대학교때 아무생각없이 듣던 리니어 엘지브라 (선형대수) 와 관련있는것이었다.
머~ 고딩때도 행렬의 회전이라고 해서 배운다.

즉, 2차원 좌표의 회전을 하기위해서 단위원( 반지름 1인 원 )을 그린담에
x,y 좌표를 사코 (sin, cos )로 나타낸담에 세타에 각도 넣은것이다 .

즉,
(x') = (cos 90, -sin 90 ) ( x )
(y')   (sin 90, cos 90  )  ( y )

x' = -y
y' = x
가 되는거다.

=ㅅ=;; 걍 그렇다;; 웬지 더 궁금해진 사람은 홍아저씨의 수학의 정석씨를 추천한다.

어쨌든 이제 블럭을 다 정리했으면,
키이벤트와 막물-_-려서 블럭을 이동시켜 보자.

사실 간지나게 터치이벤트로 왼쪽으로 밀고 오른쪽으로 밀고 하면 따라 움직이게 만들려고 했으나;;
웬지 에뮬레이터에서는 터치이벤트가 다운밖에 안일어 나드라;; 버근지 원래 그런지-_-;;;

어쨌든~ 그런거야 나중에 연결시키면 되므로!!!

KeyEvent 를 이용해서 블럭을 움직여보자~

KeyEvent 를 활용하기 위해서는 리스너를 이용하던가~
아니면 View 의 onKeyDown 함수를 오버라이딩 하면 된다.

보통 리스너를 implements 해서 View 를 여기에 연결시켜서 (아답터 패턴인가 머시기임 )
하는데~
보통 그렇게 하므로 난 오버라이딩 하겠다=ㅅ=;;

저번 소스에 이어서 클래스 이름을 바꿔야하지만 그냥;;
DrawSquare 클래스에
onKeyDown 함수를 오버라이딩 하자

@Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  return super.onKeyDown(keyCode, event);
 }

요렇게 써주면 끝~

참고로 하나 팁을 주자면 ~
이클립스에서는 오버라이딩할수 있는 함수를 친절하게 열려준다.
소스 페이지 에서 오른쪽클릭하면 뜨는 메뉴중에
Source > Override/Implements Method 를 선택하면
사용할수 있는 함수들이 주르륵~ 뜬다. 체크하고 확인 하면 위에 소스를 만들어준다~  우왕~=ㅁ=

다음은 간단하다
저기에 들어오는 keyCode 값에 따라 Block 을 요리-_-하면 되는것이다.
keyCode 값은 KeyEvent 클래스에 static 으로 정의 되어 있으니
스위치문을 이용해서 각각의 이벤트를 정의하면 된다.

하나만 예를 들어 쿼리 자판의 A 를 눌렀을때 왼쪽으로 이동시키는걸 만들기위해
switch ( keyCode )
{
    case KeyEvent.KEYCODE_A:
           bl.move(Block.MOVE_DIRECTION.LEFT );
    break;
}

요렇게 하면 되는것이다.

아 참고로 저번에 우리의 Block 클래스의 move 는
move (int direction)
요렇게만 정의해 놨는데
Class Block 에 enum type 으로 방향을 정의해놨고 저렇게 받아들이게 했다.
왜냐면~ 가독성이 좋으니까~
한눈에 봐도 왼쪽이동이라는걸 알수 있지 않느뇨? 캬캬캬~~!

항상 코딩을 하면서 가독성을 염두하시길!!
이를 위해서는 상수와 enum 을 잘 이용하면 좋다.

음...
넘기고~~

머~ 이런식으로 정의해서 , 이미 Block class 에 다 있는것들을 몇가지 수정만 하면
블럭을 각각의 키로 이동및 회전을 시킬수 있게 된다.

끝으로 역시 키가 누를때마다 onDraw 가 일어나야 하므로
invalidate();
하나 추가시켜 주면 된다.
라고 끝인건 훼이크=ㅅ=;;

사실 키이벤트를 받을려면 한가지 더 설정해야 하는것이 있다.
바로 포커스 설정!
Activity 에 추가되어있는 View 중 포커스를 받는것만이 키이벤트를 캐취할수가 있다.

그래서 사실 포커스 설정을 안해줘서 키가 작동을 안했다 ㅠㅠ;;

메인 Activity 라 할수 있는 TetrisTest01 의 View 생성 밑에쪽에
     ds.setFocusable(true);
     ds.setFocusableInTouchMode(true);
를 추가해주면 잘움직이는 블럭을 볼수가 있다.

그럼 모두들 성공하고~

다음시간에는 충동체크와 함께 블럭을 쌓이게 해보도록 하자~

열공~~ㅂㅂ

반응형