hgeguictrls.cpp
上传用户:maxiaolivb
上传日期:2022-06-07
资源大小:915k
文件大小:7k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.5
  3. ** Copyright (C) 2003-2004, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** hgeGUI default controls implementation
  7. */
  8. #include "....includehgeguictrls.h"
  9. #include <string.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #ifdef __BORLANDC__
  13. template <typename T>
  14. T min(const T & x, const T & y) {
  15. if (x < y)
  16. return x;
  17. else
  18. return y;
  19. }
  20. #endif
  21. /*
  22. ** hgeGUIText
  23. */
  24. hgeGUIText::hgeGUIText(int _id, float x, float y, float w, float h, hgeFont *fnt)
  25. {
  26. id=_id;
  27. bStatic=true;
  28. bVisible=true;
  29. bEnabled=true;
  30. rect.Set(x, y, x+w, y+h);
  31. font=fnt;
  32. tx=x;
  33. ty=y+(h-fnt->GetHeight())/2.0f;
  34. col=0xFFFFFFFF;
  35. text[0]=0;
  36. }
  37. void hgeGUIText::SetMode(int _align)
  38. {
  39. align=_align;
  40. if(align==HGETEXT_RIGHT) tx=rect.x2;
  41. else if(align==HGETEXT_CENTER) tx=(rect.x1+rect.x2)/2.0f;
  42. else tx=rect.x1;
  43. }
  44. void hgeGUIText::SetText(const char *_text)
  45. {
  46. strcpy(text, _text);
  47. }
  48. void hgeGUIText::printf(const char *format, ...)
  49. {
  50. vsprintf(text, format, (char *)&format+sizeof(format));
  51. }
  52. void hgeGUIText::Render()
  53. {
  54. font->SetColor(col);
  55. font->Render(tx,ty,align,text);
  56. }
  57. /*
  58. ** hgeGUIButton
  59. */
  60. hgeGUIButton::hgeGUIButton(int _id, float x, float y, float w, float h, HTEXTURE tex, float tx, float ty)
  61. {
  62. id=_id;
  63. bStatic=false;
  64. bVisible=true;
  65. bEnabled=true;
  66. rect.Set(x, y, x+w, y+h);
  67. bPressed=false;
  68. bTrigger=false;
  69. sprUp = new hgeSprite(tex, tx, ty, w, h);
  70. sprDown = new hgeSprite(tex, tx+w, ty, w, h);
  71. }
  72. hgeGUIButton::~hgeGUIButton()
  73. {
  74. if(sprUp) delete sprUp;
  75. if(sprDown) delete sprDown;
  76. }
  77. void hgeGUIButton::Render()
  78. {
  79. if(bPressed) sprDown->Render(rect.x1, rect.y1);
  80. else sprUp->Render(rect.x1, rect.y1);
  81. }
  82. bool hgeGUIButton::MouseLButton(bool bDown)
  83. {
  84. if(bDown)
  85. {
  86. bOldState=bPressed; bPressed=true;
  87. return false;
  88. }
  89. else
  90. {
  91. if(bTrigger) bPressed=!bOldState;
  92. else bPressed=false;
  93. return true; 
  94. }
  95. }
  96. /*
  97. ** hgeGUISlider
  98. */
  99. hgeGUISlider::hgeGUISlider(int _id, float x, float y, float w, float h, HTEXTURE tex, float tx, float ty, float sw, float sh, bool vertical)
  100. {
  101. id=_id;
  102. bStatic=false;
  103. bVisible=true;
  104. bEnabled=true;
  105. bPressed=false;
  106. bVertical=vertical;
  107. rect.Set(x, y, x+w, y+h);
  108. mode=HGESLIDER_BAR;
  109. fMin=0; fMax=100; fVal=50;
  110. sl_w=sw; sl_h=sh;
  111. sprSlider=new hgeSprite(tex, tx, ty, sw, sh);
  112. }
  113. hgeGUISlider::~hgeGUISlider()
  114. {
  115. if(sprSlider) delete sprSlider;
  116. }
  117. void hgeGUISlider::SetValue(float _fVal)
  118. {
  119. if(_fVal<fMin) fVal=fMin;
  120. else if(_fVal>fMax) fVal=fMax;
  121. else fVal=_fVal;
  122. }
  123. void hgeGUISlider::Render()
  124. {
  125. float xx, yy;
  126. float x1,y1,x2,y2;
  127. xx=rect.x1+(rect.x2-rect.x1)*(fVal-fMin)/(fMax-fMin);
  128. yy=rect.y1+(rect.y2-rect.y1)*(fVal-fMin)/(fMax-fMin);
  129. if(bVertical)
  130. switch(mode)
  131. {
  132. case HGESLIDER_BAR: x1=rect.x1; y1=rect.y1; x2=rect.x2; y2=yy; break;
  133. case HGESLIDER_BARRELATIVE: x1=rect.x1; y1=(rect.y1+rect.y2)/2; x2=rect.x2; y2=yy; break;
  134. case HGESLIDER_SLIDER: x1=(rect.x1+rect.x2-sl_w)/2; y1=yy-sl_h/2; x2=(rect.x1+rect.x2+sl_w)/2; y2=yy+sl_h/2; break;
  135. }
  136. else
  137. switch(mode)
  138. {
  139. case HGESLIDER_BAR: x1=rect.x1; y1=rect.y1; x2=xx; y2=rect.y2; break;
  140. case HGESLIDER_BARRELATIVE: x1=(rect.x1+rect.x2)/2; y1=rect.y1; x2=xx; y2=rect.y2; break;
  141. case HGESLIDER_SLIDER: x1=xx-sl_w/2; y1=(rect.y1+rect.y2-sl_h)/2; x2=xx+sl_w/2; y2=(rect.y1+rect.y2+sl_h)/2; break;
  142. }
  143. sprSlider->RenderStretch(x1, y1, x2, y2);
  144. }
  145. bool hgeGUISlider::MouseLButton(bool bDown)
  146. {
  147. bPressed=bDown;
  148. return false;
  149. }
  150. bool hgeGUISlider::MouseMove(float x, float y)
  151. {
  152. if(bPressed)
  153. {
  154. if(bVertical)
  155. {
  156. if(y>rect.y2-rect.y1) y=rect.y2-rect.y1;
  157. if(y<0) y=0;
  158. fVal=fMin+(fMax-fMin)*y/(rect.y2-rect.y1);
  159. }
  160. else
  161. {
  162. if(x>rect.x2-rect.x1) x=rect.x2-rect.x1;
  163. if(x<0) x=0;
  164. fVal=fMin+(fMax-fMin)*x/(rect.x2-rect.x1);
  165. }
  166. return true;
  167. }
  168. return false;
  169. }
  170. /*
  171. ** hgeGUIListbox
  172. */
  173. hgeGUIListbox::hgeGUIListbox(int _id, float x, float y, float w, float h, hgeFont *fnt, DWORD tColor, DWORD thColor, DWORD hColor)
  174. {
  175. id=_id;
  176. bStatic=false;
  177. bVisible=true;
  178. bEnabled=true;
  179. rect.Set(x, y, x+w, y+h);
  180. font=fnt;
  181. sprHighlight=new hgeSprite(0, 0, 0, w, fnt->GetHeight());
  182. sprHighlight->SetColor(hColor);
  183. textColor=tColor;
  184. texthilColor=thColor;
  185. pItems=0;
  186. nItems=0;
  187. nSelectedItem=0;
  188. nTopItem=0;
  189. mx=0; my=0;
  190. }
  191. hgeGUIListbox::~hgeGUIListbox()
  192. {
  193. Clear();
  194. if(sprHighlight) delete sprHighlight;
  195. }
  196. int hgeGUIListbox::AddItem(char *item)
  197. {
  198. hgeGUIListboxItem *pItem=pItems, *pPrev=0, *pNew;
  199. pNew = new hgeGUIListboxItem;
  200. memcpy(pNew->text, item, min(sizeof(pNew->text), strlen(item)+1));
  201. pNew->text[sizeof(pNew->text)-1]='';
  202. pNew->next=0;
  203. while(pItem) { pPrev=pItem; pItem=pItem->next; }
  204. if(pPrev) pPrev->next=pNew;
  205. else pItems=pNew;
  206. nItems++;
  207. return nItems-1;
  208. }
  209. void hgeGUIListbox::DeleteItem(int n)
  210. {
  211. hgeGUIListboxItem *pItem=pItems, *pPrev=0;
  212. if(n<0 || n>=GetNumItems()) return;
  213. while(pItem) { pPrev=pItem; pItem=pItem->next; }
  214. if(pPrev) pPrev->next=pItem->next;
  215. else pItems=pItem->next;
  216. delete pItem;
  217. nItems--;
  218. }
  219. char *hgeGUIListbox::GetItemText(int n)
  220. {
  221. int i;
  222. hgeGUIListboxItem *pItem=pItems;
  223. if(n<0 || n>=GetNumItems()) return 0;
  224. for(i=0;i<n;i++) pItem=pItem->next;
  225. return pItem->text;
  226. }
  227. void hgeGUIListbox::Clear()
  228. {
  229. hgeGUIListboxItem *pItem=pItems, *pNext;
  230. while(pItem)
  231. {
  232. pNext=pItem->next;
  233. delete pItem;
  234. pItem=pNext;
  235. }
  236. nItems=0;
  237. }
  238. void hgeGUIListbox::Render()
  239. {
  240. int i;
  241. hgeGUIListboxItem *pItem=pItems;
  242. for(i=0;i<nTopItem;i++) pItem=pItem->next;
  243. for(i=0;i<GetNumRows();i++)
  244. {
  245. if(nTopItem+i == nSelectedItem)
  246. {
  247. sprHighlight->Render(rect.x1,rect.y1+i*font->GetHeight());
  248. font->SetColor(texthilColor);
  249. }
  250. else font->SetColor(textColor);
  251. font->Render(rect.x1+3, rect.y1+i*font->GetHeight(), HGETEXT_LEFT, pItem->text);
  252. if(i>=nItems) return;
  253. pItem=pItem->next;
  254. }
  255. }
  256. bool hgeGUIListbox::MouseLButton(bool bDown)
  257. {
  258. int nItem;
  259. if(bDown)
  260. {
  261. nItem=nTopItem+int(my)/int(font->GetHeight());
  262. if(nItem<nItems)
  263. {
  264. nSelectedItem=nItem;
  265. return true;
  266. }
  267. }
  268. return false;
  269. }
  270. bool hgeGUIListbox::MouseWheel(int nNotches)
  271. {
  272. nTopItem-=nNotches;
  273. if(nTopItem<0) nTopItem=0;
  274. if(nTopItem>GetNumItems()-GetNumRows()) nTopItem=GetNumItems()-GetNumRows();
  275. return true;
  276. }
  277. bool hgeGUIListbox::KeyClick(int key, int chr)
  278. {
  279. switch(key)
  280. {
  281. case HGEK_DOWN:
  282. if(nSelectedItem < nItems-1)
  283. {
  284. nSelectedItem++;
  285. if(nSelectedItem > nTopItem+GetNumRows()-1) nTopItem=nSelectedItem-GetNumRows()+1;
  286. return true;
  287. }
  288. break;
  289. case HGEK_UP:
  290. if(nSelectedItem > 0)
  291. {
  292. nSelectedItem--;
  293. if(nSelectedItem < nTopItem) nTopItem=nSelectedItem;
  294. return true;
  295. }
  296. break;
  297. }
  298. return false;
  299. }