前腐后继 发表于 2007-3-7 00:54:00

分享:大家有没有状态机的简单+实用的封装?

(转帖)最近写的游戏老是有switch +&nbsp;call&nbsp;function.<br/>于是使用表格把它们包起来,但是写得多了,还是做了个简单的封装: <p></p><p><br/>class&nbsp;CTestState<br/>{<br/>public:<br/>friend&nbsp;class&nbsp;CStateMachine&lt;CTestState&gt;;<br/>enum&nbsp;MYSTATE<br/>{<br/>EM_S1&nbsp;=&nbsp;0,<br/>EM_S2&nbsp;=&nbsp;1<br/>};</p><p>CTestState&nbsp;()&nbsp;{&nbsp;m_state.SetCaller(this);&nbsp;}//:&nbsp;m_state(this)&nbsp;{}<br/>CStateMachine&lt;CTestState&gt;&nbsp;m_state;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//状态机对象<br/><br/>void&nbsp;Run();<br/>void&nbsp;OnEvent();<br/>private:<br/>void&nbsp;MainState&nbsp;(&nbsp;const&nbsp;EM_MACHINE_STATE&nbsp;&amp;state&nbsp;)&nbsp;{}<br/>void&nbsp;MainState2(&nbsp;const&nbsp;EM_MACHINE_STATE&nbsp;&amp;state&nbsp;);<br/>};</p><p>CStateMachine&lt;CTestState&gt;::MYDATA&nbsp;CStateMachine&lt;CTestState&gt;::s_info[]&nbsp;=&nbsp;{<br/>{CTestState::EM_S1,&nbsp;&amp;CTestState::MainState,&nbsp;false},<br/>{CTestState::EM_S2,&nbsp;&amp;CTestState::MainState2,true}<br/>};</p><p>void&nbsp;CTestState::MainState2&nbsp;(const&nbsp;EM_MACHINE_STATE&nbsp;&amp;state&nbsp;)<br/>{<br/>switch&nbsp;(state)<br/>{<br/>case&nbsp;EM_MS_INIT:<br/>cout&nbsp;&lt;&lt;&nbsp;"MainState&nbsp;Init!"&nbsp;&lt;&lt;&nbsp;endl;<br/>break;<br/>case&nbsp;EM_MS_RUN:<br/>cout&nbsp;&lt;&lt;&nbsp;"MainState&nbsp;Running!"&nbsp;&lt;&lt;&nbsp;endl;<br/>break;<br/>case&nbsp;EM_MS_DESTORY:<br/>cout&nbsp;&lt;&lt;&nbsp;"MainState&nbsp;Destory!"&nbsp;&lt;&lt;&nbsp;endl;<br/>break;<br/>}<br/>}</p><p>int&nbsp;main(int&nbsp;argc,&nbsp;char*&nbsp;argv[])&nbsp;<br/>{&nbsp;<br/>CTestState&nbsp;test;<br/>test.m_state.SafeSwitch(&nbsp;CTestState::EM_S1&nbsp;);<br/>test.m_state.SafeSwitch(&nbsp;CTestState::EM_S2&nbsp;);<br/>test.m_state.SafeSwitch(&nbsp;CTestState::EM_S1&nbsp;);<br/>test.m_state.Call();<br/>return&nbsp;0;<br/>}</p>
页: [1]
查看完整版本: 分享:大家有没有状态机的简单+实用的封装?