728x90
반응형

Game Development, 게임개발/디자인패턴 21

Update Method, 업데이트 메서드 ** [디자인패턴]

업데이트 메서드의 목적은 컬렉션에 들어있는 객체별로 한 프레임 단위의 작업을 진행하려고 알려줘서 전체를 시뮬레이션한다. 예를 들어 설명해보자 보석을 훔치는 퀘스트를 진행하고 있다. 보석은 오래 전에 죽은 마술사왕의 유골에 놓여 있다. 플레이어는 살금살금 마술사왕의 장엄한 무덤 입구로 다가갔고, 공격을 받..지 않았다. 저주받은 석상은 번개를 쏘지 않았고, 언데드 전사는 입구를 지키고 있지 않았다. 그냥 무덤으로 들어가 보석을 가져왔다. 게임은 끝났고, 우리는 승리했다. ???? 이게 게임인가 ????? 무덤은 무찔러야 하는 경비병이 지키고 있어야 한다. 해골 병사부터 되살려서 문 주위를 순찰하게 만들자. 게임 프로그래밍을 전혀 모른다고 가정했을 때 해골 병사가 비틀거리면서 왔다 갔다 하는 코드를 가장 간..

Game Loop Pattern, 게임 루프 패턴 ** [디자인패턴]

요약하자면 게임 시간 진행을 유저 입력, 프로세서 속도와 디커플링하는 것이다. 더 쉽게 말하자면 입력이 없어도 프로세서가 잘 돌아간다는 말이다. **저자는 이 패턴이 가장 중요하고 많이 쓰인다고 말했다. 이 패턴은 특수한데 이름만 봐도 게임 분야에서만 쓸 것 같고 실제로 게임 분야 외에서는 찾아보기 힘들다. 게임 루프가 얼마나 유용한지 알아보면서 배워보자 예전의 프로그래머들은 코드를 모두 짜고 나서야 프로그램을 돌릴 수 있었다. 중간에 확인하는 것은 거의 불가능에 가까웠다. 이런 것을 배치모드, batch mode 프로그램이라고 하는데 모든 작업이 끝나고 나면 프로그램이 멈췄다. 요즘도 배치 모드 프로그램이 있지만 예전과 같이 카드에 구멍을 뚫어서 기계에 넣는 과정은 하지 않아도 되었다. 즉, 여기서 나..

Double Buffer Pattern, 이중 버퍼 패턴 [디자인패턴]

이중 버퍼의 목적은 여러 순차 작업의 결과를 한 번에 보여준다는 데에 있다. 그렇다면 어떻게 이렇게 할 수 있는지 알아보자 본질적으로 컴퓨터는 한 번에 하나를 수행한다. CPU에서 Instruction에 대해 클럭을 소모하면서 순차적으로 하나씩 처리해나간다. 우리한테는 무척 빠른속도로 동작하기 때문에 동시에 하는 것처럼 보인다. 빠른 속도를 위해서는 큰 일을 잘 쪼개는 등 pipeline을 구현하면 더 빨라진다. 아무튼 컴퓨터는 빠른 속도로 작동하더라도 한 번에 하나씩 처리하는 것이 본질이다. 하지만 게임 유저의 입장으로 한 번에 여러 작업의 결과물을 봐야할 때가 있다. 대표적으로 렌더링, rendering을 생각해보자 유저에게 보여줄 게임 화면을 그릴 때는 멀리 있는 산, 구불구불한 언덕, 나무 전부를..

State Pattern, 상태 패턴 [디자인패턴]

사실 이 상태 패턴이란 것은 우리도 이미 알 수도 있고 모르더라도 이미 쓰고 있을 수 있다. [Unity, 유니티/Programming, 응용] - FSM,유한 상태 기계, Finite State Machines [Unity] 위 글과 밀접한 관련이 있다. 알아보자 간단한 횡스크롤 플랫포머를 만든다고 해보자. 플랫포머는 슈퍼 마리오와 비슷한 게임이라고 생각하면 된다. 게임 월드의 주인공이 사용자 입력에 따라 반응하도록 구현한다. //B를 누르면 점프하게끔 구현하는 코드 void Heroine::handleInput(Input input){ if(input == PRESS_B) { yVelocity_ = JUMP_VELOCITY; setGraphics(IMAGE_JUMP); } } 위에서 버그가 발생할 수..

Singletone Pattern, 싱글톤 패턴 [디자인패턴]

아마도 디자인 패턴은 몰라도 그냥 싱글톤이라는 말은 어디서든 한 번쯤 들어봤을만한 단어가 아닌가 나도 디자인 패턴을 배우기 전에도 이미 뭐 싱글 뭐시기는 들어봤었다. 그럼 진짜로 알아보자. 싱글톤은 오직 한 개의 클래스 인스턴스만을 갖도록 보장해야하고 이에 대한 전역적인 접근을 통해 조작한다. 이 패턴은 편리해서 문제다. 즉, 남발해서 문제가 된다. 그래서 싱글톤을 피하거나 쓸 거면 제대로 써야하기에 배우는 것이다. 남발하게 된다면 열나는 애한테 이마에 붕대를 감아주는 꼴이나 다름이 없다. 싱글톤의 특징인 오직 한 개의 클래스 인스턴스만 가지게 보장한다라는 점이 있다. 인스턴스가 여러 개면 제대로 작동하지 않는 상황이 종종 생기는데 외부 시스템과 상호작용하면서 전역 상태를 관리하는 클래스가 그런 일이 많..

