Nuklear + ïŒãNuklear crossããšèªã¿ãŸãããã¯ãã¹ãã©ãããã©ãŒã Nuklearããæå³ããŸãïŒã¯ã Nuklear GUIã©ã€ãã©ãªã®ã¢ããªã³ã§ãåºåãã©ã€ããŒããæœè±¡åãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšå¯Ÿè©±ããããšãã§ããŸãã 1ã€ã®ç°¡åãªã³ãŒããèšè¿°ããå¿
èŠããããŸããããããã°ããµããŒããããŠãããã¹ãŠã®ãã©ãããã©ãŒã çšã«æ¢ã«ã³ã³ãã€ã«ã§ããŸãã
ãã§ã«ã Nuklear-ãã€ã¯ããããžã§ã¯ãã«çæ³çãªGUIïŒ ããšããhabrã«é¢ããèšäºãæžããŸããã ãã®åŸãã¿ã¹ã¯ã¯ç°¡åã§ãã-WindowsãšLinuxã§äŒŒããããªGUIãåããå°ããªã¯ãã¹ãã©ãããã©ãŒã ãŠãŒãã£ãªãã£ãäœæããŸããã ãããããã以æ¥ã質åã¯ç§ãææŸããŸããã§ããããNuklearã§å€å°è€éãªããšãããããšã¯å¯èœã§ããïŒ äœ¿çšããå®éã®ãããžã§ã¯ããå®å
šã«äœæããããšã¯å¯èœã§ããïŒ
Wordlase Webãã¢
ããããç§ã®æ¬¡ã®ã²ãŒã ã§ããWordlaseãçŽç²ãªNuklearã§è¡ã£ãçç±ã§ãã ãããŠããã«OpenGLãªãã§ã ç§ã®èæ¯ç»åã§ããnk_image
ånk_image
ã æçµçã«ãããã«ãããçŽç²ãªX11ãŸãã¯GDI +ãŸã§ã®ã¬ã³ããªã³ã°ãã©ã€ããŒãéžæã§ããããã«ãªããŸããã
ååã®èšäºã«æ»ã£ãŠãç§ã¯Nuklear +ã®åºç€ãç¯ããŸãããããã¯ãããã°ã©ããŒãããã¹ãŠã®ãæ±ãããé ããã€ã³ã¿ãŒãã§ãŒã¹ã®äœæã«éäžã§ããããã«èšèšãããã©ã€ãã©ãªãŒã§ãã ã©ã€ãã©ãªã¯ããã©ã³ããç»åãããŒããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãŠã£ã³ããŠãšã¬ã³ããªã³ã°ã³ã³ããã¹ããäœæã§ããŸãã
å®å
šãªã³ãŒãäŸã¯GitHubã®Readmeã«ãããŸã ã ããã§ãã³ãŒããéåžžã«åçŽã§ããããšãããããŸãã ãŸãã dxBin2hããã³nuklear-webdemoãããžã§ã¯ããNuklear +ã«è»¢éããŸããã ããã¯éåžžã«ç°¡åã§ããããã¹ãŠã®åæåã¯nkc_init
1åã®åŒã³åºãã«çœ®ãæããããã€ãã³ãã¯nkc_poll_events
ã«ãã£ãŠåŠçããã nkc_render
颿°ã«ãã£ãŠã¬ã³ããªã³ã°ããã nkc_render
ã¯ãã¹ãã©ã¯ã¿ãšããŠåŒã³åºãããŸãã

