자 이제 우리의 블럭들이 움직일수 있게 할날이 왔다 =ㅁ=/ ㅎㅎ
그전에 알아서들 블럭들을 잘그리시고~
참고로 나는 막대기와 ㅓ 자와 나뭇가지와 그거 반전 ㄴ 자와 반전 요렇게 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);
를 추가해주면 잘움직이는 블럭을 볼수가 있다.
그럼 모두들 성공하고~
다음시간에는 충동체크와 함께 블럭을 쌓이게 해보도록 하자~
열공~~ㅂㅂ