포터블기기 강좌


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

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

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

번호 제목 작성자 작성일 조회
81 문리더 비슷한 iOS 용 텍스트 리더 [3] matsal 07.18 6489
80 리눅스: 대기오염지수 보기 [3] file 영진 06.08 6534
79 옵큐에 버금가는 마하사전 [11] 프리페 11.19 6559
78 리눅스: bash스크립팅 - 화일이름 일괄 바꾸기 [2] file 영진 05.22 6615
77 안드로이드 태블릿 기본적인 이해 및 테스트 방법론 (제1강) file 星夜舞人 05.20 6627
76 [팁] 노트북 성능 비교 방법 [4] Freedom^^ 07.20 6665
75 리눅스: 간편하게 날씨예보보기 [2] file 영진 06.06 6698
74 리눅스: 뉴스를 터미널에서 보자 [2] file 영진 06.10 6765
73 리눅스: 언어벤치마크 [4] file 영진 05.05 6803
72 리눅스: 온라인 사전을 사용하자 [1] file 영진 06.11 6861
71 리눅스: GUI 바꾸기 [민트리눅스] [2] 영진 05.29 6879
70 리눅스: bash스크립팅: 간단한 통계내기 file 영진 03.31 6936
69 공유기의 Twin IP 기능의 활용예 [4] 파리 11.10 7043
68 T전화 : 기본앱 대신 플레이스토어 앱으로 쓰기 그리고 두개가 뭐가 다른가. [2] 피델리티 06.02 7104
67 리눅스: 데스크탑 노티피케이션 이용하기 [2] file 영진 06.24 7108
66 리눅스: vim을 이북리더로 쓰기 [2] file 영진 06.15 7133
65 리눅스: vim: 설정하기 [1] file 영진 03.12 7221
64 리눅스: xfce4터미널 폰트조정하기 [4] file 영진 06.18 7251
63 iOS용 게임개발) 3.어떻게 그리고 무엇을 만들 것인가? [5] file 가영성채아빠 02.12 7441
62 팜 센트로 & 트레오 650 하드리셋 방법 [3] jinnie 01.28 7477

오늘:
304
어제:
552
전체:
15,211,506