dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Ļoti vienkāršs GUI kods.
Goto page 1, 2  Next
 
dev.gamez.lv Forum Index -> Grafikas programmēšana un teorija
View previous topic :: View next topic  

Vai tevi interesē apskatīt / lietot šādu GUI sistēmu?
Jā.
20%
 20%  [ 1 ]
Nē, ir cita (nosaukšu savu alternatīvu).
80%
 80%  [ 4 ]
Nē, GUI man vispār nevajag.
0%
 0%  [ 0 ]
Total Votes : 5

Author Message
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Mon Jun 07, 2010 10:05 pm    Post subject: Ļoti vienkāršs GUI kods.

Man te ir viena tāda GUI programma izveidota, kurai kods ir ļoti ērti pārnesams uz gandrīz jebkuru programmu + ir OpenGL renderētāja implementācija.
Jautājums ir šāds: vai tevi interesētu apskatīt vai pat lietot šo kodu?

Apskatīties, kā strādā, var ar šo programmu:
http://yy.lv/download.php?f=133419

To, kā izskatās, var redzēt šeit:
http://snake5.wordpress.com/2010/06/07/gui-ievietots/
http://snake5.wordpress.com/2010/06/06/gui-uzlabojumi/

Diezgan daudz tehniskās informācijas šeit:
http://snake5.wordpress.com/2010/06/06/supergluks/

