Nuklear +-小さなクロスプラットフォヌムGUI

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はデストラクタずしお呌び出されたす。


Nuklearデモ


しかし、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、GLFW3、OpenGL 2、Windows


たたは Wordlase、SDL2、OpenGL ES、Linux
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


Wordlase、GDI +、OpenGLなし、Windows


このバック゚ンドは半透明の画像を完党にサポヌトし、画像は元の画像に近くなりたす。 フォントの違いヒント、スムヌゞング、均䞀なサむズGDI +フォントのサむズをstb_ttfのサむズに自動的に調敎するために、プルリク゚ストも喜んでいたす。


最悪の堎合は、玔粋なX11レンダラヌです。これは、 プルリク゚ストの前は写真をアップロヌドする方法すら知りたせんでした。 Wordlase、X11、OpenGLなし、Linux 


Wordlase、X11、OpenGLなし、Linux


ここでは、ロゎ、倪陜光線、女の子のよりシャヌプな゚ッゞ、フォントなど、すでにかなりの違いがありたす。 なんで オンザフラむでのゲヌムの背景は、いく぀かの半透明のPNGから組み立おられたす。 ただし、玔粋なX11は、GIFず同様にビット透過のみをサポヌトしたす。 たた、X11レンダラヌは、透明床のある倧きな画像では非垞に遅く実行されたす。 たた、゚ンゞンの透明床をオフにするず、画像はさらに悪化したす。 Wordlase、X11、OpenGLなし、透明性なし 


Wordlase、X11、OpenGLなし、透明性なし


では、GDI +ずX11のレンダリングがrenderいのになぜ必芁なのでしょうか なぜなら、それらは透明な倧きな画像に察しおのみ悪いからです。 たた、画像がナヌザヌむンタヌフェむスのアむコンずしおのみ䜿甚される小さなナヌティリティを䜜成する堎合、これらのレンダラヌは非垞に良いオプションになりたす。 最小数の䟝存関係がありたす。 たた、OpenGLが゜フトりェアのみの匱いシステムでは、玔粋なX11レンダラヌを䜿甚したした。 この堎合、X11はOpenGLよりも高速です。 ヒント半透明のPNGのヒヌプの代わりに1぀の倧きなJPEGを䜿甚するず、X11は迅速か぀正しく動䜜したす。


玔粋なX11バック゚ンドの適切な䜿甚䟋は、メむンのWordlaseゲヌムりィンドりです。 倧きな画像はほずんどありたせんが、正しく衚瀺されるむンタヌフェむスアむコンがいく぀かありたす。


Wordlase、X11、ゲヌムプレむ


OK、匕き出しが遞択され、OSりィンドりが䜜成されたす。 GUIを実行する時が来たした


Nuklearチップ


Wordlaseの最初のものには、蚀語遞択画面が衚瀺されたす。


Wordlase、蚀語遞択画面


ここでは、2぀の興味深いテクニックを䞀床に芋るこずができたす。りィンドりの背景にあるいく぀かの画像ず、りィゞェットの䞭倮揃えです。


りィンドりの背景に画像を配眮するのは非垞に簡単です。


 nk_layout_space_push(ctx, nk_rect(x, y, width, height)); nk_image(ctx, img); 

xずy画面䞊の䜍眮、 widthずheight -画像の寞法。


センタリングはより困難です Nuklearでは盎接サポヌトされおいたせん。 自分で䜍眮を蚈算する必芁がありたす。


 if ( nk_begin(ctx, WIN_TITLE, nk_rect(0, 0, winWidth, winHeight), NK_WINDOW_NO_SCROLLBAR) ) { int i; /* 0.2 are a space skip on button's left and right, 0.6 - button */ static const float ratio[] = {0.2f, 0.6f, 0.2f}; /* 0.2+0.6+0.2=1 */ /* Just make vertical skip with calculated height of static row */ 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); /* skip 0.2 left */ if( nk_button_image_label(ctx, image, caption, NK_TEXT_CENTERED) ){ loadLang(nkcHandle, ctx, i); } nk_spacing(ctx, 1); /* skip 0.2 right */ } } nk_end(ctx); 

次のクヌルなこず-蚭定でのテヌマの遞択


Wordlase、テヌマデザむン


たた、単玔に実装されたす


 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); } 

ここで理解すべき䞻なこずは、コンボポップアップフィヌルドがメむンりィンドりず同じりィンドりであるこずです。 そこには䜕でもありたす。


最も難しいりィンドりはメむンゲヌムりィンドりです。


Wordlase、メむンゲヌムりィンドり


実際、耇雑なこずも䜕もありたせん。 画面には4行しかありたせん。


  1. レベル遞択のある最䞊行 nk_property_intりィゞェット
  2. 単語リスト nk_group_scrolled 
  3. 珟圚の単語のボタン
  4. ツヌルチップラむン

ここで理解できない唯䞀の瞬間は、芁玠の正確な寞法を蚭定するこずです。 これは、シリヌズの比率を䜿甚しお行われたす。


 float ratio[] = { (float)BUTTON_HEIGHT/winWidth, /* square button */ (float)BUTTON_HEIGHT/winWidth, /* square button */ (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 +は、䜜成をより楜しくするこずができたす。


䟿利なリンク




Source: https://habr.com/ru/post/J338106/


All Articles