ActorManager.cpp
上传用户:lian_0917
上传日期:2013-03-24
资源大小:1151k
文件大小:6k
源码类别:

其他游戏

开发平台:

MultiPlatform

  1. /********************************************************************
  2. created: 2004/07/09
  3. created: 9:7:2004   23:57
  4. filename:  d:WorksGameLib_sdkActorManager.cpp
  5. file path: d:WorksGameLib_sdk
  6. file base: ActorManager
  7. file ext: cpp
  8. author: lazybug
  9. purpose: 人物对象管理类的实现部分
  10. *********************************************************************/
  11. #include "StdAfx.h"
  12. #include ".ActorManager.h"
  13. #include <utility>
  14. #include <algorithm>
  15. #include "GameLogic.h"
  16. using namespace std ;
  17. CGameLogic* CPlayer::context ;
  18. CActorManager::CActorManager(CGameLogic* context)
  19. {
  20. m_activePlayer = NULL ;
  21. m_context = context ;
  22. CPlayer::context = context ;
  23. m_user_attention_player = NULL ;
  24. }
  25. CActorManager::~CActorManager(void)
  26. {
  27. std::vector<pair<std::string, CPlayer*> >::iterator pos1 ;
  28. for ( pos1 = m_enum_data.begin(); pos1 != m_enum_data.end(); ++pos1 )
  29. {
  30. (*pos1).second->active_in_scene = true ;
  31. }
  32. push_enum_state() ;
  33. // 删除所有的Player和SimpleObj
  34. CPlayer* actor = this->enumActor();
  35. while ( actor != NULL )
  36. {
  37. delete actor ;
  38. actor = this->enumActor() ;
  39. }
  40. pop_enum_state() ;
  41. std::vector< std::pair<std::string, CSimpleObj*> >::iterator pos ;
  42. for ( pos = m_simple_data.begin(); pos != m_simple_data.end(); ++pos)
  43. {
  44. delete (*pos).second ;
  45. }
  46. }
  47. void CActorManager::CreateActors()
  48. {
  49. CPlayer* myActor ;
  50. GameRes* res_info ;
  51. CSimpleObj* myObj ;
  52. fstream in ;
  53. string name ;
  54. m_enum_data.clear() ;
  55. /*
  56. * 下面根据列表文件创建简单对象,比如萝卜
  57. */
  58. in.open( ".\Actor\SimpleObj.profile" ) ;
  59. if ( in.is_open() )
  60. {
  61. in >> name ;
  62. while ( !in.eof() )
  63. {
  64. res_info = m_context->GetRes(name) ;
  65. myObj = new CSimpleObj(res_info) ;
  66. m_simple_data.push_back( make_pair(name, myObj) ) ;
  67. in >> name ;
  68. }
  69. }
  70. else
  71. {
  72. throw runtime_error("SimpleObj.profile not found!") ;
  73. }
  74. /*
  75.  * 创建人物对象
  76.  */
  77. myActor = new CPlayer("牛二") ;
  78. m_enum_data.push_back( make_pair("牛二", myActor) ) ;
  79. myActor = new CPlayer("老掌柜") ;
  80. m_enum_data.push_back( make_pair("老掌柜", myActor) ) ;
  81. myActor = new CPlayer( "管家") ;
  82. m_enum_data.push_back( make_pair("管家", myActor) ) ;
  83. myActor = new CPlayer( "栓柱" ) ;
  84. m_enum_data.push_back( make_pair("栓柱", myActor) ) ;
  85. myActor = new CPlayer( "厨师" ) ;
  86. m_enum_data.push_back( make_pair("厨师", myActor) ) ;
  87. myActor = new CPlayer( "虫老大" ) ;
  88. m_enum_data.push_back( make_pair("虫老大", myActor) ) ;
  89. myActor->AutoAttack(true);
  90. myActor = new CPlayer( "虫老二" ) ;
  91. m_enum_data.push_back( make_pair("虫老二", myActor) ) ;
  92. myActor->AutoAttack(true);
  93. myActor = new CPlayer( "虫老五" ) ;
  94. m_enum_data.push_back( make_pair("虫老五", myActor) ) ;
  95. myActor->AutoAttack(true);
  96. myActor = new CPlayer( "虫阿三" ) ;
  97. m_enum_data.push_back( make_pair("虫阿三", myActor) ) ;
  98. myActor->AutoAttack(true);
  99. myActor = new CPlayer( "虎头怪" ) ;
  100. m_enum_data.push_back( make_pair("虎头怪", myActor) ) ;
  101. myActor->AutoAttack(true);
  102. this->DisableAllActors() ;
  103. m_enum_pos = m_enum_data.begin() ;
  104. }
  105. CPlayer* CActorManager::enumActor()
  106. {
  107. CPlayer* ret ;
  108. if ( m_enum_pos == m_enum_data.end() )
  109. {
  110. SortActors() ;
  111. m_enum_pos = m_enum_data.begin() ;
  112. return NULL ;
  113. }
  114. else
  115. {
  116. ret = (*m_enum_pos).second ;
  117. ++m_enum_pos ;
  118. while ( ret->active_in_scene == false )
  119. {
  120. ret = (*m_enum_pos).second ;
  121. if ( m_enum_pos == m_enum_data.end() )
  122. {
  123. SortActors() ;
  124. m_enum_pos = m_enum_data.begin() ;
  125. ret = NULL ;
  126. break ;
  127. }
  128. m_enum_pos++ ;
  129. }
  130. return ret ;
  131. }
  132. }
  133. void CActorManager::DisableAllActors()
  134. {
  135. std::vector<pair<std::string, CPlayer*> >::iterator pos ;
  136. for ( pos = m_enum_data.begin(); pos != m_enum_data.end(); ++pos )
  137. {
  138. (*pos).second->active_in_scene = false ;
  139. }
  140. }
  141. CPlayer& CActorManager::GetActor(const std::string& name)
  142. {
  143. std::vector<pair<std::string, CPlayer*> >::iterator pos ;
  144. for ( pos = m_enum_data.begin(); pos != m_enum_data.end(); ++pos )
  145. {
  146. if ( (*pos).first == name )
  147. {
  148. return *((*pos).second) ;
  149. }
  150. }
  151. string err = "Actor Not Found: " ;
  152. err += name ;
  153. throw exception( name.c_str() ) ;
  154. }
  155. CSimpleObj& CActorManager::GetSimpleObj(const std::string& name)
  156. {
  157. std::vector< std::pair<std::string, CSimpleObj*> >::iterator pos ;
  158. for ( pos = m_simple_data.begin(); pos != m_simple_data.end(); ++pos)
  159. {
  160. if ( (*pos).first == name )
  161. {
  162. return *((*pos).second) ;
  163. }
  164. }
  165. string err = "Try to get nonexsisted simple object: " ;
  166. err += name ;
  167. throw exception( name.c_str() ) ;
  168. }
  169. void CActorManager::SetActiveActor(const std::string& name)
  170. {
  171. CPlayer* p ;
  172. try
  173. {
  174. p = &this->GetActor(name) ;
  175. }
  176. catch (exception e) 
  177. {
  178. m_activePlayer = NULL ;
  179. return ;
  180. }
  181. m_activePlayer = p ;
  182. }
  183. CPlayer& CActorManager::GetActiveActor()
  184. {
  185. if ( m_activePlayer == NULL )
  186. {
  187. throw exception("No active actor found!") ;
  188. }
  189. else
  190. {
  191. return *m_activePlayer ;
  192. }
  193. }
  194. void CActorManager::SortActors()
  195. {
  196. sort( m_enum_data.begin(), m_enum_data.end(), BaseYcomp() ) ;
  197. }
  198. void CActorManager::push_enum_state()
  199. {
  200. m_enum_stack.push_back( m_enum_pos ) ;
  201. m_enum_pos = m_enum_data.begin() ;
  202. }
  203. void CActorManager::pop_enum_state()
  204. {
  205. if ( !m_enum_stack.empty() )
  206. {
  207. m_enum_pos = m_enum_stack.back() ;
  208. m_enum_stack.pop_back() ;
  209. }
  210. else
  211. {
  212. throw logic_error( "Try to pop an empty enum stack!" ) ;
  213. }
  214. }
  215. /*
  216.  * 刷新用户关注npc,当ActiveActor与某个npc的距离小于★两倍★的敏感距离,就认为关注
  217.  */
  218. void CActorManager::RefreshUserAttention()
  219. {
  220. push_enum_state() ;
  221. CPlayer* Actor = this->enumActor() ;
  222. CPlayer* dest = NULL ;
  223. while ( Actor != NULL ) 
  224. {
  225. if ( Actor != m_activePlayer && Actor->active_in_scene )
  226. {
  227. if ( sqrt( (double)( Actor->x - m_activePlayer->x ) * ( Actor->x - m_activePlayer->x )
  228.   + ( Actor->y - m_activePlayer->y ) * ( Actor->y - m_activePlayer->y ) ) <= 1.25 * this->m_context->GetSensitiveLength() )
  229. {
  230. dest = Actor ;
  231. }
  232. }
  233. Actor = this->enumActor() ;
  234. }
  235. m_user_attention_player = dest ;
  236. pop_enum_state() ;
  237. }
  238. CPlayer* CActorManager::GetUserAttention()
  239. {
  240. return m_user_attention_player ;
  241. }