Īsumā par visu:
-Gludas pārejas no redzamības un neredzamības režīmiem (kas nenozīmē tikai caurspīdīgumu, bet pilnīgi jebko - kaut vai 100 kustīgus kvadrātus, ja ir vēlēšanās ko tādu mēģināt uzkodēt).
-Izveidoti jau daudzi GUI Objektu veidi, Gunplay versijā strādā gandrīz perfekti (ja nevienu neinteresēs GUI kods, divreiz padomāšu, vai pārnest labojumus arī uz veco versiju).
-Daudz lietots STL.
-Nav problēmu integrēt jebkur.
-Pamatkodā iebūvēts viss, kas nepieciešams gandrīz jebkāda veida GUI objekta izveidošanai.
-Var objektu apstrādes laikā (OnEvent callback'ā) pievienot jaunus GUI objektus.
Problēmas:
-Pagaidām ir kaut kas ar ātrdarbību vienā vietā, bet gan jau tur pamatā ir viena trekna kļūda, kuru noteikti atradīšu un pārnest uz veco versiju būs vēlēšanās, ja citiem interesēs šis GUI kods...

Kā paraugu varu ielikt GUI objektu menedžera kodu:
Code:

#pragma once
#include <map>
#include "Control.h"


typedef std::multimap< u32, SGUIControl* > CIDMap;

struct SGUIManager
{
   // Creation
   SGUIManager( const pVec& InitialSize, IGUIRenderInterface* InitialGRI );
   ~SGUIManager();

   // Usage
   SGUIControl* AddControl( SGUIControl* Ctrl, const u32 ID, IGUICallback* Owner );
   void RemoveControl( SGUIControl* Ctrl );
   void RemoveControls( const u32 ID );
   void RemoveAllControls();
   void RemoveChildren( SGUIControl* Ctrl );
   void RemoveCreatorControls( IGUICallback* Owner );
   SGUIControl* Find( const u32 ID );

   // Access / events / interaction
   void CursorMove( const pVec& pt );
   void KeyInput( const u32 Key, const bool NewState );
   void CharInput( const char C, const bool NewState );
   void Tick( const f32 DeltaTime );

   // Rendering
   void Draw();

   // Internal utilities
   void SkipChildren( ControlList::iterator& it );
   bool IsVisible( SGUIControl* Ctrl, const pVec& pt );
   void SetFocus( SGUIControl* Ctrl );

   // Internals
   IGUIRenderInterface*         GRI;
   CIDMap               CtrlMap;
   ControlList            Controls;
   SGUIControl*         FocusCtrl;
   pVec               CursorPos;
   pVec               NewCursorPos;
};

_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle


Last edited by snake5 on Tue Jun 08, 2010 10:46 am; edited 1 time in total
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Mon Jun 07, 2010 11:47 pm    Post subject:

Man ļoti nepatīk callbacki ar interfeisiem. Īpaši GUI kodā.
Daudz C++'iskāk ir lietot funktorus. Ar tiem ir ideāls couplings, tb ļoti maza atkarība vienam no otra.
boost::bind + boost::function ir viena potenciālā implementācija.
Šeit cita: http://www.codeproject.com/KB/cpp/ImpossiblyFastCppDelegate.aspx

Un GUI sistēmu būvēt WinAPI stilā (ar konteineriem, child-kontroļiem), man škiet novecojis veids. Gan potenciālo kļūdu ziņā, gan resursu izmantošanas ziņā. Pat Microsoft's .NET'am 3.5 (2007 gadā) ieviesa pavisam jaunu GUI būvēšanas veidu WPF, vecā WinAPI'isko WinForm'u vietā.

Manā skatījumā spēlēm diezgan elegants ir immediate-mode GUI princips:
http://mollyrocket.com/861
http://www.mollyrocket.com/forums/viewforum.php?f=10
http://www.johno.se/book/imgui.html
http://sol.gfxile.net/imgui/
http://code.google.com/p/nvidia-widgets/ <-- gatavs IMGUI toolkits, kas ļauj piesaistīt jebkādu renderēšanas backendu vai inputa mehānismu.

Tavs SGUIManager neievēro Rule of three principu. Tādējādi tas ir liels potenciāla buga sakne. Pieņemu, ka ar pārējām klasēm varētu būt līdzīgi.
Pie tam - publiskas padarīt internālas lietas (Internal utilities // Internals) ir neprātīgi.

P.S. Ja gribi publicēt kodu, tad iesaku kādu distributētu versiju kontroles sistēmu. Git vai Mercurial. Tad varēsi savu kodu publiski nohostēt (bezmaksas) github'ā vai bitbucket'ā, vai citur. Un cilvēki laimīgi varēs vai nu iesūtīt tev patčus/uzlabojumus, vai arī nofork'ot kodu saviem mērķiem/spēlēm eleganti turpinot dabūt uzlabojumus no oriģinālā koda repozitorija.
Back to top
View user's profile Send e-mail
nai



Joined: 20 Dec 2006
Posts: 48

PostPosted: Tue Jun 08, 2010 12:43 am    Post subject:

Droši vien lietotu CEGUI nevis kaut ko apšaubāmas izcelsmes.

Internāļiem ir jābūt privātiem, ideālā gadījumā pat nevajadzētu būt redzamiem, lai neuzliktu papildus, iespējams nevajadzīgus, dependencijus klases lietotājiem, lietojot pimpl idiomu (tūlīt kāds brēks par performances penalitijiem).

IMGUI pamatprincips ir kaut kas, ko es pats esmu lietojis, kad ir bijusi vajadzība ātri uztaisīt vienkāršu UI(piemēram, minigc), taču nekad īpaši nebiju to mēģinājis bīdīt tālāk un palasot bubu padotos linkus, jānonāk pie secinājuma, ka tas patiešām ir vienkāršs un elegants veids kā spēlēm programmēt UI.


Last edited by nai on Tue Jun 08, 2010 1:08 am; edited 1 time in total
Back to top
View user's profile
DeRatizators



Joined: 27 Apr 2006
Posts: 492

PostPosted: Tue Jun 08, 2010 12:51 am    Post subject:

Nezinu, ko tur bubu ieraudzīja, bet callbacki var buut pavisam ok, ja pats user interfeiss ir balstīts uz kādiem dzelžainiem principiem (piemēram, tie tiek organizēti kokā, tiem vienmēr ir izmēri un tml.)

Man gan škiet ka "immediate-mode" GUI ir stipri overrated. C'mon, visos UI api, ko man nācies izmantot ir bijusi kāda kopīga zīmēšanas funkcija, kur varēja zīmēt dajebko un likt pārzīmēt, cik reizes gribi Smile

Funktori gan ir derīga lieta. Patreiz šo-to rakstu izmantojot Nokia QT un tur ir līdzīga funkcionalitāte. Diezgan ērti.
Pretstatā manā darbavietā izmantotajam TIBCO GI, kur tas ir realizēts mega-pretīgi un tikai rada milzīgu putru Smile
_________________
Any PANCAKE has to be long and thin and short and fat. Not to mention being an excellent insulator and a superb conductor.
Back to top
View user's profile
nai



Joined: 20 Dec 2006
Posts: 48

PostPosted: Tue Jun 08, 2010 1:12 am    Post subject:

DeRatizators wrote:
Man gan škiet ka "immediate-mode" GUI ir stipri overrated. C'mon, visos UI api, ko man nācies izmantot ir bijusi kāda kopīga zīmēšanas funkcija, kur varēja zīmēt dajebko un likt pārzīmēt, cik reizes gribi Smile


IMGUI izskatās kā perfekts solution mazām-vidēja izmēra indie spēlēm.

Es lieku lielu uzsvaru uz lietošanas ērtumu, vienkāršumu un to, cik ātri to var dabūt gatavu.
Back to top
View user's profile
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Tue Jun 08, 2010 1:30 am    Post subject:

Mani arī kaut kā immediate-mode GUI nespēja pārliecināt. Iespējams, tāpēc, ka visu mūžu esmu stradajis ar callbackiem, bet, iespējams, tāpēc, ka parasti patīk dažādi efekti, kurus vienkārši ar 2 steitiem nepanāksi. Man tomēr patīk, ja man atnāk eventi - double click, mouse down, mouse up, mouse over, mouse out, drag, utt., ar kuriem es jau varu operēt pēc vajadzības. Pie tam, kaut kad sen atpakaļ biju pētījis to immediate-mode GUI kā alternatīvu, bet tas baigi izklausījās pēc viena gara, neglīta makarona, kas man galīgi pie sirds neiet.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Tue Jun 08, 2010 2:15 am    Post subject:

Quote:
Pie tam - publiskas padarīt internālas lietas (Internal utilities // Internals) ir neprātīgi.

Tie dažreiz palīdz ērtāk strādāt ar GUI objektiem no ārpuses, neveidojot visu laiku jaunas funkcijas esošajā API.
Quote:
ieviesa pavisam jaunu GUI būvēšanas veidu WPF

Kā tad tas satur kopā GUI objektus?
Quote:
Tādējādi tas ir liels potenciāla buga sakne.

Ja domā šo - http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)
tad diez vai. Šo menedžeri jāuztaisa un jādzēš tāpat kā gandrīz jebkuru citu API - uztaisa startējot, izdzēš izejot. Kopēt neko nevajag.
Quote:
Droši vien lietotu CEGUI nevis kaut ko apšaubāmas izcelsmes.

Varbūt tad, kad parādīšu, kā šis GUI tiek lietots, domas mainīsies.. Razz
GUI sistēma atļauj gan rakstīt labu kodu, gan ātri rakstīt kodu. :D

Visas šīs sistēmas ideja ir tāda, ka var ātri izveidot gandrīz jebko, tāpēc nebūs jāpārtaisa API.
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Tue Jun 08, 2010 8:25 am    Post subject:

Quote:
ie dažreiz palīdz ērtāk strādāt ar GUI objektiem no ārpuses, neveidojot visu laiku jaunas funkcijas esošajā API.

Dažreiz - jā. Bet bieži vien tas palīdz ātri panākt bugainas situācijas.

snake5 wrote:

Ja domā šo - http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)
tad diez vai. Šo menedžeri jāuztaisa un jādzēš tāpat kā gandrīz jebkuru citu API - uztaisa startējot, izdzēš izejot. Kopēt neko nevajag.

Jā es domāju tieši to.
Iedomājies kodu:
Code:
{
    SGUIManager manager = SGUIManager(...);
    SGUIManager manager2 = manager; // netīšām, vai arī netīšām! tiek padots funkcijai pēc vērtības, nevis references
    ...
} // tavuprāt šeit kods nekrašos?

Rule of three tieši to arī nodrošina - ka netīšām nenotiks krašs. Tavas, vai citu neuzmanības dēļ. Daudz, daudz, daudz labāk ir paļauties uz kompilatoru, lai tas noķer un parāda kļūdas kompilēšanas laikā (piemēram copy konstruktora neesamību), nevis paļauties uz cilvēku, ka tas neuzraksta kļūdainu kodu un pēc tam debugot runtaimā.

Nevajag arī domāt, ka IMGUI domāts tikai vienkāršam softam. Cik, zinu tad werkkzeug demoscēnu tekstūru ģenerētājs ir viss uzrakstīts ar IMGUI principu: http://www.werkkzeug.com/downloads/

Quote:
C'mon, visos UI api, ko man nācies izmantot ir bijusi kāda kopīga zīmēšanas funkcija, kur varēja zīmēt dajebko un likt pārzīmēt, cik reizes gribi :)

IMGUI tādu funkciju neaizliedz, un tādu mierīgi var implementēt.

Jā, tas Qt ir labs piemērs kur sloti/signāli ir efektīvi pielietoti. Man gan personīgi nepatīk tā visa moc padarīšana ar C++ koda pseidosintaksi un pre-apstrādi, bet nu uz to var pievērt acis.
Back to top
View user's profile Send e-mail
serioussam909



Joined: 15 May 2006
Posts: 92

PostPosted: Tue Jun 08, 2010 9:45 am    Post subject:

Nesaprotu kāpēc vispār vajag kkādus gui managerus.
Var taču vienkārši likt GUI elementus virsū tam GameScreenam kuru vajag un miers.
Un kādas problēmas likt tiem elementiem pašiem sevi menedžēt?
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Tue Jun 08, 2010 9:59 am    Post subject:

serioussam909: Ne visi programmē XNA freimworkā.
Un par kādu menedžēšanu tu runā?
Back to top
View user's profile Send e-mail
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Tue Jun 08, 2010 10:45 am    Post subject:

Menedžeris satur kopā visu informāciju par GUI objektiem, lai tas nebūtu jādara manuāli. Apskatījies to, kā šis GUI strādā un ko ar to var izdarīt.
Quote:
Rule of three tieši to arī nodrošina - ka netīšām nenotiks krašs.

OK, šo es varu drīz salabot. :P

P.S. Biju aizmirsis par Demo link'u, pirmajā post'ā tagad būs.

EDIT: Par IMGUI runājot.. šeit (ar manām vajadzībām) to nevarētu tik vienkārši implementēt tāpēc, ka šis GUI veidots tā, lai netraucētu atdalīt Update un Render funkcijas. Pietam, grūti ir iedomāties IMGUI ar labi kontrolētām pārejām no redzamības un neredzamības režīmiem.
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
serioussam909



Joined: 15 May 2006
Posts: 92

PostPosted: Tue Jun 08, 2010 12:43 pm    Post subject:

Quote:
Ne visi programmē XNA freimworkā

Gamescreeniem nav nekāda sakara ar XNA.
Tas ir vienkārši objekts kas satur elementus kas tiks parādīti uz ekrāna.
Normāli to izveidojot nav starpības kas uz tā atrodas GUI elementi, gameplay, video utt...
Quote:

Pietam, grūti ir iedomāties IMGUI ar labi kontrolētām pārejām no redzamības un neredzamības režīmiem.

Jebkurā normālā dzinējā taču jātaisa atdalītas Update un Render f-jas visiem objektiem kam tās vajag - gui elementi nav nekas atšķirīgs no pārējiem.
Nezinu kādas problēmas ir uztaisīt laikā mainīgu opacity/alpha/whatever vērtību.
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Tue Jun 08, 2010 1:18 pm    Post subject:

serioussam909 wrote:
Quote:

Pietam, grūti ir iedomāties IMGUI ar labi kontrolētām pārejām no redzamības un neredzamības režīmiem.

Nezinu kādas problēmas ir uztaisīt laikā mainīgu opacity/alpha/whatever vērtību.

Tieši tā - kur problēma papildus mainīgajam alfai?

Quote:
Jebkurā normālā dzinējā taču jātaisa atdalītas Update un Render f-jas visiem objektiem kam tās vajag - gui elementi nav nekas atšķirīgs no pārējiem.

IMGUI galvenā priekšrocība tieši ir tāda, ka nav nekas jāatdala - viss ir vienuviet. Parastā GUI, vienmēr tie gui komponenti jāglabā kautkur. Vienmēr to stāvoklis jāsinhronizē ar tavas spēles objektiem. IMGUI visu šo dara vienuviet - pie "renderēšanas". Un stāvoklis jāglabā tikai vienuviet - tavos komponentos, kas zin to izmantot. Mazāks cohesion = win!
"Renderēšana" pēdiņās, jo tai ne uzreiz ir jāveic renderēšana, jo tā apstrādā arī gui updeitus. Protams to "renderešanu" var taisīt netiešu - "renderējot" tiek pieglabāts ko un kur zīmēt, un tikai pašās beigās tiek izsaukta poligonu zīmēšanas funkcionalitāte. Tās jau ir implementācijas detaļas.
Apskati to video pirmajā linkā, ko devu. Tur viss skaidri un saprotami izstāstīts.
Back to top
View user's profile Send e-mail
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Tue Jun 08, 2010 2:21 pm    Post subject:

Quote:
Tieši tā - kur problēma papildus mainīgajam alfai?

Problēmas tur nav, bet nevar nokontrolēt precīzi, kad taisīt pāreju, kad to negaidīti apturēt - nav zināms nekas par GUI objektiem izņemot to, ka tādi ir. Nevar pat garantēt, ka nākamajā kadrā visi GUI objekti būs tajās pašās vietās. Var jau iedot ID katram objektam, bet tā ir laba vieta, kur pulcēties kļūdām.
Quote:
Tas ir vienkārši objekts kas satur elementus kas tiks parādīti uz ekrāna.
Normāli to izveidojot nav starpības kas uz tā atrodas GUI elementi, gameplay, video utt...

Manuprāt šausmīgi nepareiza pieeja - visu veidot tik universālu, ka var visu glabāt vienā masīvā. Ja būtu masīvs ar iespēju to ideāli apstrādāt -- ievietot elementu jebkur - konstants laiks, atrast - konstants laiks, izbraukt cauri visiem objektiem, lai izvēlētos vajadzīgos - tikai tik daudz, cik uz katra vajadzīgā iztērē -- tad varētu. Bet ja sāk katru sīku elementu glabāt tajā objektu masīvā pilnīgā nekārtībā, tad sanāk šausmīgi labs FPS ēdājs. :D

EDIT:
Quote:
Parastā GUI, vienmēr tie gui komponenti jāglabā kautkur. Vienmēr to stāvoklis jāsinhronizē ar tavas spēles objektiem.

Šajā nav gluži tā. Vienkārši uztaisi, iedodot īpašnieku un ID. Īpašnieka callback'ā apstrādā notikumus (ja nepatīk tā, var wrap'ot callbacku tā, ka viņš režīmus savāc, lai varētu tos lietot tikpat vienkāršām pārbaudēm kā "if( DoButton( blah, blah ) )" lielākajā daļā situāciju). Kad visi piederīgie objekti jāizdzēš, lietojam "RemoveCreatorControls( Owner )" un viss ir iztīrīts.
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
nai



Joined: 20 Dec 2006
Posts: 48

PostPosted: Tue Jun 08, 2010 3:50 pm    Post subject:

Protams, ka IMGUI ir trūkumi, taču piemēram tāds milzis kā Unity arī izmanto IMGUI (http://www.mollyrocket.com/forums/viewtopic.php?t=721&sid=1b7ed8263c7d1f595cd5451f45601a76). Un unity interfeiss nav netuvu triviāls vai vienkāršs.

No agrāk redzēta koda es tagad atceros, ka sfxr arī izmanto IMGUI principu, kods gan sfxr'am ir tāds smagi hands-on Cisks, taču tur ar diezgan nelielu apjomu Ciska koda tiek implementēts burvīgs toolis.
Back to top
View user's profile
Display posts from previous:   
dev.gamez.lv Forum Index -> Grafikas programmēšana un teorija All times are GMT + 2 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group