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

游戏引擎

开发平台:

Visual C++

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