포터블기기 강좌


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

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

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

번호 제목 작성자 작성일 조회
161 95LX에서 라즈베리 파이 접속하기. [6] file piloteer 02.04 4488
160 리눅스: 텍스트 브로우징을 이용하자 [3] file 영진 01.31 4324
159 리눅스: bash스크립팅 [3] file 영진 01.29 3726
158 미친척하고 비영리 Kickstarter 프로젝트 진행하기 (2편) [2] 星夜舞人 12.28 4173
157 미친척하고 비영리 Kickstarter 프로젝트 진행하기 (1편) 星夜舞人 12.28 3351
156 중국 저가 AP 7세대의 운명과 8세대의 향방 [7] 星夜舞人 12.10 2130
155 중국에서 구입한 갤럭시S6 갤럭시노트5 같은폰은 폰카의 셔트음이 무음으로 되나요, [9] 그린 11.25 2328
154 MEEP 태블릿 > 일반 태블릿으로 변경하기 [1] 제이티 10.18 5214
153 루팅 없이 통신사 좀비어플 비활성화 시키는 앱 [7] 페퍼민트 08.30 6414
152 CPU 세팅 어플 [1] 페퍼민트 08.26 4846
151 palm m500 롬 업그레이드 하기 [14] file jubilee 08.12 8638
150 중국산 8인치 윈도우 태블릿 터치감 기준 구매 가이드 [9] 풀맨 05.13 27760
149 중국산 태블릿 터치패널 교체 하기 [7] file 풀맨 01.23 30609
148 초보자들을 위한 타오바오에서 중국 폰 구매시 주의 사항 [8] 풀맨 10.13 28875
147 성야무인식 타블렛 배터리 효율 측정공식 [13] file 星夜舞人 09.24 28849
146 onda 975i 1.0.6 으로 업데이트 방법 [1] n4 08.14 27562
145 중국산 스마트폰 구입시 한국 사용 가능 여부 체크 포인트 [7] file tomeast 05.21 32377
144 아이튠즈에서 iOS 앱이 내 구매기록에서 사라졌을 때 [3] file 파리 02.04 32522
143 SmartQ Z-Watch의 배터리를 오래 사용할수 있는 팁입니다. [14] 저스틴 11.18 34939
142 iPhone 이 진짜 벽돌이 되었다고 느낄때. [16] 김강욱 09.24 33434

오늘:
464
어제:
805
전체:
15,187,755