포터블기기 강좌


iOS용 게임개발) 2. FSM

2013.01.15 01:42

가영성채아빠 조회:5784

어떻게 어떻게 2번째 글을 쓰게 되었습니다.

이번에 다뤄볼 주제는 FSM(Finite State Machine)입니다.

오토마타라고도 하죠. 우리는 '유한 상태 기계' 라고 번역하고 매우 어려운 느낌이 들지만 너무나 간단한 것입니다.

 

FSM은 무엇인가의 유한한 상태와 그 변화를 정의하고 처리하는 방식으로 컴퓨터가 탄생하기 전부터

일상이나 수학에서 써오던 방식입니다.

꼭 게임이 아니더라도 본인도 모르게 다들 쓰고 있는 것이죠.

 

복잡하게 설명하면 머리아프니 간단한 예를 들어보면서 설명하겠습니다.

우리가 테트리스 게임을 하게 되면 상태는 어떤게 있을까요?

 

A. 로고표시

B. 타이틀표시 및 시작대기

C. 게임진행

D. 랭킹등록

 

간단하게 나열하면 이정도가 되겠습니다.

이제 C의 게임 진행상태를 자세히 보면 다음처럼 될 수 있겠습니다.

 

C-1. 스테이지 타이틀 표시(예. STAGE 1)

C-2. 게임

C-3. 클리어

C-4. 게임오버

 

큰범주의 A,B,C,D의 상태와 작은 점수의 C-1, C-2, C-3, C-4의 상태가 존재합니다.

이 사이의 관계를 도식화 해보면 다음과 같습니다.

 

우선 큰 상태들의 관계를 도식화 해본 것입니다.

flow1.jpg

 

A. 로고표시

B. 타이틀표시 및 시작대기

C. 게임진행

D. 랭킹등록

 

이런 상태들이 있는 것이고요.

관계를 생각해보면

 

A => B : 로고를 보여주고 일정시간 대기 후 전이

B => C : 타이틀 상태에서 스크린을 터치하면 전이

B => D : 타이틀 상태에서 조작없이 일정시간이 지나면 전이

C => D : 게임진행이 종료되면 전이

D => B : 랭킹입력이나 랭킹보여주는 것이 끝나면 전이

 

이렇게 됩니다.

이런 도식화된 유한한 갯수의 상태들의 관계를 유기적으로 전이시켜주면서 관리하는 것이 바로 FSM입니다.

switch 문으로 만들어도 되고 if문들이나 포인터배열등으로 만들어도 됩니다.

편하게 작업하면 되는 것이고 이런게 있다는 것을 기억하시면 됩니다.

 

덤으로 게임 진행쪽에 대한 상태 전이를 추가로 보겠습니다.

flow2.jpg

C-1. 스테이지 타이틀 표시(예. STAGE 1)

C-2. 게임

C-3. 클리어

C-4. 게임오버

 

이런 상태들이 있는 것이고요.

관계를 생각해보면요.

 

C-1 => C-2 : 현재 몇 스테이지인지 일정시간 표시 후 전이

C-2 => C-3 : 주어진 조건을 클리어하면(일정 점수 획득이라던가) 전이

C-2 => C-4 : 게임오버 상태가 되면 전이(테트리스 예니까 블록이 화면 상단끝까지 다 찼다던가)

C-3 => C-1 : 클리어 영상 출력 후 전이

 

이정도가 되겠죠.

역시 이런 것을 관리하는 것이 FSM입니다.

구현은 맘대로겠죠. ^^;

 

보통 FSM을 구현할 때는

 

State에 들어갈 때 / State에서 나갈 때 를 구현합니다.

어떻게 구현할 지는 맘대로겠지만, 많이 쓰이는 방법중에는 MFC처럼 들어갈 때는 onEnter / 나갈 때는 onLeave 같은 식으로 공통된

인터페이스를 만들어서 모든 상태를 객체로 만들고 이 인터페이스를 상속받아서 구현하는 방법들이 있습니다.

 

interface State

{

public onEnter(lastState);

public onLeave();

};

 

object LogoState implemented State

{

어쩌고 저쩌고 지화자 좋다

};

 

와 같은 이런 구조겠죠.

 

이런 FSM은 그러면 이런 진행구조들에만 사용될까요?

게임 내의 객체들의 AI(인공지능)나 패턴을 구현하는 데에도 사용됩니다.

