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

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.8
  3. ** Copyright (C) 2003, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** Bitmap Font Builder
  7. */
  8. #include "fonted.h"
  9. #include <stdio.h>
  10. HGE *hge=0;
  11. hgeFont *fnt;
  12. hgeGUI *gui;
  13. HTEXTURE texGui;
  14. HTEXTURE texFont=0;
  15. hgeSprite *sprFont=0, *sprBlack;
  16. hgeSprite *sprLeftPane1, *sprLeftPane2;
  17. hgeSprite *sprCursor;
  18. CFontList *FontList=0;
  19. FEditorState state;
  20. float psx=484, psy=300;
  21. float fw2, fh2;
  22. void InitEditor();
  23. void DoneEditor();
  24. void CreateGUI();
  25. HTEXTURE FontGenerate();
  26. bool FrameFunc()
  27. {
  28. float dt=hge->Timer_GetDelta();
  29. // Update
  30. fw2=sprFont->GetWidth()/2;
  31. fh2=sprFont->GetHeight()/2;
  32. hge->Input_GetMousePos(&state.mx, &state.my);
  33. if(hge->Input_GetKeyState(HGEK_LBUTTON))
  34. {
  35. if(state.bDrag)
  36. {
  37. psx=state.nDragOldX+(state.mx-state.nDragXOffset);
  38. psy=state.nDragOldY+(state.my-state.nDragYOffset);
  39. }
  40. }
  41. else state.bDrag=false;
  42. if(HandleKeys(hge->Input_GetKey())) return true;
  43. if(DoCommands(gui->Update(dt))) return true;
  44. return false;
  45. }
  46. bool RenderFunc()
  47. {
  48. int i;
  49. char szTemp[128];
  50. // Render
  51. hge->Gfx_BeginScene();
  52. hge->Gfx_Clear(0xFF404040);
  53. sprBlack->SetTextureRect(0,0,sprFont->GetWidth(),sprFont->GetHeight());
  54. sprBlack->Render(psx-fw2, psy-fh2);
  55. sprFont->Render(psx-fw2, psy-fh2);
  56. float u0,v0,u1,v1;
  57. if(state.bBBox)
  58. for(i=state.sr.First;i<=state.sr.Last;i++)
  59. {
  60. u0=(float)vChars[i].x+psx-fw2;
  61. u1=u0+vChars[i].w;
  62. v0=(float)vChars[i].y+psy-fh2;
  63. v1=v0+vChars[i].h;
  64. hge->Gfx_RenderLine(u0+0.5f, v0+0.5f, u1,      v0+0.5f, 0xFF95883F);
  65. hge->Gfx_RenderLine(u1,      v0+0.5f, u1,      v1,      0xFF95883F);
  66. hge->Gfx_RenderLine(u1,      v1,      u0+0.5f, v1,      0xFF95883F);
  67. hge->Gfx_RenderLine(u0+0.5f, v1,      u0+0.5f, v0+0.5f, 0xFF95883F);
  68. }
  69. sprintf(szTemp,"Texture size: %dx%d",(int)sprFont->GetWidth(),(int)sprFont->GetHeight());
  70. fnt->SetColor(0xFF808080);
  71. fnt->Render(176, 580, HGETEXT_LEFT, szTemp);
  72. for(i=state.sr.First;i<=state.sr.Last;i++)
  73. {
  74. u0=(float)vChars[i].x+psx-fw2;
  75. u1=u0+vChars[i].w;
  76. v0=(float)vChars[i].y+psy-fh2;
  77. v1=v0+vChars[i].h;
  78. if(state.mx>=u0 && state.mx<u1 &&
  79. state.my>=v0 && state.my<v1)
  80. {
  81. hge->Gfx_RenderLine(u0+0.5f, v0+0.5f, u1,      v0+0.5f, 0xFFFF0000);
  82. hge->Gfx_RenderLine(u1,      v0+0.5f, u1,      v1,      0xFFFF0000);
  83. hge->Gfx_RenderLine(u1,      v1,      u0+0.5f, v1,      0xFFFF0000);
  84. hge->Gfx_RenderLine(u0+0.5f, v1,      u0+0.5f, v0+0.5f, 0xFFFF0000);
  85. if(i>=32 && i<=126)
  86. sprintf(szTemp,""%c" = x:%d y:%d w:%d h:%d  a:%d c:%d",
  87. (char)i, vChars[i].x, vChars[i].y, vChars[i].w, vChars[i].h,
  88. vChars[i].a, vChars[i].c);
  89. else
  90. sprintf(szTemp,"0x%02X = x:%d y:%d w:%d h:%d  a:%d c:%d",
  91. i, vChars[i].x, vChars[i].y, vChars[i].w, vChars[i].h,
  92. vChars[i].a, vChars[i].c);
  93. fnt->Render(790, 580, HGETEXT_RIGHT, szTemp);
  94. }
  95. }
  96. sprLeftPane1->Render(0,0);
  97. sprLeftPane2->Render(0,512);
  98. gui->Render();
  99. if(state.bHelp)
  100. {
  101. fnt->SetColor(0xFFFFFFFF);
  102. fnt->Render(189, 18, HGETEXT_LEFT, "Left mouse button - drag font texturen"
  103. "Typefaces listbox - use Up/Down arrows, Mouse wheeln"
  104. "Characters range - click and dragn"
  105. "Esc - Exitnn"
  106. "A saved font includes two files: .FNT and .PNGn"
  107. "You could apply any additional effects to the saved PNG in your graphics editorn"
  108. "Edit FONTED.INI file to run in fullscreen");
  109. }
  110. if(hge->Input_IsMouseOver()) sprCursor->Render(state.mx, state.my);
  111. hge->Gfx_EndScene();
  112. return false;
  113. }
  114. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  115. {
  116. hge = hgeCreate(HGE_VERSION);
  117. hge->System_SetState(HGE_INIFILE, "fonted.ini");
  118. hge->System_SetState(HGE_LOGFILE, "fonted.log");
  119. hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
  120. hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
  121. hge->System_SetState(HGE_TITLE, "HGE Bitmap Font Builder");
  122. hge->System_SetState(HGE_SCREENWIDTH, 800);
  123. hge->System_SetState(HGE_SCREENHEIGHT, 600);
  124. hge->System_SetState(HGE_SCREENBPP, 32);
  125. hge->System_SetState(HGE_USESOUND, false);
  126. if(hge->Ini_GetInt("HGE", "FullScreen",0)) hge->System_SetState(HGE_WINDOWED, false);
  127. else hge->System_SetState(HGE_WINDOWED, true);
  128. if(hge->System_Initiate())
  129. {
  130. InitEditor();
  131. hge->System_Start();
  132. DoneEditor();
  133. }
  134. else MessageBox(NULL, hge->System_GetErrorMessage(), "Error", MB_OK | MB_ICONERROR | MB_TASKMODAL);
  135. hge->System_Shutdown();
  136. hge->Release();
  137. return 0;
  138. }
  139. void InitEditor()
  140. {
  141. hge->Resource_AttachPack("fonted.paq");
  142. fnt=new hgeFont("font3.fnt");
  143. state.bHelp=false;
  144. state.bBBox=false;
  145. state.bDrag=false;
  146. FontList=new CFontList();
  147. FontList->BuildList();
  148. state.FontFamily=FontList->GetFontByIdx(0);
  149. state.nSize=20;
  150. state.nPadTop=hge->Ini_GetInt("HGE", "PaddingTop",0);
  151. state.nPadBtm=hge->Ini_GetInt("HGE", "PaddingBottom",0);
  152. state.nPadLft=hge->Ini_GetInt("HGE", "PaddingLeft",0);
  153. state.nPadRgt=hge->Ini_GetInt("HGE", "PaddingRight",0);
  154. state.bBold=false;
  155. state.bItalic=false;
  156. state.bAntialias=true;
  157. state.sr.First=32;
  158. state.sr.Last=126;
  159. cmdGenerateFont();
  160. texGui=hge->Texture_Load("fgui.png");
  161. sprCursor=new hgeSprite(texGui, 487, 181, 19, 26);
  162. sprBlack=new hgeSprite(0,0,0,100,100);
  163. sprBlack->SetColor(0xFF000000);
  164. sprLeftPane1=new hgeSprite(texGui, 0, 0, 168, 512);
  165. sprLeftPane2=new hgeSprite(texGui, 336, 0, 168, 88);
  166. gui=new hgeGUI();
  167. CreateGUI();
  168. }
  169. void DoneEditor()
  170. {
  171. delete gui;
  172. delete sprLeftPane1;
  173. delete sprLeftPane2;
  174. delete sprCursor;
  175. delete fnt;
  176. delete sprFont;
  177. delete sprBlack;
  178. delete FontList;
  179. hge->Texture_Free(texFont);
  180. hge->Texture_Free(texGui);
  181. hge->Resource_RemoveAllPacks();
  182. }
  183. void CreateGUI()
  184. {
  185. hgeGUIListbox *listbox;
  186. hgeGUIButton  *button;
  187. hgeGUISlider  *slider;
  188. hgeGUIText   *text;
  189. hgeGUIRange   *range;
  190. int i;
  191. gui->AddCtrl(new hgeGUIButton(CMD_SAVE, 9, 485, 47, 17, texGui, 336, 338));
  192. gui->AddCtrl(new hgeGUIButton(CMD_EXIT, 111, 485, 47, 17, texGui, 336, 338));
  193. button=new hgeGUIButton(CMD_HELP, 60, 485, 47, 17, texGui, 336, 338);
  194. button->SetMode(true);
  195. gui->AddCtrl(button);
  196. button=new hgeGUIButton(CMD_BOLD, 9, 180, 8, 8, texGui, 368, 176);
  197. button->SetMode(true);
  198. button->SetState(state.bBold);
  199. gui->AddCtrl(button);
  200. button=new hgeGUIButton(CMD_ITALIC, 52, 180, 8, 8, texGui, 368, 176);
  201. button->SetMode(true);
  202. button->SetState(state.bItalic);
  203. gui->AddCtrl(button);
  204. button=new hgeGUIButton(CMD_ANTIALIAS, 97, 180, 8, 8, texGui, 368, 176);
  205. button->SetMode(true);
  206. button->SetState(state.bAntialias);
  207. gui->AddCtrl(button);
  208. button=new hgeGUIButton(CMD_BOUNDINGBOX, 9, 461, 8, 8, texGui, 368, 176);
  209. button->SetMode(true);
  210. button->SetState(state.bBBox);
  211. gui->AddCtrl(button);
  212. listbox=new hgeGUIListbox(CMD_FAMILYLIST, 10, 44, 139, 128, fnt, 0xFF7697A4, 0xFFBBCBD2, 0x40D4C25A);
  213. for(i=0; i<FontList->GetNumFonts(); i++) listbox->AddItem(FontList->GetFontByIdx(i));
  214. gui->AddCtrl(listbox);
  215. slider=new hgeGUISlider(CMD_FAMILYSLIDER, 152, 44, 6, 128, texGui, 417, 177, 6, 6, true);
  216. slider->SetMode(0, (float)listbox->GetNumItems()-listbox->GetNumRows(), HGESLIDER_BAR);
  217. slider->SetValue(0);
  218. gui->AddCtrl(slider);
  219. range=new hgeGUIRange(CMD_CHARRANGE, 14, 266, 144, 144, 16, 16, 0x4D99FCD2);
  220. range->SetRange(state.sr.First, state.sr.Last);
  221. gui->AddCtrl(range);
  222. slider=new hgeGUISlider(CMD_FONTSIZE, 10, 219, 148, 6, texGui, 417, 177, 6, 6, false);
  223. slider->SetMode(5, 80, HGESLIDER_BAR);
  224. slider->SetValue((float)state.nSize);
  225. gui->AddCtrl(slider);
  226. text=new hgeGUIText(CMD_TFONTSIZE, 116, 205, 28, 12, fnt);
  227. text->SetMode(HGETEXT_RIGHT);
  228. text->printf("%d",state.nSize);
  229. gui->AddCtrl(text);
  230. }