ããããWordlaseã«æ»ã£ãŠããã®åºçç©ãäœæãããäŸã«ã€ããŠèª¬æããŸãã æè¿ããã®ã²ãŒã ã«ã¯Webãã¢ããããŸãã ã²ãŒã çšã®ç¹å®ã®Webã³ãŒãã¯äœæããŸããã§ãããããã¯Emscriptenã䜿çšããŠã³ã³ãã€ã«ãããã¯ãªãŒã³ãªC89ã¢ããªã±ãŒã·ã§ã³ã§ãã Readme Nuklear +ã®äŸã«å®å
šã«åŸãïŒã€ãŸãã nkc_set_main_loop
䜿çšããïŒãšãWebããŒãžã§ã³ã®ã¢ããªã±ãŒã·ã§ã³ã¯è¿œå è²»çšãªãã§å®å
šã«ç¡æã«ãªããŸãã
ããã¯ãšã³ããšããã³ããšã³ã
Nuklear +ã®æãè峿·±ãéšåã¯ããµããŒããããŠããããã³ããšã³ããšããã¯ãšã³ãã§ãã ãã®å Žåãããã³ããšã³ããšã¯ãOSãšã®å¯Ÿè©±ãšãŠã£ã³ããŠã®ã¬ã³ããªã³ã°ãæ
åœããéšåãæããŸãã ããªãã¡ ãŠãŒã¶ãŒãçŽæ¥èŠããã®ã å®è£
ã¯nkc_frontendãã©ã«ããŒã«ãããŸãã çŸåšãµããŒããããŠããïŒSDLãGLFWãX11ãGDI +ã ãããã¯åçã§ã¯ãããŸããã ããšãã°ãGDI +ã¯ããã©ã³ãã®ã¬ã³ããªã³ã°ãç»åã®èªã¿èŸŒã¿ã«ãWinAPIã䜿çšããŸãã ä»ã®OSã§ãŸã£ããåãç»åãååŸããããšã«ã¯åé¡ããããŸãã å®è£
ãã©ãã§ãåãã§ã¯ãããŸããã ããšãã°ãX11å®è£
ã§ã¯ããã«ã¹ã¯ãªãŒã³ã¢ãŒãã§ç»é¢è§£å床ã倿Žããæ¹æ³ããŸã ããããŸããïŒãã«ãªã¯ãšã¹ãã衚瀺ãããã®ã¯å¬ããã§ãïŒ
ã¢ããªã±ãŒã·ã§ã³ã®ããã³ããšã³ãã®éžæã¯ç°¡åã§ããããªããã»ããµå€æ°NKCD=NKC_x
ãèšå®ããå¿
èŠããããŸãx
ã¯SDLãGLFWãXLIBãGDIPã®ããããã§ãã äŸïŒ gcc -DNKCD=NKC_GLFW main.c
ãã®å Žåã®ããã¯ãšã³ãã¯ãã¬ã³ããªã³ã°ãçŽæ¥å®è¡ããŸãã nuklear_driversãã©ã«ããŒã§ã®å®è£
ã OpenGLã®ä»»æã®ããŒãžã§ã³ã«ããã¬ã³ããªã³ã°ã¯ããã¹ãŠã®OSããã³ããã³ããšã³ãã§ã»ãŒåãç»åãçæããŸãã çµå±ã®ãšããã stb_imageã¯åžžã«ç»åã®ããŠã³ããŒãã«äœ¿çšããããã©ã³ãã¯æšæºã®NuklearããŒã«ïŒstbã«ãåºã¥ãïŒã䜿çšããŠã¬ã³ããªã³ã°ãããŸãã åæã«ãã¯ãªãŒã³ãªX11ãã©ã€ããŒã¯ãã©ã³ãã®ããŠã³ããŒãæ¹æ³ãããç¥ããŸããã ãããã£ãŠãéžæããããã¯ãšã³ããšããã³ããšã³ãã®ãã¢ã«å¯ŸããŠã¢ããªã±ãŒã·ã§ã³ããã¹ãããããšãå¿ããªãã§ãã ããã
äŸïŒ WordlaseãGLFW3ãOpenGL 2ãWindows

ãŸãã¯ïŒ WordlaseãSDL2ãOpenGL ESãLinux

å¯èœãªå Žåãããã©ã«ãã®ããã¯ãšã³ãã¯OpenGL2ã§ãã OpenGL 3ã§ã¯NKC_USE_OPENGL=NGL_ES2
3ãOpenGL ES 2.0ã§ã¯NKC_USE_OPENGL=NGL_ES2
ãèšå®ã§ããŸãã çŽç²ãªX11ã¬ã³ãã©ãŒã䜿çšããã«ã¯ã宿°NKC_USE_OPENGL
å¿
èŠNKC_USE_OPENGL
ãŸããã ãŸããOpenGLãªãã·ã§ã³ã¯GDI +ã«åœ±é¿ããŸãããã¬ã³ããªã³ã°ã¯åžžã«ç¬èªã®ææ®µã§è¡ãããŸãã
GDI +ã®ã¹ã¯ãªãŒã³ã·ã§ããã¯æ¬¡ã®ãšããã§ããWordlaseãGDI +ãOpenGLãªããWindows

