1. User Interaction

사용자와 상호작용하기 위한 방법을 배워 본다. 가장 기본이 되는 mouse 와 keyboard를 통한 제어 방법을 살펴본다.


2. Keyboard Input

cinder에서는 keyDown() 함수를 사용하여 key input을 받을 수있다. event를 통해서 들어온 key 값은 event.getCode()와 evet.getChar()를 통하여 알 수 있다. keyDown 함수에 다음과 같이 작성하면 오른쪽 화살키가 들어오는 것을 할 수 있다.



이러한 키를 사용하여 FPS에서와 같이 카메라를 움직이는 등의 작업을 할 수 있다.



3. Mouse Input

cinder에는 5개의 마우스 리스너를 제공한다. mouseDown(), mouseUp(), mouseMove(), mouseDrag(), mouseWheel().뿐만 아니라 shift키와 함께 눌렸는지도 알 수 있다. 아래 예제는 shift를 누르고 마우스 버튼을 눌렀는지도 알 수 있다.

다음 예제는 mouse 포인터의에 따라 particle들이 방향을 표시하고 vector로 표시되는 particle이 따라오는 예제이다. 이 예제릉 위하여 마우스의 위치를 표시할 수 있도록 마우스 포인터의 위치를 update의 parameter로 넘기는 코드이다.


Particle update 역시 같은 방식으로 변경하고 cursor의 위치를 알 수 있도록 cinder::Vec2f의 mDirToCursor 변수를 설정한다.

이제 넘어온 커서를 이용하여 particle의 위치를 결정하고 draw 해주어야 한다.


particle의 현재 위치에서 마우스의 위치로 향하는 화살표를 생각해보자. 마우스의 위치에서 particle의 현재 위치를 빼면 마우스로 향하는 vector를 표시할 수 있다. Draw는 다음과 같이 작성한다. gl::drawVector()를 이용하여 방향성 있는 vector를 그릴 수 있다. 

위의 cinder 예제는 길이 15에 mDirToCursor를 곱하게 되어 있어 마우스를 빠져나가 반대 방향까지의 화살이 표시된다. arrowLength를 1.0f로 변경하고 실행하면 아래와 같은 화면을 볼 수 있다. (화살표의 방향은 많은 화살표가 뭉쳐있어 보이지 않는다)



cinder에서는 vector 값에 대한 normalize 함수도 제공한다. vector normalization을 통해 0~1사이의 값으로 변화 시킬수 있으며 0이 였을 경우의 문제를 해결하기 위해 safeNormalize 함수도 제공한다고 한다. ci::Vec2::safeNormalize() 함수를 이용하면 이런 문제를 해결 할 수 있다. 아래와 같이 safeNormalize 함수를 적용하면 다음과 같음 그림을 볼 수 있다.






Posted by 빨간 양말