Keyword
-
Thread
-
Synchronization
Thread를 학습하기 전까지는 프로그램의 대부분이 하나의 thread에서 동작하였다. (정확히 말해서는 그렇지 않지만, 최소한 여러분이 작성한 코드에 대해서는 그러하다)
이제는 thread에 대해서 학습하고 연습하였으므로 게임에 적용해 보도록 하자.
Thread에 대해 이해하였다면, Movable을 Thread 적용이 가능한 Runnable 인터페이스의 확장으로 정의한다.
Movable은 스스로 움직일 수 있는 type으로서, 이에 필요한 함수 추가가 요구된다.
-
이동을 위한 단위 시간을 설정하거나 얻어 올 수 있다.
-
움직임을 시작하거나 멈출 수 있다.
MovableWorld에서는 일정한 시간 간격으로 오브젝트를 이동시키는 작업을 수행하였다.
오브젝트를 Runnable type으로 전환하여 개별적으로 동작하게 할 경우, 오브젝트 이동을 위한 작업은 필요 없게 되고 전체적인 동작의 시작과 멈춤만 수행하면 된다.
또한, MovableWorld에서만의 관리 작업이 필요하다면, MovableWorld도 thread를 이용해 독립적으로 동작하는 오브젝트로 변경하면 된다.
이를 위해 함수를 수정한다.
-
Thread에 의해 개별 동작할 것은 Runnable 인터페이스를 구현한다.
앞서서는 BoundedWorld에서 오브젝트를 이동시키고, 충돌 감지 및 그에 따른 튕기기를 구현하였다. Movable 개체에 대해 thread를 적용하여 스스로 움직임을 구현한 후 더 이상 BoundedWorld에서 개별 오브젝트에 대한 충돌 검출 및 튕기기 구현이 어려워졌다. 어떻게 해야 할까?
BoundedWorld의 기본 역할은 유지하지만, 오브젝트를 이동시키는 주체가 변경되었으므로 이를 조정해 보자.
BoundedWorld에서 이동과 충동 검출을 함께 할 경우, 이동 후 시점에 대해서 스스로 알 수 있지만, 개별 오브젝트가 스스로 움직일 경우 해당 시점을 알 수 없다.
어떻게 해결해야 할까?
고려 사항은 다음과 같다.
-
움직이는 주체는 오브젝트이다.
-
경계 영역에 대한 정보는 해당 오브젝트가 가질 수 있다.
-
오브젝트 간 충돌 확인을 위해서는 World의 오브젝트 목록이 필요하다.
-
오브젝트 등록 시 목록을 받고, 신규 등록 시 업데이트되거나
-
매번 World에 요청하거나
-
-
World에 오브젝트를 추가할 때, 오브젝트에 world를 참조할 수 있도록 정보를 제공한다.
-
오브젝트는 이동 후 충돌 확인 world로부터 장애물(경계영역, 다른 오브젝트)에 대한 정보를 받아 충돌 확인한다.
-
충돌 검출 시 튕기면 처리한다.