본문 바로가기

OOP, FP/스칼라로 만드는 테트리스

05. [스칼라 테트리스] 개발시작 01. GUI 라이브러리 비교와 전체구조

자바 스윙기반의 스칼라 싱글 테트리스에 대한 분석을 마쳤다.

이제 이를 기반으로 나만의 프로그램을 어떻게 만들 것이며, 무엇이 필요한지에 대한 정리가 필요하다.

  1. Swing 의 단점이 무엇일까?

    1. 학창 시절, 스윙의 단점은 속도에 있다고 배웠다.

      1. 스윙 기반의 가상 윈도우를 만들었는데, 속도가 굉장히 느렸다.

        1. 실행 시 메모리를 너무 많이 차지한다.

      2. 속도는 시간이 해결해준다?

        1. 1995년 자바가 처음 등장했을 때부터 제기되었다.

        2. 아직까지 해결이 안되었다.

        3. 8년? 10년 뒤에도 같은 문제가 제기될 것이다.

        4. 비주얼 베이직보다 느린 스윙을 선호하는 사용자는 별로 없다.

    2. 초기 Java 설계 시 함수 포인터의 개념을 빼서 오직 인터페이스만을 이용해서 Event Driven을 만들어야 한다.

      1. 코드가 길어진다.

      2. 재사용이 어렵다.

    3. 단점이라고 하긴 뭐하지만, OS별로 유저인터페이스나 디자인이 조금씩 다르다.

  2. 그럼 스윙을 이용한 프로그램은 단지 공부용인가?

    1. msn 메신저

      1. 오래 전 스윙으로 만들어진 MSN 메신저

      2. Native 자바로 되어있어 어떤 운영체제 환경이든 비슷한 GUI를 보여준다.

    2. 일단 AWT에 비해서 기능이 많다.

    3. msn 메신저 말고는 실사용예를 못찾겠다....

  3. 스윙의 대안은?

    1. SWT

      1. Eclipse의 윈도우 툴킷

      2. 플랫폼별로 배포용 패키지(jar)가 나뉘어져 있다.

        1. 윈도우용 SWT

        2. Solaris용 SWT

        3. Linex용 SWT

      3. 스윙과 달리 환경별로 다르지 않은 통일된 디자인을 제공한다.

      4. 고속, 경량으로 스윙보다 성능에서 앞선다.

      5. 하지만, 순수 자바만으로 가동할 수 없으며 스윙의 모든 기능을 SWT로 대체할 수 없다.

        1. SWT만의 기능도 존재한다.

      6. 문서를 찾기가 어렵다.

    2. ScalaFX - scala api for javaFX

      1. 자바의 큰 짐이었던 Swing GUI를 대체할 새로운 엔진

      2. HTML5와 관계없이 지속적으로 개발되었다.

      3. 스윙보다 더 가벼워지고 강력한 기능을 가지며, 데스크탑 뿐 아니라 웹 브라우저에서도 실행 가능

      4. ScalaFX는 Scala-Swing, Scala-SWT 보다 문서화가 잘 되어있다.

      5. MVC 패턴에 친숙하여 프레젠테이션(CSS, FXML), 모델(JAVA, Domain Object) 및 로직(Java)와 같이 작업을 구분할 수 있다.

  4. 위와 같은 점만 놓고 보면, ScalaFX로 작업하는게 좋은 것인가?

    1. 일단 스윙은 못생겼다.

      1. 하지만, 이미 사용해본 적이 있어 익숙하다.

    2. 스윙은 오라클에 의해 JavaFX에 찬성하여 서서히 사용하지 않게 되었다.

    3. JavaFX는 실제로 고유 UI 툴킷이 아니라, 웹 컴포넌트를 사용하여 GUI를 작성하는 라이브러리이다.

      1. CSS로 스타일을 지정한다.

    4. 결론, 일단 익숙한 스윙으로 프로그램 개발

      1. 이후 스윙으로 속도나 컴포넌트의 한계에 닿을 경우 ScalaFX를 고려

  5. 1인용 프로그램 개발 시작

    1. 정사각형 Block

      1. 정사각형의 색상, 크기

      2. 블록의 종류를 랜덤하게 생성

      3. 각 회전된 모양의 positions

        1. 블록의 종류마다 4가지 회전된 모양을 갖는다.

        2. 각 모양은 4개의 정사각형으로 이루어져 있다.

        3. 화면에 그리기 위해 4개의 정사각형이 그려질 좌표 관리해야 한다.

        4. 각 좌표는 (x, y)의 튜플로 이루어져있다.

    2. 정사각형 Block의 position를 기반으로 패널에 블록을 표현할 테트로미노

      1. 회전, 이동, 드랍, 현재 Block의 positions를 제공

      2. 테트로미노는 Board의 정 중앙부터 그려진다.

        1. position = (Board.height / 2, 1)

    3. 테트로미노가 그려질 Board 패널

      1. 블록이 채워질 패널의 각 셀의 좌표는 2차원 배열로 관리한다.

      2. 테트로미노 블록이 움직이기 위해 판정을 해야한다.

        1. 테트로미노 4블록이 배열에 그려지므로, 가고자 하는 방향에 어떤 물제가 있는지, board의 끝인지를 검사한 뒤, 움직일 수 있으면 true, 아니면 false를 반환한다.

      3. 블록이 쌓일 때 마다 x좌표가 꽉 찬 row를 삭제하고 점수를 갱신하는 기능이 필요하다.

    4. Board에서 게임을 진행할 BoardController

      1. 게임 진행은 Timer를 이용한다.

        1. ActionListener 익명 클래스를 구현하여 Timer 클래스의 생성자에 전달하면 해당 객체의 actionPerformed 함수가 지정한 간격마다 실행된다.

      2. 게임이 진행되는 속도를 제어해야한다.

        1. Timer 클래스의 setDelay메소드를 이용하면 진행 속도를 제어할 수 있다.

        2. StartTickInterval /  (Math.sqrt(score/5).toInt + 1)로 지정해두어, 점수가 올라갈 때마다 속도가 빨라지게 할 예정

        3. 점수는 보드에서 한 줄이 클리어되면 +1점, 4줄이 클리어되면 +4점씩 증가한다.

      3. 키 입력을 감지하여 테트로미노 블록을 조작한다.

        1. Reactor 트레잇을 구현하여 Reactions.Impl의 += 메소드를 이용하면 키 입력을 감지하여 이벤트를 설정할 수 있다.

    5. Board 패널을 그릴 TetrisPanel

      1. 왼쪽 영역

        1. 검은색 배경

        2. 현재 조작중인 테트로미노 블록

        3. 현재 조작중인 테트로미노가 떨어질 위치에 표현되는 고스트 블록

      2. 오른쪽 영역

        1. 다음에 생성될 블록 미리보기

        2. 현재 점수

    6. 최상위 프레임

      1. 어플리케이션 title

      2. 상단 메뉴바

        1. 새게임

        2. 일시정지

        3. 도움말

        4. 구분선

        5. 종료

      3. 테트리스 패널