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

模拟服务器

开发平台:

C/C++

  1. // -------------------------------------------------------------------------
  2. // 文件名 : UiTrade.h
  3. // 创建者 : Wooy(Wu yue)
  4. // 创建时间 : 2002-12-21
  5. // 功能描述 : npc交易系统界面
  6. // -------------------------------------------------------------------------
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "../Elem/WndMessage.h"
  10. #include "../elem/wnds.h"
  11. #include "UiShop.h"
  12. #include "UiItem.h"
  13. #include "UiTradeConfirmWnd.h"
  14. #include "../../../core/src/CoreObjGenreDef.h"
  15. #include "../../../core/src/coreshell.h"
  16. #include "../UiSoundSetting.h"
  17. #include "../UiBase.h"
  18. #include "UiInformation.h"
  19. #include <crtdbg.h>
  20. extern iCoreShell* g_pCoreShell;
  21. #define SCHEME_INI "npc买卖界面.ini"
  22. KUiShop* KUiShop::m_pSelf = NULL;
  23. KUiShop::KUiShop()
  24. {
  25. m_pObjsList = NULL;
  26. m_nObjCount = 0;
  27. m_nPageCount = 0;
  28. }
  29. //--------------------------------------------------------------------------
  30. // 功能:如果窗口正被显示,则返回实例指针
  31. //--------------------------------------------------------------------------
  32. KUiShop* KUiShop::GetIfVisible()
  33. {
  34. return m_pSelf;
  35. }
  36. //--------------------------------------------------------------------------
  37. // 功能:打开窗口,返回唯一的一个类对象实例
  38. //--------------------------------------------------------------------------
  39. KUiShop* KUiShop::OpenWindow()
  40. {
  41. if (m_pSelf == NULL)
  42. {
  43. m_pSelf = new KUiShop;
  44. if (m_pSelf)
  45. m_pSelf->Initialize();
  46. }
  47. if (m_pSelf)
  48. {
  49. g_UiBase.SetStatus(UIS_S_TRADE_NPC);
  50. m_pSelf->UpdateData();
  51. m_pSelf->BringToTop();
  52. m_pSelf->Show();
  53. if (KUiItem::GetIfVisible() == NULL)
  54. KUiItem::OpenWindow();
  55. else
  56. UiSoundPlay(UI_SI_WND_OPENCLOSE);
  57. KUiItem::OnNpcTradeMode(true);
  58. }
  59. return m_pSelf;
  60. }
  61. //--------------------------------------------------------------------------
  62. // 功能:关闭窗口,同时可以选则是否删除对象实例
  63. //--------------------------------------------------------------------------
  64. void KUiShop::CloseWindow()
  65. {
  66. if (m_pSelf)
  67. {
  68. KUiItem::OnNpcTradeMode(false);
  69. KUiTradeConfirm::CloseWindow(true);
  70. g_UiBase.SetStatus(UIS_S_IDLE);
  71. m_pSelf->Destroy();
  72. m_pSelf = NULL;
  73. }
  74. }
  75. //初始化
  76. void KUiShop::Initialize()
  77. {
  78. AddChild(&m_ItemsBox);
  79. AddChild(&m_BuyBtn);
  80. AddChild(&m_SellBtn);
  81. AddChild(&m_RepairBtn);
  82. AddChild(&m_PreBtn);
  83. AddChild(&m_NextBtn);
  84. AddChild(&m_CloseBtn);
  85. m_ItemsBox.SetContainerId((int)UOC_NPC_SHOP);
  86. Wnd_AddWindow(this);
  87. char Scheme[256];
  88. g_UiBase.GetCurSchemePath(Scheme, 256);
  89. LoadScheme(Scheme);
  90. }
  91. //载入界面方案
  92. void KUiShop::LoadScheme(const char* pScheme)
  93. {
  94. if (m_pSelf)
  95. {
  96. char Buff[128];
  97. KIniFile Ini;
  98. sprintf(Buff, "%s\"SCHEME_INI, pScheme);
  99. if (Ini.Load(Buff))
  100. {
  101. m_pSelf->KWndShowAnimate::Init(&Ini, "Main");
  102. m_pSelf->m_ItemsBox.Init(&Ini, "ItemBox");
  103. m_pSelf->m_BuyBtn.Init(&Ini, "BuyBtn");
  104. m_pSelf->m_SellBtn.Init(&Ini, "SellBtn");
  105. m_pSelf->m_RepairBtn.Init(&Ini, "RepairBtn");
  106. m_pSelf->m_PreBtn.Init(&Ini, "LeftBtn");
  107. m_pSelf->m_NextBtn.Init(&Ini,"RightBtn");
  108. m_pSelf->m_CloseBtn.Init(&Ini, "CloseBtn");
  109. m_pSelf->m_ItemsBox.EnablePickPut(false);
  110. }
  111. }
  112. }
  113. void KUiShop::CancelTrade()
  114. {
  115. CloseWindow();
  116. }
  117. //窗口函数
  118. int KUiShop::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  119. {
  120. switch (uMsg)
  121. {
  122. case WND_N_BUTTON_CLICK:
  123. OnClickButton((KWndButton*)(KWndWindow*)uParam, nParam);
  124. break;
  125. case WND_N_LEFT_CLICK_ITEM:
  126. OnBuyItem((KUiDraggedObject*)uParam,
  127. g_UiBase.GetStatus() == UIS_S_TRADE_BUY);
  128. break;
  129. case WND_N_RIGHT_CLICK_ITEM:
  130. if (nParam == (int)(KWndWindow*)&m_ItemsBox)
  131. OnBuyItem((KUiDraggedObject*)uParam, true);
  132. break;
  133. case WM_KEYDOWN:
  134. if (uParam == VK_ESCAPE)
  135. {
  136. if (g_UiBase.GetStatus() == UIS_S_TRADE_NPC)
  137. {
  138. CloseWindow();
  139. }
  140. else
  141. {
  142. m_BuyBtn.CheckButton(false);
  143. m_SellBtn.CheckButton(false);
  144. m_RepairBtn.CheckButton(false);
  145. g_UiBase.SetStatus(UIS_S_TRADE_NPC);
  146. }
  147. }
  148. break;
  149. default:
  150. return KWndShowAnimate::WndProc(uMsg, uParam, nParam);
  151. }
  152. return 0;
  153. }
  154. void KUiShop::OnBuyItem(KUiDraggedObject* pItem, bool bDoImmed)
  155. {
  156. if (pItem == NULL || g_pCoreShell == NULL)
  157. return;
  158. KUiObjAtContRegion Obj;
  159. Obj.Obj.uGenre = pItem->uGenre;
  160. Obj.Obj.uId = pItem->uId;
  161. Obj.Region.h = pItem->DataX;
  162. Obj.Region.v = pItem->DataY;
  163. Obj.Region.Width  = pItem->DataW;
  164. Obj.Region.Height = pItem->DataH;
  165. Obj.eContainer = UOC_NPC_SHOP;
  166. if (bDoImmed == false)
  167. {
  168. KUiItemBuySelInfo Price = { 0 };
  169. if (g_pCoreShell->GetGameData(GDI_TRADE_ITEM_PRICE,
  170. (unsigned int)(&Obj), (int)(&Price)))
  171. {
  172. KUiTradeConfirm::OpenWindow(&Obj, &Price, TCA_BUY);
  173. }
  174. }
  175. else
  176. {
  177. g_pCoreShell->OperationRequest(GOI_TRADE_NPC_BUY,
  178. (unsigned int)(&Obj), 0);
  179. }
  180. }
  181. void KUiShop::OnClickButton(KWndButton* pWnd, int bCheck)
  182. {
  183. if (Wnd_GetDragObj(NULL))
  184. return;
  185. if (pWnd == &m_BuyBtn)
  186. {
  187. if (bCheck)
  188. {
  189. m_SellBtn.CheckButton(false);
  190. m_RepairBtn.CheckButton(false);
  191. g_UiBase.SetStatus(UIS_S_TRADE_BUY);
  192. }
  193. else
  194. g_UiBase.SetStatus(UIS_S_TRADE_NPC);
  195. }
  196. else if (pWnd == &m_SellBtn)
  197. {
  198. if (bCheck)
  199. {
  200. m_BuyBtn.CheckButton(false);
  201. m_RepairBtn.CheckButton(false);
  202. g_UiBase.SetStatus(UIS_S_TRADE_SALE);
  203. }
  204. else
  205. g_UiBase.SetStatus(UIS_S_TRADE_NPC);
  206. }
  207. else if (pWnd == &m_RepairBtn)
  208. {
  209. if (bCheck)
  210. {
  211. m_BuyBtn.CheckButton(false);
  212. m_SellBtn.CheckButton(false);
  213. g_UiBase.SetStatus(UIS_S_TRADE_REPAIR);
  214. }
  215. else
  216. g_UiBase.SetStatus(UIS_S_TRADE_NPC);
  217. }
  218. else if (pWnd == &m_PreBtn)
  219. SetPage(m_nCurrentPage - 1);
  220. else if(pWnd == &m_NextBtn)
  221. SetPage(m_nCurrentPage + 1);
  222. else if (pWnd == &m_CloseBtn)
  223. CloseWindow();
  224. }
  225. void KUiShop::SetPage(int nIndex)
  226. {
  227. if (nIndex >= 0 && nIndex < m_nPageCount && m_pObjsList)
  228. {
  229. m_ItemsBox.Clear();
  230. for (int i = 0; i < m_nObjCount; i++)
  231. {
  232. if (m_pObjsList[i].nContainer == nIndex)
  233. m_ItemsBox.AddObject((KUiDraggedObject*)&m_pObjsList[i], 1);
  234. }
  235. m_nCurrentPage = nIndex;
  236. }
  237. }
  238. void KUiShop::UpdateData()
  239. {
  240. Clear();
  241. m_nObjCount = g_pCoreShell->GetGameData(GDI_TRADE_NPC_ITEM, 0, 0);
  242. if (m_nObjCount == 0)
  243. return;
  244. if (m_pObjsList = (KUiObjAtContRegion*)malloc(sizeof(KUiObjAtContRegion) * m_nObjCount))
  245. {
  246. g_pCoreShell->GetGameData(GDI_TRADE_NPC_ITEM, (unsigned int)m_pObjsList, m_nObjCount);//单线程执行,nCount值不变
  247. m_nPageCount = m_pObjsList[m_nObjCount - 1].nContainer + 1;
  248. SetPage(0);
  249. m_PreBtn.Enable(m_nPageCount > 1);
  250. m_NextBtn.Enable(m_nPageCount > 1);
  251. }
  252. else
  253. m_nObjCount = 0;
  254. }
  255. void KUiShop::Clear()
  256. {
  257. m_nObjCount  = 0;
  258. m_nPageCount = 0;
  259. if (m_pObjsList)
  260. {
  261. free(m_pObjsList);
  262. m_pObjsList = NULL;
  263. }
  264. }