Giter Site home page Giter Site logo

designpattern's Introduction

DesignPattern

디자인 패턴 자습용 저장소. 프로그램 설계 및 관리를 위해서 공부합니다!

게임 프로그래밍 패턴(로버트 나이스트롬) 책을 공부한 기록을 남깁니다.

designpattern's People

Contributors

parkjonghyuck avatar

Stargazers

hayden avatar 홍경원 avatar

Watchers

James Cloos avatar  avatar

designpattern's Issues

경량 패턴 기록

image

경량 패턴은 하나의 객체에서 공통적이며 고유한 데이터를 분리하여 이를 재사용하는 패턴입니다.
고유한 데이터를 고유상태, 변하는 데이터를 외부상태라고 정의했습니다.
고유 상태를 재사용함으로써 메모리를 상당히 절약할 수 있습니다.
이는 GPU 인스턴싱과 비슷합니다.

image
image
image

옵저버 패턴 기록

image

주로 상속 받아서 사용하는 패턴이지만
책에서는 함수 포인터를 이용한 방식도 추천하고 있다.

명령 패턴 기록

단순한 구조부터 시작

image

플레이어 객체가 InputHandler에서 오는 값을 받아 움직이거나 총을 발사하는 등 특정 명령을 수행합니다.
위의 명령들은 플레이어에 종속된 함수이며 재사용 가능하지 않습니다.

각각의 함수들을 객체로 감싸서 의존성을 줄이고 재사용 가능한 형태로 만드는 게 명령 패턴인 것 같습니다.

명령패턴 구현

image

위와 같이 명령 함수를 Command라는 객체로 감쌈으로써 다양한 혜택을 얻을 수 있습니다.

  1. 동적할당을 이용해서 런타임 중에 키값에 해당하는 명령을 바꿀 수 있습니다.
    (예: 처음에 A는 Fire로 지정되어 있으나 환경설정->키보드셋팅 가서 다른 명령으로 바꿀 수 있습니다.)
  2. 새로운 명령을 추가하기가 쉬워집니다. Command 파생 클래스 구현 후 할당만 바꿔주면 됩니다.
  3. 아래와 같은 응용을 통해서 Command를 개발자가 자유롭게 조작할 수 있습니다.

응용 1 : 사용자를 매개변수로 만들어 사용합니다.

image

이전의 Command는 Player를 찾아서 움직여야 하는 가정이 있어서 제한적입니다.
Command가 사용자(주체, Actor)를 매개변수로 받게 되면 모든 사용자에 동일한 행동을 하게 할 수 있습니다.
Command는 Player만이 아니라 GameActor를 간접 참조함으로 느슨한 관계가 유지됩니다.
InputHandler는 사용자를 모르기 때문에 실행해야 하는 명령 객체를 반환합니다.
이러면 Player와 InputHandler가 디커플링이 됩니다.

응용 2 : 명령 객체를 이용하여 명령 UnDo, ReDo

image
명령이 실체화되었기 때문에 각 명령을 관리할 수 있습니다.
전략 게임이나 여러 툴을 구현할때의 Undo, Redo를 구현하기 쉬워집니다.
저는 C++ STL list의 iterator를 이용해서 구현해보았습니다.

상태 패턴 기록

게임 내에서 캐릭터는 많은 상태를 갖는다.
(걷기, 달리기, 멈추기, 돌기, 점프하기, 구르기, 엎드리기 ... )
이에 따른 많은 조건을 갖는다.
(걷기 불가능한 조건 : 점프, 구르기, 엎드리기 ... )
이런 조건을 if문과 bool 플래그 값으로 나타낸다면 매우 복잡한 코드가 될 것이다.
따라서 우리는 상태 패턴이 필요하다.

상태 패턴의 필요할 때

  1. 캐릭터 상태에 따른 분기가 많이생긴다.
  2. 각 행동이 불가능한 상태인지 알기 위해서 많은 플래그값이 필요하다.

유한 상태 기계 (FSM)

  1. 가질 수 있는 '상태'가 한정된다.
  2. 한 번에 '한 가지' 상태만 될 수 있다.
  3. '입력'이나 '이벤트'가 기계에 전달된다.
  4. 각 상태에는 입력에 따라 다음 상태로 바뀌는 '전이'가 있다.
    즉 FSM은 상태, 입력, 전이 로 구성되어있다고 볼 수 있다.

상태 인터페이스에 입장과 퇴장 부분을 구현하여 완전히 캡슐화 할 수 있다.

캐릭터가 들고 있는 무기에 따라서 동작이 달라진다면 병행 상태 기계를 사용해보자.
상태 기계를 2개 둠으로써 문제가 해결된다.
두 상태가 서로에게 영향을 끼치지 않을 경우 유용하다.

상태의 공통분모를 중복해서 사용하려면 상위 상태와 하위 상태로 나누어 상태를 상속받는 계층형 상태 기계가 유용하다.

상태가 바뀌기 전의 상태를 기억하는 방법으로, 상태를 스택에 넣어 관리하는 푸시다운 오토마타 방식이 있다.

요즘 게임 AI에서는 FSM만으로는 한계가 있다.
행동 트리(Behavior Tree)나 계획 시스템(Planning System)을 더 많이 사용하는 추세다.

FSM은 다음과 같을때 유용하다.

  1. 내부 상태에 따라 객체 동작이 바뀔 때
  2. 상태가 그다지 많지 않은 선택지로 분명하게 구분될 수 있을 때
  3. 객체가 입력이나 이벤트에 따라 반응할 때

FSM은 AI 외에도 입력처리, 메뉴화면 전환, 문자 해석, 네트워크 프로토콜, 비동기 동작 구현하는 데에도 많이 사용된다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.