ãã®ããã¯ãšã³ãã¯åéæã®ç»åãå®å
šã«ãµããŒãããç»åã¯å
ã®ç»åã«è¿ããªããŸãã ãã©ã³ãã®éãïŒãã³ããã¹ã ãŒãžã³ã°ãåäžãªãµã€ãºïŒGDI +ãã©ã³ãã®ãµã€ãºãstb_ttfã®ãµã€ãºã«èªåçã«èª¿æŽããããã«ããã«ãªã¯ãšã¹ããåãã§ããŸãïŒã
ææªã®å Žåã¯ãçŽç²ãªX11ã¬ã³ãã©ãŒã§ããããã¯ã ãã«ãªã¯ãšã¹ãã®åã¯åçãã¢ããããŒãããæ¹æ³ããç¥ããŸããã§ããã WordlaseãX11ãOpenGLãªããLinux ïŒ

ããã§ã¯ãããŽã倪éœå
ç·ã女ã®åã®ããã·ã£ãŒããªãšããžããã©ã³ããªã©ããã§ã«ããªãã®éãããããŸãã ãªãã§ïŒ ãªã³ã¶ãã©ã€ã§ã®ã²ãŒã ã®èæ¯ã¯ãããã€ãã®åéæã®PNGããçµã¿ç«ãŠãããŸãã ãã ããçŽç²ãªX11ã¯ãGIFãšåæ§ã«ãããééã®ã¿ããµããŒãããŸãã ãŸããX11ã¬ã³ãã©ãŒã¯ãéæåºŠã®ãã倧ããªç»åã§ã¯éåžžã«é
ãå®è¡ãããŸãã ãŸãããšã³ãžã³ã®éæåºŠããªãã«ãããšãç»åã¯ããã«æªåããŸãã WordlaseãX11ãOpenGLãªããéææ§ãªã ïŒ

ã§ã¯ãGDI +ãšX11ã®ã¬ã³ããªã³ã°ãrenderãã®ã«ãªãå¿
èŠãªã®ã§ããããïŒ ãªããªãããããã¯éæãªå€§ããªç»åã«å¯ŸããŠã®ã¿æªãããã§ãã ãŸããç»åããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ã¢ã€ã³ã³ãšããŠã®ã¿äœ¿çšãããå°ããªãŠãŒãã£ãªãã£ãäœæããå Žåããããã®ã¬ã³ãã©ãŒã¯éåžžã«è¯ããªãã·ã§ã³ã«ãªããŸãã æå°æ°ã®äŸåé¢ä¿ããããŸãã ãŸããOpenGLããœãããŠã§ã¢ã®ã¿ã®åŒ±ãã·ã¹ãã ã§ã¯ãçŽç²ãªX11ã¬ã³ãã©ãŒã䜿çšããŸããã ãã®å ŽåãX11ã¯OpenGLãããé«éã§ãã ãã³ãïŒåéæã®PNGã®ããŒãã®ä»£ããã«1ã€ã®å€§ããªJPEGã䜿çšãããšãX11ã¯è¿
éãã€æ£ããåäœããŸãã
çŽç²ãªX11ããã¯ãšã³ãã®é©åãªäœ¿çšäŸã¯ãã¡ã€ã³ã®Wordlaseã²ãŒã ãŠã£ã³ããŠã§ãã 倧ããªç»åã¯ã»ãšãã©ãããŸããããæ£ãã衚瀺ãããã€ã³ã¿ãŒãã§ã€ã¹ã¢ã€ã³ã³ãããã€ããããŸãã

OKãåŒãåºããéžæãããOSãŠã£ã³ããŠãäœæãããŸãã GUIãå®è¡ããæãæ¥ãŸããïŒ
Nuklearããã
Wordlaseã®æåã®ãã®ã«ã¯ãèšèªéžæç»é¢ã衚瀺ãããŸãã

ããã§ã¯ã2ã€ã®è峿·±ããã¯ããã¯ãäžåºŠã«èŠãããšãã§ããŸãããŠã£ã³ããŠã®èæ¯ã«ããããã€ãã®ç»åãšããŠã£ãžã§ããã®äžå€®æãã§ãã
ãŠã£ã³ããŠã®èæ¯ã«ç»åãé
眮ããã®ã¯éåžžã«ç°¡åã§ãã
nk_layout_space_push(ctx, nk_rect(x, y, width, height))
x
ãšy
ç»é¢äžã®äœçœ®ã width
ãšheight
-ç»åã®å¯žæ³ã
ã»ã³ã¿ãªã³ã°ã¯ããå°é£ã§ã Nuklearã§ã¯çŽæ¥ãµããŒããããŠããŸããã èªåã§äœçœ®ãèšç®ããå¿
èŠããããŸãã
if ( nk_begin(ctx, WIN_TITLE, nk_rect(0, 0, winWidth, winHeight), NK_WINDOW_NO_SCROLLBAR) ) { int i; static const float ratio[] = {0.2f, 0.6f, 0.2f}; nk_layout_row_static(ctx, (winHeight - (BUTTON_HEIGHT+VSPACE_SKIP)*langCount )/2, 15, 1 ); nk_layout_row(ctx, NK_DYNAMIC, BUTTON_HEIGHT, 3, ratio); for(i=0; i<langCount; i++){ nk_spacing(ctx, 1); if( nk_button_image_label(ctx, image, caption, NK_TEXT_CENTERED) ){ loadLang(nkcHandle, ctx, i); } nk_spacing(ctx, 1); } } nk_end(ctx);
次ã®ã¯ãŒã«ãªããš-èšå®ã§ã®ããŒãã®éžæïŒ

