Skip to content

Latest commit

 

History

History
125 lines (72 loc) · 4.46 KB

10.self_moving_world.adoc

File metadata and controls

125 lines (72 loc) · 4.46 KB

10. 스스로 움직이는 물체

Keyword

  • Thread

  • Synchronization

Thread를 학습하기 전까지는 프로그램의 대부분이 하나의 thread에서 동작하였다. (정확히 말해서는 그렇지 않지만, 최소한 여러분이 작성한 코드에 대해서는 그러하다)

이제는 thread에 대해서 학습하고 연습하였으므로 게임에 적용해 보도록 하자.

10-1. Movable interface

Thread에 대해 이해하였다면, Movable을 Thread 적용이 가능한 Runnable 인터페이스의 확장으로 정의한다.

Movable은 스스로 움직일 수 있는 type으로서, 이에 필요한 함수 추가가 요구된다.

정의

  • 이동을 위한 단위 시간을 설정하거나 얻어 올 수 있다.

  • 움직임을 시작하거나 멈출 수 있다.

Method

  • int getDT()

    • 단위 시간을 돌려 준다.

  • void setDT(int dt)

    • 단위 시간을 설정한다.

  • void start()

    • 움직임 시작한다

  • void stop()

    • 움직임 멈춘다


Exam-10-1-1. Movable 인터페이스를 Runnable 인터페이스의 확장으로 정의하고, MovableBall, MovableBox 등을 thread로 동작하도록 수정하라

  • 구현 class는 별도의 Thread 인스턴스의 도움을 받지 않도록 구현한다.

주의

  • paint 함수가 어느 thread에서 실행되는지 확인하라.

  • 동일한 자원에 대해 두 개 이상의 thread가 동시 접근 시 문제가 될 수 있다.

    • Thread 학습에서 배운 내용으로 대처하라

확인


10-2. MovableWorld class

MovableWorld에서는 일정한 시간 간격으로 오브젝트를 이동시키는 작업을 수행하였다.

오브젝트를 Runnable type으로 전환하여 개별적으로 동작하게 할 경우, 오브젝트 이동을 위한 작업은 필요 없게 되고 전체적인 동작의 시작과 멈춤만 수행하면 된다.

또한, MovableWorld에서만의 관리 작업이 필요하다면, MovableWorld도 thread를 이용해 독립적으로 동작하는 오브젝트로 변경하면 된다.

이를 위해 함수를 수정한다.

10-2-1. 수정

  • Thread에 의해 개별 동작할 것은 Runnable 인터페이스를 구현한다.

Variable

  • Thread 관리를 위한 thread 추가한다.

Method

  • Thread를 이용해 구동할 것으로 run을 제거하고,

  • Thread 구동을 위한 main 함수 추가한다.

  • Thread 시작과 멈춤을 추가한다(start/stop)


Exam-10-2-1. MovableWorld가 독립적으로 돌 수 있도록 수정하라.

  • thread


확인

  • 이전과 같이 동작하나?

  • 오브젝트는 동작 중에 추가되거나 삭제될 수 있다.

    • 자원 동시 접근 문제가 발생할 수 있다.

10-3. 충돌 감지 및 튕기기

앞서서는 BoundedWorld에서 오브젝트를 이동시키고, 충돌 감지 및 그에 따른 튕기기를 구현하였다. Movable 개체에 대해 thread를 적용하여 스스로 움직임을 구현한 후 더 이상 BoundedWorld에서 개별 오브젝트에 대한 충돌 검출 및 튕기기 구현이 어려워졌다. 어떻게 해야 할까?

BoundedWorld의 기본 역할은 유지하지만, 오브젝트를 이동시키는 주체가 변경되었으므로 이를 조정해 보자.

BoundedWorld에서 이동과 충동 검출을 함께 할 경우, 이동 후 시점에 대해서 스스로 알 수 있지만, 개별 오브젝트가 스스로 움직일 경우 해당 시점을 알 수 없다.

어떻게 해결해야 할까?

고려 사항은 다음과 같다.

  • 움직이는 주체는 오브젝트이다.

  • 경계 영역에 대한 정보는 해당 오브젝트가 가질 수 있다.

  • 오브젝트 간 충돌 확인을 위해서는 World의 오브젝트 목록이 필요하다.

    • 오브젝트 등록 시 목록을 받고, 신규 등록 시 업데이트되거나

    • 매번 World에 요청하거나


Exam-10-3-1. 오브젝트가 이동 후 World로부터 정보를 받아 충돌 감지 및 튕김 구현이 가능하도록 수정하라

  • World에 오브젝트를 추가할 때, 오브젝트에 world를 참조할 수 있도록 정보를 제공한다.

  • 오브젝트는 이동 후 충돌 확인 world로부터 장애물(경계영역, 다른 오브젝트)에 대한 정보를 받아 충돌 확인한다.

  • 충돌 검출 시 튕기면 처리한다.


확인