예를 들면 몬스터 오거라는게 있고 이 오거의 패턴을 다음과 같이 생각했다고 합시다.

 

오거는 임의의 방향으로 2걸을 옮기고 두리번 걸며 적을 찾는다.

적이 오거의 시야(오거 중심 반경 100픽셀)에 걸리면 해당 적을 쫓는다.

적을 쫓다가 적과의 거리가 직선거리 300픽셀이 넘어가면 적을 포기하고 다시 임의의 방향으로 움직이기 시작한다.

반대로 적을 쫓다가 적이 반경 20픽셀 안에 들어오면 공격한다.

 

이를 잘 살펴보면 몇가지 상태로 이뤄져 있음을 알 수 있습니다.

그러면 당연히 FSM으로 만들 수 있게 되겠죠

 

그럼 이것(FSM)과 cocos2d for iphone의 관계는 무엇일까요?

별 것 없습니다. 게임을 작성하려면 어떻게 구현하던 FSM이 꼭 필요합니다.

장면전환부터 객체의 인공지능, 패턴까지 FSM이 필수로 사용되지요.

cocos2d는 자체적으로 Scene이라는 장면에 관련되어서 State를 구체화시키고 분류시킬 수 있는 것을 가지고 있습니다.

어떤 스프라이트Sprite가 움직이는 패턴을 정의하는 일종의 FSM도 가지고 있습니다.

하지만 우리가 구현하는 FSM이 필요한 경우가 더 많겠죠.

 

일단 2번째 이야기로 FSM을 다뤄봤습니다.

시간이 된다면 3번째 이야기는 씬이나 레이어, 스프라이트에 대한 얘기로 넘어가야겠습니다.

그러면서 자연스럽게 간단한 FSM을 구현해 보겠습니다. 시간이 된다면 말이죠. ^^;

 

 

========================================================================

그리고 빼먹은 것이지만 중요한 것.

강좌는 펌을 허락하지 않습니다. 어디까지나 목적은 KPUG에 컨텐츠를 채우는 것이 목적이니까

블로그나 타 사이트로의 펌은 허락하지 않습니다.

링크는 허용합니다. :-)

번호 제목 작성자 작성일 조회
101 스마트폰, 아이폰 주소록 백업하기 [4] 맑은하늘 05.07 7536
100 기기명 변경으로 어플 호환성 높이기.. [17] file 애쉬 05.09 17599
99 [입문자용] ADB 드라이버 강제 설치하기 [8] Lock3rz 05.12 19774
98 혹시 특정앱에서 외장SD카드에 쓰기가 안되신다면.... [1] 애쉬 05.17 4798
97 자작 나만의 터치 펜 ...(수정판 버전 3) [8] file 유태신 05.30 6467
96 [팁] 노트북 성능 비교 방법 [4] Freedom^^ 07.20 6665
95 영상통화어플 CIRCLE [4] file 섬나라 07.24 6394
94 Teclast P85 커스텀롬&정식 펌웨어 사이트 모음... [1] 만남 07.31 6299
93 PD10 시스템 업그레이드 방법 [1] file 하늘마루 08.01 3367
92 화면 OFF시 WiFi가 끊어지는 문제 해결방법 [5] Lock3rz 08.12 4894
91 MMS 에 대한 이해 (OMA-MMS와 SKT-MMS 그리고 KT와 SK) [12] 피델리티 09.16 18442
90 Android 4.1.1 JellyBean 루팅하기 [20] file Lock3rz 09.30 9633
89 아이폰 케이블 수리 [2] file jubilee 10.08 14770
88 AMD Brazos 계열 탑재 기기의 전압 다이어트 트윅 [1] RuBisCO 10.20 3498
87 장문의 텍스트를 PC에서 안드로이드폰으로 보내자! Pass2phone!! [9] 애쉬 10.23 5184
86 p85HD 충전기 접촉 불량 해결 방구왕 11.29 5731
85 [스압][엉성] Nook hd,hd+ 루팅및 apk설치법.. [2] 짐레이너 11.30 11078
84 [아이패드] 여럿이서 같이 할 수 있느 무료게임 globetrotters [1] 미케니컬 12.02 4742
83 원격 작업에서 원격지의 USB를 마음대로 뺐다가 끼워보자. [4] 피델리티 12.08 4572
82 파일을 암호화하는 강력한 프리웨어 AxCrypt [2] 피델리티 12.09 5293

오늘:
237
어제:
629
전체:
15,221,651