UiMiniMap.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:10k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 界面--小地图
  3. // Copyright : Kingsoft 2003
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2003-4-21
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "../Elem/Wnds.h"
  10. #include "../Elem/WndMessage.h"
  11. #include "UiMiniMap.h"
  12. #include "../UiBase.h"
  13. #include "../UiSoundSetting.h"
  14. #include "UiWorldMap.h"
  15. #include "../../../core/src/coreshell.h"
  16. #include "../../../core/src/gamedatadef.h"
  17. #include "../../../Represent/iRepresent/iRepresentShell.h"
  18. #include "../../../Represent/iRepresent/KRepresentUnit.h"
  19. #include "../Elem/TextPic.h"
  20. #include <time.h>
  21. extern iRepresentShell* g_pRepresentShell;
  22. extern iCoreShell* g_pCoreShell;
  23. extern IInlinePicEngineSink *g_pIInlinePicSink;
  24. #define SCHEME_INI_SMALL "小地图_小.ini"
  25. #define SCHEME_INI_BIG "小地图_浏览版.ini"
  26. //地图拖动后还原的时间(秒)
  27. #define MAP_RECOVER_TIME 3000
  28. #define NOT_DRAGING_MAP -1
  29. #define WAIT_TO_BE_SET_BACK -2
  30. #define IS_DRAGING_MAP (m_OldPos.x != NOT_DRAGING_MAP)
  31. #define IS_WAIT_TO_SET_BACK (m_OldPos.x == WAIT_TO_BE_SET_BACK)
  32. const char* s_ModeName[MINIMAP_M_COUNT] = 
  33. {
  34. "标准小地图", 
  35. "标准大地图",
  36. "世界大地图",
  37. " 关闭地图 "
  38. };
  39. KUiMiniMap* KUiMiniMap::ms_pSelf = NULL;
  40. static MINIMAP_MODE s_eMapMode = MINIMAP_M_NONE;
  41. static MINIMAP_MODE s_eMapOldMode = MINIMAP_M_BRIEF_PIC;
  42. KUiMiniMap::KUiMiniMap()
  43. {
  44. m_OldPos.x = NOT_DRAGING_MAP;
  45. }
  46. //--------------------------------------------------------------------------
  47. // 功能:打开窗口,返回唯一的一个类对象实例
  48. //--------------------------------------------------------------------------
  49. KUiMiniMap* KUiMiniMap::OpenWindow()
  50. {
  51. if (ms_pSelf == NULL)
  52. {
  53. ms_pSelf = new KUiMiniMap;
  54. if (ms_pSelf)
  55. ms_pSelf->Initialize();
  56. }
  57. if (ms_pSelf)
  58. {
  59. UiSoundPlay(UI_SI_WND_OPENCLOSE);
  60. ms_pSelf->Show();
  61. ms_pSelf->BringToTop();
  62. }
  63. return ms_pSelf;
  64. }
  65. //--------------------------------------------------------------------------
  66. // 功能:如果窗口正被显示,则返回实例指针
  67. //--------------------------------------------------------------------------
  68. KUiMiniMap* KUiMiniMap::GetIfVisible()
  69. {
  70. if (ms_pSelf && ms_pSelf->IsVisible())
  71. return ms_pSelf;
  72. return NULL;
  73. }
  74. //--------------------------------------------------------------------------
  75. // 功能:初始化
  76. //--------------------------------------------------------------------------
  77. void KUiMiniMap::Initialize()
  78. {
  79. AddChild(&m_Shadow);
  80. AddChild(&m_SceneName);
  81. AddChild(&m_SwitchBtn);
  82. AddChild(&m_WorldMapBtn);
  83. AddChild(&m_ScenePos);
  84. m_Style &= ~WND_S_VISIBLE;
  85. char Scheme[128];
  86. g_UiBase.GetCurSchemePath(Scheme, 256);
  87. LoadScheme(Scheme);
  88. Wnd_AddWindow(this, WL_NORMAL);
  89. }
  90. //--------------------------------------------------------------------------
  91. // 功能:关闭窗口
  92. //--------------------------------------------------------------------------
  93. void KUiMiniMap::CloseWindow()
  94. {
  95. if (ms_pSelf)
  96. {
  97. ms_pSelf->StopScrollMap();
  98. ms_pSelf->MapMoveBack();
  99. if (g_pCoreShell)
  100. g_pCoreShell->SceneMapOperation(GSMOI_IS_SCENE_MAP_SHOWING, SCENE_PLACE_MAP_ELEM_NONE, 0);
  101. ms_pSelf->Destroy();
  102. ms_pSelf = NULL;
  103. }
  104. }
  105. //--------------------------------------------------------------------------
  106. // 功能:载入窗口的界面方案
  107. //--------------------------------------------------------------------------
  108. void KUiMiniMap::LoadScheme(const char* pScheme)
  109. {
  110. if (ms_pSelf)
  111. {
  112. char szBuf[128];
  113. KIniFile Ini;
  114. sprintf(szBuf, "%s\%s", pScheme,
  115. s_eMapMode == MINIMAP_M_BRIEF_PIC ? SCHEME_INI_SMALL : SCHEME_INI_BIG);
  116. if (Ini.Load(szBuf))
  117. {
  118. ms_pSelf->LoadScheme(&Ini);
  119. }
  120. }
  121. }
  122. void KUiMiniMap::LoadScheme(KIniFile* pIni)
  123. {
  124. if (pIni == NULL)
  125. return;
  126. Init(pIni, "MiniMap");
  127. m_Shadow.Init(pIni, "NameShadow");
  128. m_SceneName.Init(pIni, "SceneName");
  129. m_ScenePos.Init(pIni, "ScenePos");
  130. m_SwitchBtn.Init(pIni, "SwitchBtn");
  131. m_WorldMapBtn.Init(pIni, "WorldMapBtn");
  132. pIni->GetInteger("MapRect", "Left",   0, (int*)&m_MapPos.x);
  133. pIni->GetInteger("MapRect", "Top",    0, (int*)&m_MapPos.y);
  134. pIni->GetInteger("MapRect", "Width",  0, (int*)&m_MapSize.cx);
  135. pIni->GetInteger("MapRect", "Height", 0, (int*)&m_MapSize.cy);
  136. if (IsVisible() && g_pCoreShell)
  137. {
  138. g_pCoreShell->SceneMapOperation(GSMOI_IS_SCENE_MAP_SHOWING,
  139. SCENE_PLACE_MAP_ELEM_PIC | SCENE_PLACE_MAP_ELEM_CHARACTER | SCENE_PLACE_MAP_ELEM_PARTNER,
  140. (m_MapSize.cx | (m_MapSize.cy << 16)));
  141. }
  142. }
  143. //--------------------------------------------------------------------------
  144. // 功能:窗口函数
  145. //--------------------------------------------------------------------------
  146. int KUiMiniMap::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  147. {
  148. int nRet = 0;
  149. switch(uMsg)
  150. {
  151. case WND_N_BUTTON_CLICK:
  152. if (uParam == (unsigned int)(KWndWindow*)&m_SwitchBtn)
  153. MapSetMode(s_eMapMode == MINIMAP_M_BRIEF_PIC ? MINIMAP_M_BRIEF_PIC_BROWSE : MINIMAP_M_BRIEF_PIC);
  154. else if (uParam == (unsigned int)(KWndWindow*)&m_WorldMapBtn)
  155. MapSetMode(MINIMAP_M_WORLD_MAP);
  156. break;
  157. case WM_LBUTTONDOWN:
  158. case WM_LBUTTONUP:
  159. case WM_LBUTTONDBLCLK:
  160. case WM_MOUSEHOVER:
  161. Wnd_TransmitInputToGameSpace(uMsg, uParam, nParam);
  162. break;
  163. case WND_N_CHILD_MOVE:
  164. if (uParam == (unsigned int)(KWndWindow*)&m_SceneName ||
  165. uParam == (unsigned int)(KWndWindow*)&m_ScenePos ||
  166. uParam == (unsigned int)(KWndWindow*)&m_Shadow)
  167. {
  168. KWndWindow* pWnd = (KWndWindow*)uParam;
  169. int nMoveOffsetX = (short)(nParam & 0xffff);
  170. int nMoveOffsetY = (short)((nParam >> 16) & 0xffff);
  171. int x, y;
  172. pWnd->GetPosition(&x, &y);
  173. x -= nMoveOffsetX;
  174. y -= nMoveOffsetY;
  175. pWnd->SetPosition(x, y); //按钮跟着窗口变化,所以要先变回原样
  176. GetPosition(&x, &y);
  177. x += nMoveOffsetX;
  178. y += nMoveOffsetY;
  179. SetPosition(x, y);
  180. }
  181. break;
  182. case WM_RBUTTONDOWN:
  183. Wnd_SetCapture(this);
  184. Wnd_GetCursorPos((int *)&m_OldPos.x, (int *)&m_OldPos.y);
  185. break;
  186. case WM_MOUSEMOVE:
  187. if(IS_DRAGING_MAP && (uParam & MK_RBUTTON))
  188. {
  189. int nCursorX, nCursorY;
  190. Wnd_GetCursorPos(&nCursorX, &nCursorY);
  191. m_nOffsetX = m_OldPos.x - nCursorX;
  192. m_nOffsetY = m_OldPos.y - nCursorY;
  193. m_OldPos.x   =  nCursorX;
  194. m_OldPos.y   =  nCursorY;
  195. MapScroll(uParam & MK_CONTROL);
  196. }
  197. else
  198. {
  199. Wnd_TransmitInputToGameSpace(uMsg, uParam, nParam);
  200. }
  201. break;
  202. case WM_RBUTTONUP:
  203. if (IS_DRAGING_MAP && ((uParam & MK_CONTROL) == 0) && g_pCoreShell)
  204. g_pCoreShell->SceneMapOperation(GSMOI_SCENE_FOLLOW_WITH_MAP, 0, 0);
  205. StopScrollMap();
  206. break;
  207. default:
  208. nRet = KWndWindow::WndProc(uMsg, uParam, nParam);
  209. break;
  210. }
  211. return nRet;
  212. }
  213. //停止拖动地图
  214. void KUiMiniMap::StopScrollMap()
  215. {
  216. if (IS_DRAGING_MAP)
  217. {
  218. m_uLastScrollTime = IR_GetCurrentTime();
  219. Wnd_ReleaseCapture();
  220. m_OldPos.x = WAIT_TO_BE_SET_BACK;
  221. }
  222. }
  223. //地图还原原始偏移
  224. void KUiMiniMap::MapMoveBack()
  225. {
  226. m_OldPos.x = NOT_DRAGING_MAP;
  227. m_nOffsetX = 0;
  228. m_nOffsetY = 0;
  229. if (g_pCoreShell)
  230. {
  231. g_pCoreShell->SceneMapOperation(GSMOI_SCENE_FOLLOW_WITH_MAP, 0, 0);
  232. g_pCoreShell->SceneMapOperation(GSMOI_SCENE_MAP_FOCUS_OFFSET, 0, 0);
  233. }
  234. }
  235. //绘制窗口
  236. void KUiMiniMap::PaintWindow()
  237. {
  238. KWndImage::PaintWindow();
  239. if (g_pCoreShell)
  240. {
  241. int nX = m_MapPos.x + m_nAbsoluteLeft;
  242. int nY = m_MapPos.y + m_nAbsoluteTop;
  243. g_pCoreShell->SceneMapOperation(GSMOI_PAINT_SCENE_MAP, nX, nY);
  244. if (g_pRepresentShell)
  245. {
  246. KRURect rect;
  247. rect.Color.Color_dw = 0xff000000;
  248. rect.oEndPos.nX = rect.oPosition.nX = nX - 1;
  249. rect.oEndPos.nY = rect.oPosition.nY = nY - 1;
  250. rect.oEndPos.nZ = rect.oPosition.nZ = 0;
  251. rect.oEndPos.nX += m_MapSize.cx;
  252. rect.oEndPos.nY += m_MapSize.cy;
  253. g_pRepresentShell->DrawPrimitives(1, &rect, RU_T_RECT, true);
  254. }
  255. }
  256. }
  257. void KUiMiniMap::Breathe()
  258. {
  259. if (IS_WAIT_TO_SET_BACK && g_pCoreShell &&
  260. IR_IsTimePassed(MAP_RECOVER_TIME, m_uLastScrollTime))
  261. {
  262. MapMoveBack();
  263. }
  264. }
  265. //活动函数
  266. void KUiMiniMap::UpdateSceneTimeInfo(KUiSceneTimeInfo* pInfo)
  267. {
  268. if (ms_pSelf && pInfo)
  269. {
  270. ms_pSelf->m_SceneName.SetText(pInfo->szSceneName);
  271. ms_pSelf->m_ScenePos.Set2IntText(pInfo->nScenePos0 / 8, pInfo->nScenePos1 / 8, '/');
  272. }
  273. }
  274. //显示窗口
  275. void KUiMiniMap::Show()
  276. {
  277. KWndImage::Show();
  278. if (g_pCoreShell)
  279. {
  280. g_pCoreShell->SceneMapOperation(GSMOI_IS_SCENE_MAP_SHOWING,
  281. SCENE_PLACE_MAP_ELEM_PIC | SCENE_PLACE_MAP_ELEM_CHARACTER | SCENE_PLACE_MAP_ELEM_PARTNER,
  282. (ms_pSelf->m_MapSize.cx | (ms_pSelf->m_MapSize.cy << 16)));
  283. }
  284. }
  285. //隐藏窗口
  286. void KUiMiniMap::Hide()
  287. {
  288. KWndImage::Hide();
  289. if (g_pCoreShell)
  290. g_pCoreShell->SceneMapOperation(GSMOI_IS_SCENE_MAP_SHOWING, SCENE_PLACE_MAP_ELEM_NONE, 0);
  291. }
  292. //地图卷动
  293. void KUiMiniMap::MapScroll(int nbScrollScene)
  294. {
  295. KSceneMapInfo MapInfo;
  296.     if(g_pCoreShell && g_pCoreShell->SceneMapOperation(GSMOI_SCENE_MAP_INFO, (unsigned int)&MapInfo, 0))
  297. {
  298. int nX = MapInfo.nOrigFocusH + MapInfo.nFocusOffsetH + MapInfo.nScallH * m_nOffsetX;
  299. int nY = MapInfo.nOrigFocusV + MapInfo.nFocusOffsetV + MapInfo.nScallV * m_nOffsetY;
  300. if (nX < MapInfo.nFocusMinH)
  301. nX = MapInfo.nFocusMinH; 
  302. else if (nX > MapInfo.nFocusMaxH)
  303. nX = MapInfo.nFocusMaxH;
  304. if (nY < MapInfo.nFocusMinV)
  305. nY = MapInfo.nFocusMinV;
  306. else if (nY > MapInfo.nFocusMaxV)
  307. nY = MapInfo.nFocusMaxV;
  308. nX -= MapInfo.nOrigFocusH;
  309. nY -= MapInfo.nOrigFocusV;
  310. g_pCoreShell->SceneMapOperation(GSMOI_SCENE_FOLLOW_WITH_MAP, 0, nbScrollScene);
  311. g_pCoreShell->SceneMapOperation(GSMOI_SCENE_MAP_FOCUS_OFFSET, (unsigned int)nX, nY);
  312. }
  313. }
  314. void MapToggleStatus()
  315. {
  316. if (s_eMapMode == MINIMAP_M_NONE || s_eMapMode == MINIMAP_M_WORLD_MAP)
  317. MapSetMode(s_eMapOldMode);
  318. else
  319. MapSetMode(MINIMAP_M_NONE);
  320. }
  321. //设置显示内容模式
  322. void MapSetMode(MINIMAP_MODE eMode)
  323. {
  324. if (eMode == s_eMapMode &&
  325. (eMode < MINIMAP_M_NONE || eMode > MINIMAP_M_WORLD_MAP))
  326. return;
  327. if (s_eMapMode != MINIMAP_M_WORLD_MAP)
  328. s_eMapOldMode = s_eMapMode;
  329. switch(s_eMapMode = eMode)
  330. {
  331. case MINIMAP_M_NONE: //没有显示地图
  332. KUiMiniMap::CloseWindow();
  333. KUiWorldmap::CloseWindow();
  334. break;
  335. case MINIMAP_M_BRIEF_PIC: //缩略图
  336. case MINIMAP_M_BRIEF_PIC_BROWSE://缩略图浏览/放大模式
  337. KUiWorldmap::CloseWindow();
  338. if (KUiMiniMap::GetIfVisible() == NULL)
  339. KUiMiniMap::OpenWindow();
  340. else
  341. {
  342. char Scheme[128];
  343. g_UiBase.GetCurSchemePath(Scheme, 256);
  344. KUiMiniMap::LoadScheme(Scheme);
  345. }
  346. break;
  347. case MINIMAP_M_WORLD_MAP: //世界地图
  348. KUiMiniMap::CloseWindow();
  349. KUiWorldmap::OpenWindow();
  350. break;
  351. }
  352. }