SMC – State Machine Compiler<br />jeddli@gmail.com<br />아꿈사. 이동현<br />
FSM?<br />상태기계를 이용하면 프로그램이 간단하고 이해하기 쉽다.<br />C++ Code<br />수 많은 반복 코드와 노가다…<br />통제가 안될 정도로 커진다.<br />
좀 더 견고한 방법. – 상태 기계 언어<br />고전적인 의미의 상태 기계와 현실적인 의미의 상태 기계.<br />대부분의 게임 개발자는 느슨한 정의를 이용.<br />상태안의 상태.<br />다중 상태 변수.<br ...
코딩된 상태 기계<br />합법적인 코드 그러나…<br />void RunLogic( int* state )<br />{<br />    switch( *state )<br />    {<br />        case...
상태들이 int형태이며, 열거형이라면 더 견고하고 디버그 하기 쉬울 것이다.
Break 키워드 하나만 지워도 찾기 어려운 버그들을 만들게 된다.
중복적인 논리가 다중 상태에 나타난다.
어떤 상태에 처음 들어갔는지를 알려줄 수 있는 방법이 없다.
상태 기계가 시간에 따라 어떻게 움직여 왔는지를 모티너하거나 기록으로 남길(log) 방법이 없다.</li></li></ul><li>상태 기계 언어<br />C++ 매크로의 활용.<br />언어의 일부분이므로 따로 파서등...
상태 기계 언어 기본 예제<br />BeginStateMachine<br />    State( STATE_Wander )<br />OnEnter<br />// 상태시작점에대한C나C++ 코드<br />OnUpdate<b...
실제로 확장 해보면..<br />if( state < 0 ){<br />	if( 0 ) {<br />		return ( true );<br />}<br />}else if( STATE_Wander == state ) {...
좀 더 나아가서..<br />AI 디자이너의 생산성 높이기.<br />GUI 기반의 모델링.<br />C++ 코더로의 변환 용이성.<br />
CreatureMachine::CreatureMachine()<br />{<br />	// add all variables to the variable list<br />AddVariable("Health",VAR_IN...
SMC – The State Map Compiler<br />http://smc.sourceforge.net/SmcManual.htm<br />“Your detailed state diagrams are only pic...
SMC<br />
Adding a state machine to your class<br />Download SMC - http://sourceforge.net/projects/smc/files/smc/6_0_0/smc_6_0_0.zip...
Make SMC file<br />// This FSM works for the Task class only and only the Task <br />// class may instantiate it.<br />%cl...
Transition Guards<br />// State <br />Idle <br />{ <br />   // Trans <br />   Run <br />   // Guard condition <br />   [ct...
Transition Arguments<br />// State <br />Idle <br />{ <br />   // Transition <br />   Run(msg: const Message&) <br />   //...
Transition Arguments<br />CLOSED<br />{<br />PassiveOpen(port: unsigned short)<br />ServiceOpening<br />{<br />openServerS...
Default Transitions<br />What happens if a state receives a transition that is not defined in that state?<br />Default<br ...
Upcoming SlideShare
Loading in...5
×

Smc–state machinecompiler

826

Published on

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
826
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Smc–state machinecompiler

  1. 1. SMC – State Machine Compiler<br />jeddli@gmail.com<br />아꿈사. 이동현<br />
  2. 2. FSM?<br />상태기계를 이용하면 프로그램이 간단하고 이해하기 쉽다.<br />C++ Code<br />수 많은 반복 코드와 노가다…<br />통제가 안될 정도로 커진다.<br />
  3. 3. 좀 더 견고한 방법. – 상태 기계 언어<br />고전적인 의미의 상태 기계와 현실적인 의미의 상태 기계.<br />대부분의 게임 개발자는 느슨한 정의를 이용.<br />상태안의 상태.<br />다중 상태 변수.<br />상태 전이의 임의성.<br />상태 안에서 모든 게임 tick를 실행하는 코드.<br />기타 생각할 수 있는 모든 것.<br />
  4. 4. 코딩된 상태 기계<br />합법적인 코드 그러나…<br />void RunLogic( int* state )<br />{<br /> switch( *state )<br /> {<br /> case 0: //돌아다님<br /> Wander();<br /> if( SeeEnemy() )<br /> {<br /> if( GetRandomChance() < 0.8 ) *state = 1;<br /> else *state = 2;<br /> }<br /> if( Dead() ) *state = 3;<br /> break;<br /> case 1: //공격<br /> Attack();<br /> if( Dead() ) *state = 3;<br /> break;<br /> case 2: //도망<br />RunAway();<br /> if( Dead() ) *state = 3;<br /> break;<br /> case 3: //죽음<br />SlowlyRot();<br /> break;<br /> }<br />}<br /><ul><li>상태 변화가 잘 규제되지 않는다.
  5. 5. 상태들이 int형태이며, 열거형이라면 더 견고하고 디버그 하기 쉬울 것이다.
  6. 6. Break 키워드 하나만 지워도 찾기 어려운 버그들을 만들게 된다.
  7. 7. 중복적인 논리가 다중 상태에 나타난다.
  8. 8. 어떤 상태에 처음 들어갔는지를 알려줄 수 있는 방법이 없다.
  9. 9. 상태 기계가 시간에 따라 어떻게 움직여 왔는지를 모티너하거나 기록으로 남길(log) 방법이 없다.</li></li></ul><li>상태 기계 언어<br />C++ 매크로의 활용.<br />언어의 일부분이므로 따로 파서등의 도구가 필요없다.<br />핵심 키워드<br />BeginStateMachine<br />EndStateMachine<br />State<br />OnEnter<br />OnExit<br />OnUpdate<br />
  10. 10. 상태 기계 언어 기본 예제<br />BeginStateMachine<br /> State( STATE_Wander )<br />OnEnter<br />// 상태시작점에대한C나C++ 코드<br />OnUpdate<br />// 매틱(tick)마다실행되는C나C++ 코드<br />OnExit<br />// 상태의뒷정리를위한C나C++ 코드<br /> State( STATE_Attack )<br />OnEnter<br />// 상태시작점에대한C나C++ 코드<br />EndStateMachine<br />#define BeginStateMachine if(state < 0) { if (0) {<br />#define EndStateMachinereturn (true); }} else { assert(0);<br />return (false); } return (false);<br />#define State(a) return (true);}}else if(a == state){if(0){<br />#define OnEvent(a) return (true);}else if(a == event){<br />#define OnEnterOnEvent(EVENT_Enter)<br />#define OnUpdateOnEvent(EVENT_Update)<br />#define OnExitOnEvent(EVENT_Exit)<br />
  11. 11. 실제로 확장 해보면..<br />if( state < 0 ){<br /> if( 0 ) {<br /> return ( true );<br />}<br />}else if( STATE_Wander == state ) {<br /> if( 0 ){<br /> return ( true ); <br /> }else if( EVENT_Enter== state ) {<br />// 상태시작점에대한C++ 코드<br /> return ( true ); <br /> }else if(EVENT_Update== state ) {<br />// 매틱(tick)마다실행되는C++ 코드<br /> return ( true );<br /> }else if(EVENT_Wander== state ) {<br />// 상태의뒷정리를위한C++ 코드<br /> return ( true ); <br />}<br />}else if( STATE_Attack == state ) {<br /> if( 0 ){<br /> return ( true ); <br /> }else if( EVENT_Enter == state ) {<br />// 상태시작점에대한C++ 코드<br /> return ( true ); <br />}<br />}else<br />{<br /> assert(0);<br /> return( false );<br />}<br />return false;<br />BeginStateMachine<br /> State( STATE_Wander )<br />OnEnter<br />// 상태시작점에대한C나C++ 코드<br />OnUpdate<br />// 매틱(tick)마다실행되는C나C++ 코드<br />OnExit<br />// 상태의뒷정리를위한C나C++ 코드<br /> State( STATE_Attack )<br />OnEnter<br />// 상태시작점에대한C나C++ 코드<br />EndStateMachine<br />
  12. 12. 좀 더 나아가서..<br />AI 디자이너의 생산성 높이기.<br />GUI 기반의 모델링.<br />C++ 코더로의 변환 용이성.<br />
  13. 13. CreatureMachine::CreatureMachine()<br />{<br /> // add all variables to the variable list<br />AddVariable("Health",VAR_INTEGER,&m_Health);<br />AddVariable("EnemyLocation",VAR_POSITION,&m_Enemy;<br /> // now add conditions (may reference variables)<br />AddCondition("InRange",LESSTHAN,"EnemyLocation",100);<br />AddCondition("LowHealth",LESSTHAN,"Health", 50);<br /> // now add all the actions (may be referenced by the // states) <br />AddAction("IdleAction");<br />AddAction("FightAction");<br />AddAction("FleeAction");<br /> // now add all the states<br />AddState("Idle","IdleAction");<br />AddState("Fight","FightAction");<br />AddState("Flee","FleeAction");<br /> // now add all the transitions (may reference states <br /> // and variables)<br /> // transitions syntax : <condition-name> <start state><br /> // <end state><br />AddTransition("In Range","Idle","Fight");<br />AddTransition("Low Health","Fight","Flee");<br />};<br />다이어 그램의 코드화<br />
  14. 14.
  15. 15. SMC – The State Map Compiler<br />http://smc.sourceforge.net/SmcManual.htm<br />“Your detailed state diagrams are only pictures. <br />How are you going to translate your drawings into code? <br />A transition matrix is cryptic while switch statements means <br />your state machine logic is scattered all over your code. <br />The state pattern looks like a great solution but that means writing <br />and maintaining a class for each state - too much work.”<br />
  16. 16. SMC<br />
  17. 17. Adding a state machine to your class<br />Download SMC - http://sourceforge.net/projects/smc/files/smc/6_0_0/smc_6_0_0.zip/download<br />Include the SMC class definitions into your application.<br />Include the state machine's source file.<br />Instantiate the state machine's context object.<br />If you want to execute the start state's entry actions call the state machine context's enterStartState method. This is not needed to set the start state as that is done when the state machine context is instantiated. enterStartState only executes the start state's entry actions (if any exist). <br />
  18. 18. Make SMC file<br />// This FSM works for the Task class only and only the Task <br />// class may instantiate it.<br />%class Task <br />%package com.acme.supercron<br />%fsmclassTaskFSM<br />%access package <br />%start TaskFSM::Suspended <br />%map TaskFSM %% <br /><snip> <br />Running<br /> Exit<br /> { <br />stopSliceTimer(); <br /> }<br />{ <br /> Suspend Suspended { suspendTask(); } <br /> Block Blocked { blockTask(); } <br /> Done Stopped { releaseResources(); } <br />}<br /> <snip> <br />}<br /> %%<br />End State<br />Transition<br />Action<br />{ <br /> Suspend Suspended { suspendTask(); } <br /> Block Blocked { blockTask(); } <br /> Done Stopped { releaseResources(); } <br />}<br />
  19. 19. Transition Guards<br />// State <br />Idle <br />{ <br /> // Trans <br /> Run <br /> // Guard condition <br /> [ctxt.isProcessorAvailable() == true && <br />ctxt.getConnection().isOpen() == true] <br /> // Next State <br /> Running <br /> // Actions <br /> { <br />StopTimer("Idle"); <br />DoWork(); <br /> } <br /> Run nil {RejectRequest();} <br />} <br />
  20. 20. Transition Arguments<br />// State <br />Idle <br />{ <br /> // Transition <br /> Run(msg: const Message&) <br /> // Guard condition <br /> [ctxt.isProcessorAvailable() == true && <br />msg.isValid() == true] <br /> // Next State <br /> Running <br /> // Actions <br /> { <br />StopTimer("Idle"); <br />DoWork(msg); <br /> } <br /> Run(msg: const Message&) <br /> // Next State Actions <br /> nil {RejectRequest(msg);} }<br />
  21. 21. Transition Arguments<br />CLOSED<br />{<br />PassiveOpen(port: unsigned short)<br />ServiceOpening<br />{<br />openServerSocket(port);<br />}<br />void MainMap_CLOSED::PassiveOpen(TcpConnectionContext& context, unsigned short port)<br />{<br />TcpConnection& ctxt(context.getOwner());<br />
  22. 22. Default Transitions<br />What happens if a state receives a transition that is not defined in that state?<br />Default<br />{<br /> // Valid run request but transition occurred in an invalid<br /> // state. Send a reject reply to valid messages.<br /> Run(msg: const Message&)<br /> [ctxt.isProcessorAvailable() == true &&<br />msg.isValid() == true]<br /> nil<br /> {<br />RejectRequest(msg);<br /> }<br /> // Ignore invalid messages are ignored when received in<br /> // an invalid state.<br /> Run(msg: const Message&)<br /> nil<br /> {}<br /> Shutdown<br />ShuttingDown<br /> {<br />StartShutdown();<br /> }<br />}<br />Connecting<br />{<br /> // We are now connected to the far-end. Now we can logon.<br /> Connected<br /> Connected<br /> {<br /> logon();<br /> }<br /> // Any other transition at this point is an error.<br /> // Stop the connecting process and retry later.<br /> Default<br />RetryConnection<br /> {<br />stopConnecting();<br /> }<br />}<br />
  23. 23. Transition Precedence <br />Guarded transition <br />Unguarded transition <br />The Default state's guarded definition. <br />The Default state's unguarded definition. <br />The current state's guarded Default transition. <br />The current state's unguarded Default transition. <br />The Default state's guarded Default transition. <br />The Default state's unguarded Default transition. <br />
  24. 24. Compiling a .sm<br />Prepare<br />Java 1.6.0 or newer is properly installed and the "javac", "java" and "jar" executables are in your PATH environment variable. The standard Java Development Kit can be obtained for free from http://java.sun.com . <br />The SMC_HOME environment variable contains the path to where SMC is installed. <br />$ java -jar $SMC_HOME/bin/Smc.jar [-c | -c++ | -csharp | -graph | -groovy | -java | -lua | -objc | -perl | -php | -python | -ruby | -scala | -table | -tcl | -vb] <fsm_source_file>.sm<br />
  25. 25. Behind the Curtain<br />GOF’s State Pattern<br />SMC Pattern<br />
  26. 26. Ex4<br />State<br />FSMContext<br />StoplightState<br />StoplightContext<br />enterStartState<br />StopMap_Default<br />Stoplight<br />StopMap_EastWestGreen<br />StopMap_EastWestYellow<br />StopMap_NorthSouthGreen<br />StopMap_NorthSouthYellow<br />StopMap<br />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×