디자인 패턴 자습용 저장소. 프로그램 설계 및 관리를 위해서 공부합니다!
게임 프로그래밍 패턴(로버트 나이스트롬) 책을 공부한 기록을 남깁니다.
플레이어 객체가 InputHandler에서 오는 값을 받아 움직이거나 총을 발사하는 등 특정 명령을 수행합니다.
위의 명령들은 플레이어에 종속된 함수이며 재사용 가능하지 않습니다.
각각의 함수들을 객체로 감싸서 의존성을 줄이고 재사용 가능한 형태로 만드는 게 명령 패턴인 것 같습니다.
위와 같이 명령 함수를 Command라는 객체로 감쌈으로써 다양한 혜택을 얻을 수 있습니다.
이전의 Command는 Player를 찾아서 움직여야 하는 가정이 있어서 제한적입니다.
Command가 사용자(주체, Actor)를 매개변수로 받게 되면 모든 사용자에 동일한 행동을 하게 할 수 있습니다.
Command는 Player만이 아니라 GameActor를 간접 참조함으로 느슨한 관계가 유지됩니다.
InputHandler는 사용자를 모르기 때문에 실행해야 하는 명령 객체를 반환합니다.
이러면 Player와 InputHandler가 디커플링이 됩니다.
명령이 실체화되었기 때문에 각 명령을 관리할 수 있습니다.
전략 게임이나 여러 툴을 구현할때의 Undo, Redo를 구현하기 쉬워집니다.
저는 C++ STL list의 iterator를 이용해서 구현해보았습니다.
게임 내에서 캐릭터는 많은 상태를 갖는다.
(걷기, 달리기, 멈추기, 돌기, 점프하기, 구르기, 엎드리기 ... )
이에 따른 많은 조건을 갖는다.
(걷기 불가능한 조건 : 점프, 구르기, 엎드리기 ... )
이런 조건을 if문과 bool 플래그 값으로 나타낸다면 매우 복잡한 코드가 될 것이다.
따라서 우리는 상태 패턴이 필요하다.
상태 패턴의 필요할 때
- 캐릭터 상태에 따른 분기가 많이생긴다.
- 각 행동이 불가능한 상태인지 알기 위해서 많은 플래그값이 필요하다.
유한 상태 기계 (FSM)
상태 인터페이스에 입장과 퇴장 부분을 구현하여 완전히 캡슐화 할 수 있다.
캐릭터가 들고 있는 무기에 따라서 동작이 달라진다면 병행 상태 기계를 사용해보자.
상태 기계를 2개 둠으로써 문제가 해결된다.
두 상태가 서로에게 영향을 끼치지 않을 경우 유용하다.
상태의 공통분모를 중복해서 사용하려면 상위 상태와 하위 상태로 나누어 상태를 상속받는 계층형 상태 기계가 유용하다.
상태가 바뀌기 전의 상태를 기억하는 방법으로, 상태를 스택에 넣어 관리하는 푸시다운 오토마타 방식이 있다.
요즘 게임 AI에서는 FSM만으로는 한계가 있다.
행동 트리(Behavior Tree)나 계획 시스템(Planning System)을 더 많이 사용하는 추세다.
FSM은 다음과 같을때 유용하다.
FSM은 AI 외에도 입력처리, 메뉴화면 전환, 문자 해석, 네트워크 프로토콜, 비동기 동작 구현하는 데에도 많이 사용된다.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.