포터블기기 강좌


iOS용 게임개발) 2. FSM

2013.01.15 01:42

가영성채아빠 조회:5783

어떻게 어떻게 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에 컨텐츠를 채우는 것이 목적이니까

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

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

번호 제목 작성자 작성일 조회
141 구형 안드로이드폰들에서 2-step verification 사용하여 구글계정관리하기 [4] scotch 09.23 32829
140 뷰2와 Smart App Protector 연동 문제점 맑은하늘 09.12 31617
139 [펌] 지메일 첨부 파일 삭제 및 용량 줄이는 방법 [4] 맑은하늘 08.23 36696
138 ZTE 번들 백업 어플 [4] file tomeast 08.23 31969
137 otp 인증 유지를, 다시 사용하고 싶을때 - 네이버 고객센터 안내 받음 맑은하늘 07.31 31497
136 MT65xx Preloader 드라이버 설치 Lock3rz 07.24 32707
135 또 다른 MTK6589 루팅방법 [2] Lock3rz 07.22 31821
134 안드로이드 어플에서 외부 USB 메모리, SD카드 쓰기 안될때 해결책 피델리티 07.18 33595
133 MTK 6577, 6589 루팅 방법 [14] file tomeast 05.31 32066
132 부모들이 알아야 하는 아이들의 스마트폰 셋팅하는 법... (19금일까나??) [18] 星夜舞人 05.22 30519
131 외국 3G 스마트폰 샀을때 갑자기 No Service가 떠서 전화가 안될때 해결하는 방법.. [5] 星夜舞人 03.17 27576
130 iOS용 게임개발) 3.어떻게 그리고 무엇을 만들 것인가? [5] file 가영성채아빠 02.12 7440
129 외국에서 들어온 3G 스마트폰 설정하는 방법.. [6] 星夜舞人 02.01 9012
128 외국 3G 전화기 한국에서 개통하는 방법.. [9] 星夜舞人 01.21 8228
127 모바일 기기에서의 소비전력 관리의 중요성. [6] RuBisCO 01.18 5992
» iOS용 게임개발) 2. FSM [2] file 가영성채아빠 01.15 5783
125 [PD10,PD20] ClockWorkMod(리커버리 모드) 6.0.1.5 생성법 [5] file 하늘마루 01.12 5721
124 iOS용 게임개발) 1. Xcode환경에 Cocos2d for iphone을 설치 [2] file 가영성채아빠 01.02 4355
123 카카오톡 연락처 연동 방지하는 방법 \(^0^)/ [11] file matsal 12.25 10166
122 PIPO U1 업그레이드 성공기 + 부팅 안됨 해결 + WIFI 수신개선 [2] file 예피노리 12.17 4111

오늘:
3,884
어제:
851
전체:
15,154,109