Prototype Pattern, 프로토타입 패턴 [디자인패턴]

프로토타입이란 가장 초기 버전을 말하는 듯한 느낌을 준다. 실제로도 프로토 타입이라는 말은 개발 중에 필요한 기능만 넣어서 대충 구동해보는 것을 말한다. 그렇다면 디자인 패턴에서의 프로토타입은 무엇을 말하는 것인지 알아보자 플레이어와 몬스터가 싸우는 게임이 있다고 하자. 몬스터는 플레이어를 공격하기 위해 떼를 지어다니고 그 몬스터들은 Spawner를 통해 게임 스테이지에 등장하고 몬스터의 종류마다 Spawner가 존재한다. 예제 코드로 각종 몬스터 클래스를 만들어보자 class Monster{ //... }; class Ghost : public Monster{}; class Demon : public Monster{}; class Sorcerer : public Monster{}; 한 종류 당 하나의 ..

Observer Pattern, 관찰자, 감시자 패턴 [디자인패턴]

이번에는 관찰자 패턴이다. GoF의 디자인 패턴이 말한다. 객체 사이에 일 대 다의 의존관계를 정의해두어 어떤 객체의 상태가 변할 때 그 객체에 의존성을 가진 다른 객체들이 그 변화를 통지 받고 자동으로 업데이트될 수 있게 만든다. 쉽게 말하면 전국에서 복권 당첨 방송을 보고 당첨된 사람만 소리지르듯이.. 어떠한 이벤트 발생에 대해 다수의 객체가 반응할 수 있게 하는 것이다. 알아보자 모델-뷰-컨트롤러, MVC 구조를 쓰는 프로그램이 엄청나게 많다. 특히 안드로이드 스튜디오를 활용하여 무엇인가 만들어봤다면 맨날 봤다. 하지만 그 기반에는 관찰자 패턴이 존재한다. ** 자바에서는 java.util.Observer, C#에서는 event 키워드로 지원을 해준다. 관찰자 패턴은 GoF 중에서도 가장 널리 사용..

Flyweight Pattern, 경량 패턴 [디자인패턴]

우리는 게임을 만들 때 반복작업을 하는 경우가 많다. 웬만해서는 거의 반복작업 위주다. 그렇다면 반복작업하는 시간을 줄이거나 반복 작업을 효율적으로 할 수 있다면 전체 프로젝트의 효율도 꽤나 올라갈 것이라고 생각된다. 반복된 데이터에 대해서 하드웨어의 부담을 줄여주는 패턴이 있다. 경량 패턴이다. 알아보자 우선 게임의 배경을 생각해보자 나는 항상 중세 판타지 게임이 먼저 생각난다. 기사, 괴물, 마녀, 용 등이 있다. 내가 좋아하는 게임 중 하나인 위쳐 또한 그렇다. 저기 배경이 보이는가 무엇보다 수많은 나무가 배경을 채우고 있다. 멀리서 보기엔 다 비슷비슷해보인다. 프레임마다 저 모든 나무를 구현하는 것이야 어렵진 않겠지만.. 너무 비효율적이라고 생각이 든다. 과연 모두 일일이 렌더링을 해야하는가? 물..

Command Pattern, 명령 패턴 [디자인패턴]

요약 요청 자체를 캡슐화 하는 것으로 서로 다른 클라이언트를 매개변수로 만들고 요청을 대기시키거나 로깅하고 되돌릴 수 있는 연산을 지원하도록 함. ???? 요약인데 알 수 없는 말이다. 요약을 한답시고 했는데 솔직히 디자인패턴을 처음 본 사람의 입장으로 전혀 와닿지 않는 설명이다. 로버트가 표현하길 명령 패턴은 "메서드 호출을 실체화하는 것"이라고 했다. 실체화라는 말은 어떠한 것을 변수에 저장하거나 함수에 전달할 수 있도록 데이터로 만든다. 즉, 메서드를 객체로 바꿀 수 있다는 것을 뜻한다. 그렇다면 메서드 호출을 객체로 만들었다는 이야기다. 예를 들며 살펴보자 게임의 입력을 생각해보자. 우리는 오락실에서 (나는 오락실 세대다) 메탈슬러그에는 기본적으로 A,B,C가 있다. 차례대로 공격, 점프, 수류탄..

디자인 패턴을 만들어내는 이유

디자인 패턴을 만들어낸 이유에는 소프트웨어공학의 정신이 깃들어있다. [컴퓨터(Computer Science)/소프트웨어공학(Software engineering)] - 소프트웨어공학(1) 필요성과 특징 알아보자 소프트웨어 구조가 잡혀있어야 좋은 프로그램이 나온다고 한다. 그러한 소프트웨어 구조를 짜는 법은 도대체 어디서 배우는 것일까? 소프트웨어 공학에서 보았듯이 구조는 변경할 수 있느냐가 제일 중요한 핵심이다. 코드를 고치기 위해서는 기존 코드를 이해해야 한다. 어떠한 프로젝트에 중간에 투입되었을 때, 신입 사원이 되었을 때, 가장 오래 걸리는 부분이라고 한다. 머리로 코드에 대한 전체적인 그림을 그릴 수 있다면 해결책을 쉽게 찾을 수 있다. 그렇다면 어떻게 코드를 구성해야 누구든지 시간이 조금만 걸리..

728x90
반응형