ãŸããåçŽã«å®è£
ãããŸãïŒ
if (nk_combo_begin_color(ctx, themeColors[s.curTheme], nk_vec2(nk_widget_width(ctx), (LINE_HEIGHT+5)*WTHEME_COUNT) ) ){ int i; nk_layout_row_dynamic(ctx, LINE_HEIGHT, 1); for(i=0; i<WTHEME_COUNT; i++) if( nk_button_color(ctx, themeColors[i]) ){ nk_combo_close(ctx); changeGUItheme(nkcHandle, s.curTheme); } nk_combo_end(ctx); }
ããã§çè§£ãã¹ãäž»ãªããšã¯ãã³ã³ããããã¢ãããã£ãŒã«ããã¡ã€ã³ãŠã£ã³ããŠãšåããŠã£ã³ããŠã§ããããšã§ãã ããã«ã¯äœã§ããããŸãã
æãé£ãããŠã£ã³ããŠã¯ã¡ã€ã³ã²ãŒã ãŠã£ã³ããŠã§ãã

å®éãè€éãªããšãäœããããŸããã ç»é¢ã«ã¯4è¡ãããããŸããã
- ã¬ãã«éžæã®ããæäžè¡ïŒ
nk_property_int
ãŠã£ãžã§ããïŒ - åèªãªã¹ãïŒ
nk_group_scrolled
ïŒ - çŸåšã®åèªã®ãã¿ã³
- ããŒã«ãããã©ã€ã³
ããã§çè§£ã§ããªãå¯äžã®ç¬éã¯ãèŠçŽ ã®æ£ç¢ºãªå¯žæ³ãèšå®ããããšã§ãã ããã¯ãã·ãªãŒãºã®æ¯çã䜿çšããŠè¡ãããŸãã
float ratio[] = { (float)BUTTON_HEIGHT/winWidth, (float)BUTTON_HEIGHT/winWidth, (float)topWordSpace/winWidth, (float)WORD_WIDTH/winWidth }; nk_layout_row(ctx, NK_DYNAMIC, BUTTON_HEIGHT, 4, ratio);
BUTTON_HEIGHT
ããã³WORD_WIDTH
ãã¯ã»ã«ã§æž¬å®ããã宿°ã topWordSpace
ãç»é¢ã®å¹
ããä»ã®ãã¹ãŠã®èŠçŽ ã®å¹
ãåŒãããã®ãšããŠèšç®ãããŸãã
æåŸã«æ³šæãå¿
èŠãªãŠã£ã³ããŠã¯çµ±èšã§ãã

èŠçŽ ã®é
眮ã¯ã°ã«ãŒãåã«ãã£ãŠèŠå¶ãããŸãã çµå±ã®ãšãããããªãã¯ãã€ã§ãNuklearãšèšãããšãã§ããŸãïŒããã®è¡ã«ã¯2ã€ã®ãŠã£ãžã§ããããããŸããã ããããã°ã«ãŒãã¯ãŠã£ãžã§ããã§ããããŸãã ããªãã¡ nk_group_begin
ãšnk_group_end
ã䜿çšããŠåçŽã«ã°ã«ãŒããäœæããéåžžã®ãŠã£ã³ããŠïŒ nk_layout_row
ãªã©ïŒå
ã«nk_group_end
ãé
眮ã§ãnk_group_end
ã
ãããã«
Nuklearã¯ãåžè²©ã®ã²ãŒã ãã¢ããªã±ãŒã·ã§ã³ã«ã察å¿ããŠããŸãã Nuklear +ã¯ãäœæãããæ¥œããããããšãã§ããŸãã
䟿å©ãªãªã³ã¯