[ Príspevkov: 24 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.11.14
Prihlásený: 04.08.15
Príspevky: 27
Témy: 3 | 3
NapísalOffline : 21.04.2015 3:10 | C++/SFML/OpenGL

Zdravím,

mohol by mi niekto poradiť, či existuje spôsob ako v C++ donútiť nejaký kontajner, napr. std::vector<T> správať sa "multitypovo" ? napr ... std::vector<any_type>

Mám na mysli rôzne typy, vrátane mojich štruktúr a objektov tried. Snažím sa naprogramovať kompletné GUI a chcem objekt napr. z class Okno, ktorý bude uchovávať v poli všetky štruktúry čo sa v ňom nachádzajú, napr. Button, Checkbox, ScrollBar a pod.

Skúšal som template kombinovať s dedičnosťou abstraktnej nadtriedy, no mal problém s pamäťou - segmentation error. Akoby si nevedel vyhradiť dostatočné miesto pre kontajner plný neznámych typov. Navyše template by problém podľa mňa neriešil, keďže nepotrebujem kontajner plný neznámeho typu toho istého druhu, ale rôznych druhov

cca by som si to predstavoval takto: std::vector<BeriemVsetko> v;
v.push_back(GUI::Button b);
v.push_back(GUI::Label l);

for iter std::...... it = v.begin .......
window.draw(*it->getSelfTexture());

... alebo akakolvek ina manipulacia okrem .draw(), napr .setPos(px, py) aby fungovala a tie objekty tam skutočne boli.

Uprednostnil by som riešenia mimo knižníc, projekt mám obkecať u vedúceho a bol by celkom trapas keby som mu tam 2 hodiny konfiguroval IDE :D


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 21.04.2015 6:55 | C++/SFML/OpenGL

Taký kontajner neexistuje a ani nemôže. Dalo by sa to v Cčku ohackovať, ale to je veľmi hlúpe.

Presne na toto máme dedičnosť. Nauč sa ju poriadne používať. Správne sa to rieši tým abstraktným nadtypom.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.11.14
Prihlásený: 04.08.15
Príspevky: 27
Témy: 3 | 3
Napísal autor témyOffline : 21.04.2015 13:54 | C++/SFML/OpenGL

Nad dedičnosťou som rozmýšlal. Stačí keď vytvorím triedu napr class GUI::Base ktorá bude mať iba ctor a dtor a od ňej odvádzať Button, Label ... ? V sfml tie komponenty okrem pozície nemajú nič spoločné, aj metódy na nastavenie pozícií sa volajú občas inak. Síce ich spoločná nadtrieda je sf::Drawable, ale nefungovalo to dobre cez ňu, navyše potrebujem tie štruktúry zabaliť do vlastných tried, pretože class Button obsahuje sf::Sprite norm, sf::Sprite focus ... teda po nabehnutí myšou na Button sa *current nastaví na aktuálny Sprite a ten sa renderuje.

Potom by mohol fungovať vyššie uvedený príklad v prípade že vytvorím std::vector<GUI::Base> ? Teda keď vytvorím triedu GUI::BASE - (GUI::VsetkoOstatne)

Ešte ma napadlo vec ktorá sa mi vygoogliť nepodarila: v C++ je možnošt volať z objektu funkciu ? napr button.onclick(nieco_vykonaj());
Nakódiť to viem takým brute-force štýlom, ale rád by som to skúsil elegantnejšie.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 21.04.2015 17:56 | C++/SFML/OpenGL

Misosvk píše:
V sfml tie komponenty okrem pozície nemajú nič spoločné, aj metódy na nastavenie pozícií sa volajú občas inak.

Akože nemajú nič spoločné, majú spoločné veľa! Všetko sú to prvky GUI a tie majú určite pozíciu, veľkosť, textúru, prípadne ďalšie vnorené prvky. Všetky okienkové frameworky fungujú takto, takže si nenahováraj, že sa to nedá ;)
Kód:
class Element
{
private:
  sf::Sprite sprite;
  sf::Texture texture;

protected:
  virtual Element() { ... }
  virtual ~Element() { ... }
  virtual setSprite( string filename ) { ... }
  //... a cokolvek dalsie pre pristup z oddedenych prvkov

public:
  virtual setPosition( int x, int y ) { ... }
  virtual setSize( int w, int h ) { ... }
};

Uvedom si, že ty nemusíš volať setPosition priamo od sfml objektu, ale si môžeš urobiť svoju vlastnú setPosition - a vlastne všetko by si si mal urobiť vlastné tak, ako sám potrebuješ. Vo výsledku by si vôbec nemal obsluhovať sfml, to by malo byť úplne oddelené ďaleko vzadu. Pri tvorbe a obsluhe GUI by si mal volať len vlastné metódy.


Ďalej - ten onclick sa dá urobiť cez ukazatele na funkcie (pointer to function, v tomto pripade pointer to method/member function). Viac sa dočítaj napr tu http://www.codeguru.com/cpp/cpp/article.php/c17401/C-Tutorial-PointertoMember-Function.htm


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.11.14
Prihlásený: 04.08.15
Príspevky: 27
Témy: 3 | 3
Napísal autor témyOffline : 21.04.2015 19:09 | C++/SFML/OpenGL

ja som sa spiekol na protected, preto mi to nešlo. V c++ su protected metódy dedené, ja som ich dával do private odkial už nemá podtrieda k nim prístup aaach :D Ďakujem za pomoc.

a tým že nemajú moc spoločného som myslel skôr, že keď vytvorím Label, ktorý drží nejaký sf::Text, a Button, ktorý zas 3x sf::Texture + 3x Sprite, že také metódy ako init(), alebo nastavObr() by boli veľmi zle spraviteľné, pretože u Sprite je to .setTexture(sf::Texture) a u sf::Text je to .setString. dalo by sa spojiť asi len sf::Texture so sf::Text, kedy oba berú vstup string, no aj tak Texture ma .loadFromFile a Text .setString ... preto si myslím že tieto metódy by nebolo dobré dediť, inak s tými pozíciami máš pravdu, pozeral som to teraz majú spoločné metódy na pos, scale, rotate, transform..., ale dediť sa nedajú podľa mňa, pretože u Button scalujem, rotujem, .... 3x Sprite a u Labelu 1 Text. Viem si to predstaviť cez spoločný kontajner ktorý by bol v hlavnej triede a všetka manipulácia by bola v cykle cez všetky prvky kontajnera, ale ten by musel byť any_type a teda v tej hlavnej triede by zas nefungoval, teda aspoň zatiaľ s mojimi skúsenosťami si neviem predstaviť ako by fungoval

V pythone áno .. na pár riadkov, ale c++ je taký challenge by som skôr povedal :D


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0 | 0
NapísalOffline : 21.04.2015 19:33 | C++/SFML/OpenGL

Je úplne jedno, čo sa urobí keď zavoláš funkciu scale (každý potomok môže mať tú funkciu úplne inú).


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 21.04.2015 20:18 | C++/SFML/OpenGL

Je úplne jedno, či má Button 3 obrázky a Label nie. Overridneš predsa virtuálne metódy setPosition, setSize, setScale atď. a urobíš, čo bude treba.
Kód:
class Button : public Element
{
private:
  sf::Sprite normal, hover, clicked;

public:
  virtual Button() { /* init normal, hover, clicked */ }
  virtual setPosition( int x, int y )
  {
    normal.setPosition( x,y );
    hover.setPosition( x,y );
    clicked.setPosition( x,y );
  }
  // atd
};

class Label : public Element
{
private:
  sf::Text text;

public:
  virtual Label() { /* init normal, hover, clicked */ }
  virtual setPosition( int x, int y )
  {
    text.setPosition( x,y );
  }
  // atd
};


Volá sa to polymorfizmus, prečítaj si o tom, pretože to očividne trocha nechápeš ;)


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.11.14
Prihlásený: 04.08.15
Príspevky: 27
Témy: 3 | 3
Napísal autor témyOffline : 22.04.2015 3:52 | C++/SFML/OpenGL

Tak zas viem čo je polymorfizmus. Skôr mám resty v c++, neviem presne, teda skôr nie som si istý čo si môžem a nemôžem dovoliť vzhľadom na kompilátor. Síce základná myšlienka programovania je všade prakticky rovnaká, jazyky sa napriek tomu líšia. Napr. v pythone by som to trepal do Listu od Int po cokoľvek čo ťa napadne a typy by som vôbec neriešil. C++ tiež zvládam vpohode až na tie resty, rôzne výnimky a blbosti ktoré googlim a keď vysvetlenie wiki, pdf a pod nestačí tak píšem sem. Dedičnosť v c++ som si pozrel poriadne, no vďaka vašim radám si myslím že tomu už plne chápem. Netušil som že zoberie takýto kód. Povodne som si myslel že to zoberie ako duplikovanie metód (mňa už nemá čím prekvapiť :D), zato som tu trepal o tom počte obrázkov.

Skúsim to zajtra poprerábať, dám vedieť ako sa podarilo. Ak na mňa vybehnú zas errory typu nevie nájsť referenciu na objekt tak neviem už :D


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 22.04.2015 7:46 | C++/SFML/OpenGL

A vieš prečo si to v pythone môžeš dovoliť? Pretože v pythone je všetko objekt - tzn. že všetko má takúto nadtriedu a vnútri je to riešené presne takto.

C++ je od pythonu trocha ďaleko, takže si to poriadne naštuduj. Nie je to jednoduchý jazyk typu java, python, .NET jazyky, u ktorých si prebehneš syntax a programuješ. V C++ sa všetko rieši "postarom" a treba trocha premýšľať ;)

Inak čo sa tých problémov s pamäťou týka, nezabúdaj používať ukazatele. Toto nie je python, tu to musíš používať explicitne.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0 | 0
NapísalOffline : 22.04.2015 12:24 | C++/SFML/OpenGL

To, že si v Python, môžeš do poľa uložiť čokoľvek neznamená, že to je dobrý nápad (navyše nie je problém si to urobiť aj pre C++).

Každopádne ja osobne by som odporúčal najskôr vyskúšať prácu s už existujúcimi GUI knižnicami (či už pre SFML, alebo pre Qt, Gtk+++), aby si videl, čo sa zvyčajne pri tých triedach používa..., potom skús upraviť nejaké existujúce C++ projekty a prečítaj si nejaké články o modernom C++ a až potom začni robiť vlastné GUI (pretože bez základov je to dosť komplikované a C++ má kopec zaujímavých možností, ktoré by bolo škoda nevyužiť).

Prípadne môžeš vyskúšať urobiť nejaký zložitejší projekt v Python, ale aj tam platí, že je nutné naštudovať si, čo všetko vlastne Python ponúka.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.11.14
Prihlásený: 04.08.15
Príspevky: 27
Témy: 3 | 3
Napísal autor témyOffline : 23.04.2015 0:56 | C++/SFML/OpenGL

No python má "inteligentny" smerník, tak tam sa programuje všetko ľahko, stačí mať len premyslený postup a sytax nieje problém. Občas to síce robí úplne niečo iné, ako sa od toho chce, napr do premennej natiahne namiesto nového objektu referenciu na starý a potom vlastne neupravuješ nový ale pôvodný a dosť blbo sa to fixuje, hlavne ak máš objekty v nejakej veľmi rozvetvenej štruktúre napr. strom / graf ... a všeobecne v pythone je všetko časovo dosť zložité aj za použitia modulov. Okrem toho, že sa chcem dokonale naučiť c++, čo je podľa mňa jazyk ktorý by mal vedieť každý programátor, by tvorba náročnejšej grafiky v pythone bola dosť problematická ... ako dať sa dá, ale c++ je známe svojou rýchlosťou (napr. čo sa prístupu do pamäti týka), čo je tiež dôvodom prečo je každý engine v C/C++. GTA V python edition by ste určite zažiť nechceli :D

Čo sa týka GUI, tak skúsenosti s tvorbou pomocou cudzích GUI mám, síce nie pod c++ ale už som to videl aj zdrojáky napr SFGUI. No programátorske postupy v SFGUI sú zatiaľ pre mňa dosť ťažké, pretože tam dávajú smerníky jeden cez druhý, čo by som ešte prekusol, no samozrejme nechýba #include na milion ďalších vecí vrátane glew, ktorý myslím patrí pod openGL už priamo a nemám dostatočné skúsenosti na to aby som sa zorientoval v až tak veľkom projekte. Skôr uprednostňujem také hranie sa vo vlastnom kóde, aj keď je akokoľvek neefektívny. Nejak to polepiť aby to šlo a potom upravovať. Osobne sa mi tak dobre učí keď sa najpr na to snažím príjsť sám. Síce je to pomalá metóda, ale myslím si, že dobre rozvíja myslenie. Myslím že medzi najtažšie veci bude patriť rozdelenie frame na nejakú tabulku, čo by som robil asi pomocou matice typu 2d poľa, kde čísla budú reprezentovať veĺkosť políčok, resp. pomer políčka k celku, alebo trackbar, či vizuálne efekty.

Tie možností c++ sa snažím využiváť ako to len ide, ale skôr až pri prepisovaní kopy kódu na krajší kód, kedy už proces učenia sa v danej oblasti je ukončený. Teraz mám akurát to GUI, potom príde dokočenie AI, fixovanie chýb, pádov, ukladanie konfigurácie ... a snáď bude Ačko aj v letnom semestri :)


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 23.04.2015 10:00 | C++/SFML/OpenGL

už mimo tému
Misosvk píše:
Občas to síce robí úplne niečo iné, ako sa od toho chce...
Keď naprogramuješ program, nikdy to nerobí niečo iné, ako sa od "toho" chce. To, že program nefunguje ako má, znamená, že ty si sa pomýlil, nie že ono to nefunguje. Program vždy robí to, čo naprogramuješ ;)

Misosvk píše:
ale c++ je známe svojou rýchlosťou (napr. čo sa prístupu do pamäti týka), čo je tiež dôvodom prečo je každý engine v C/C++
Trocha nadhľadu: C/C++ je známe svojou rýchlosťou, pretože sa prekladá priamo do strojových inštrukcií. Oproti tomu python sa prekladá do bytekódu a ten je interpretovaný virtuálnym strojom - ktorý je napísaný v Cčku. Takže tá nerovnosť v rýchlosti pramení práve tu - v pythone napíšeš program, ktorý je vykonávaný programom, v C/C++ napíšeš program, ktorý je vykonávaný priamo procesorom.
Z toho vyplývajú aj odlišnosti v architektúre a možnostiach jazykov. Python si môže dovoliť veľa "vysokoúrovňových" vecí, pretože sa nemusí prispôsobovať procesoru - a do virtuálneho stroja si môžem naprogramovať čo len chcem. C/C++ potrebujú jednoduchšie možnosti, aby bol výsledný strojový kód po preklade stále ako-tak efektívny a hlavne korektný. (i keď v nových verizách, C++ už má veľa nových vysokoúrovňových prvkov)

Na druhú stranu, je možné vytvoriť prekladač pythonu, ktorý program preloží priamo do strojových inštrukcií a program by bežal porovnatelne rýchlo ako v C/C++. To je ale zbytočné, pretože jazyky ako python, java, C# - tj. tie s virtuálnym strojom - sú tu kvôli niečomu úplne inému, nie kvôli rýchlosti.
A že sa nehodia na grafiku? Je kopec hier písaných v jave (hlavne hry na Android), tiež sa využíva C# .NET (napr. na Xbox). (O pythone neviem, ale to neznamená, že sa nepoužíva). Taktiež, aj keď sú hry písané v C/C++, neznamená to, že sú v tom napísané celé. V skutočnosti je to väčšinou len engine a samotné hry sa skriptujú - buď v nejakom známom jazyku (Lua, javascript...), alebo si firma vytvorí vlastný (Unityscript, Unrealscript...).
Je toho dosť a sú to zaujímavé veci - určite si o tom prečítaj, netreba sa sústrediť len na samotné programovanie :)


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.11.14
Prihlásený: 04.08.15
Príspevky: 27
Témy: 3 | 3
Napísal autor témyOffline : 23.04.2015 11:57 | C++/SFML/OpenGL

"Keď naprogramuješ program, nikdy to nerobí niečo iné, ako sa od "toho" chce. To, že program nefunguje ako má, znamená, že ty si sa pomýlil, nie že ono to nefunguje. Program vždy robí to, čo naprogramuješ"
pole1 = [1, 2, 3]
pole2 = pole1
pole2.append(5) pole1 [1, 2, 3, 5], pole2 [1, 2, 3, 5] pretože v tomto pripade zoberie pole2 ako &pole1[0] ... toto je primitívny príklad, a na podobné veci som si zvykol, napr že kopírovať treba pole2 = pole1[:] ale keď som s začínal v pythone, podobné veci stáli kopu nervov :D Predstav si, že tie polia sú n-rozmerné, plné iných objektov ako int, kde už občas [:] nefunguje korektne, hlavne ak tie objekty sú ďalšie spájané štruktúry, tvoj kód má 3k riadkov, niekde to neskopíruješ správne no a hľadaj :D C++ je v tomto podľa mňa prehľadné a veľmi pekné.

Čo sa týka hier tak áno, android má minimálne 90% hier v Jave. Ale aké sú to hry ? Jednoduché. Sprav v Jave UnrealEngine, CryEngine alebo niečo čo beží na súčastných vysokovýkonných zostavách tak klobúk dole ak to pôjde aspoň trochu. Java je myslím dokonca o jednu úroveň nad pythonom čo sa toho prekladu kódu týka. Nemám tak presnú predstavu o preklade kódu ako ty, takže nemôžem povedať presný postup ako to v Jave funguje. Moje informácie sú v hovorovej reči od ľudí, čo s týmito jazykmi bežne robia a neštudoval som to na odbornej úrovni :D Ale logicky z toho vyplýva, že cím dlhšia je cesta prekladu na strojové inštrukcie, tým je jazyk nepoužitelnejší na veci, ktoré sú výpočtovo zložitejšie, napr. tie engine.

Inak k téme SFML: Dá sa pod SFML priamo renderovať 3D objekt ? Ohľadom tejto témy sa hádaju dokonca aj na SFML fóre, takže nemám tušenie :D Celý program beži na sf::RenderWindow a keby som chcel použit openGl tak neviem ako. Nenašiel som info ohľadom toho, či SFML #include OpenGl.hpp je plnohodnotné GL a či je kompatibilné so sf::RenderWindow. Prerábať celý projekt na OpenGl by som nerád, síce som to programoval dosť objektovo a zmena by si vyžadovala len drobné úpravy, ale aj tak do čistého OpenGl zatiaľ nechcem ísť


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 23.04.2015 12:33 | C++/SFML/OpenGL

Ten tvoj príklad nie je vina jazyka, ale tvoja. Ty, ako programátor, máš vedieť, ako sa to správa. To som tým myslel. Ak sa to nespráva tak, ako čakáš, tak je to preto, že ti uniká nejaký aspekt jazyka, nie preto, že jazyk je blbý a nepočúva ťa.

A že aké hry? Videl si tie Ačkové hry na Android? Nepripadajú mi už také jednoduché. A podľa mňa sú robené v jave (alebo aj v niečom inom, ale Android je jeden veľký virtuálny stroj, takže to asi beží rovnako).
Tu treba ale spomenúť ďalší dôležitý prvok, ktorý vplýva na rýchlosť - optimalizácia. Urči si zadanie nejakého náročnejšieho programu/výpočtu a stavím sa, že napíšem rýchlejší program v jave, než ty v C++ ;)
Tie najlepšie herné enginy sú už trocha extrém, ale vo väčšine bežných prípadov ti použitý jazyk ovplyvní rýchlosť programu len minimálne. Proste to netreba vidieť čiernobielo. Programovanie je neustále hľadanie kompromisov. Takže áno, môžeš tvrdiť, že C/C++ sú rýchlejšie, ale je to trocha zložitejšie - netreba o tom byť presvedčený na 100% a spoliehať sa len na to, že "veď Cčko je rýchle, tak to spravím v tom...".

K otázke: Keďže sfml je nastavba opengl, tak by to malo ísť. Prvé čo som našiel vyzerá celkom nádejne http://www.sfml-dev.org/documentation/2.0/classsf_1_1RenderTarget.php#a8d1998464ccc54e789aaf990242b47f7


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.11.14
Prihlásený: 04.08.15
Príspevky: 27
Témy: 3 | 3
Napísal autor témyOffline : 23.04.2015 15:39 | C++/SFML/OpenGL

Áno máš pravdu :D Ale sú to jazyky ktorých finty sa treba občas nabifliť, preto som taký zástanca C++ kde jasne zadáš pomocou napr. &, const ... čo chceš robiť s parametrom a ako sa má správať. Je to podľa mňa jednoznačné a prehľadné.

Android nemám, som zástanca win mobile, ktorý spolu s iOS patria medzi "nesekavé" OS. Java je multiplatformová, tu berie všetko od kalkulačiek až po servery. Písať v C++ aplikáciu kompatibilnú s Androidom je nočná mora, už len kvôli nedostatočnej dokumentácii. Každý robí v Jave, tak načo tutorial na C :D No ok tak výzvu prijímam, myslím že jednoduchý (minúta písania) a zároveň náročný je výpočet Fibonacciho postupnosti. Tak mi ukáž v Jave kód, ktorý vypočíta n-ty prvok tejto postupnosti a bude rýchlejší ako ten ktorý napíšem v C++ alebo keď aj v pythone :D

Ďakujem za link, nádejne to vyzerá, ale draw() je konštruovaný len na sf::Drawable (Spirte, Texture ....Text) alebo na Vertex* array, ktorého atribút je vector2f, ktorý je samozrejme 2d :/ Dalo by sa z 2d vstupov násilne spraviť 3D ale vyzeral by stále len ako 2D kvôli tomu vykresľovaniu pomocou 2d vektorov ... navyše to robia ľudia ktorí programujú grafické knižnice, nie ročníkový projekt :D Na nich fakt nemám, radšej by som použil metódu knižnice ako robiť konverziu z 2d na 3d.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 23.04.2015 15:46 | C++/SFML/OpenGL

Mal som na mysli nejaký zložitejší výpočet, to fibonacciho postupnosť fakt nie je. Ale dobre, môžeme to vyskúšať - pošli svoj kód a ja skúsim napísať rýchlejší :)

Neviem si veľmi vysvetliť, ako myslíš "konverziu 2D na 3D"? Čo to vlastne chceš robiť v 3D a prečo?


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.11.14
Prihlásený: 04.08.15
Príspevky: 27
Témy: 3 | 3
Napísal autor témyOffline : 23.04.2015 17:24 | C++/SFML/OpenGL

Kód:
class GUI
{
    public:
        GUI();

        class Elem {
        public:
            Elem();
            Elem(const std::string cesta_def, const std::string cesta_focus);
            virtual point getPoz() {return point(pozX, pozY);}
            virtual void setPoz(point p) {pozX = p.x; pozY = p.y;}
            virtual void setPoz(float x, float y) {pozX = x; pozY = y;}
            virtual ~Elem();
        protected:
            int pozX;
            int pozY;
        private:
            sf::Texture deft;
            sf::Texture focust;
            sf::Sprite def;
            sf::Sprite focus;
            sf::Sprite* curr;
        };

        class Button : public Elem{
        public:
            Button() : GUI::Elem(){}
            Button(const std::string cesta_def, const std::string cesta_focus) : GUI::Elem::Elem(cesta_def, cesta_focus){
                if (this->deft.loadFromFile(cesta_def))this->def.setTexture(deft);
                if (this->focust.loadFromFile(cesta_focus))this->focus.setTexture(focust);
                this->curr = &def;
            }
            void reSize(const float gX, const float gY, const float pomer, float t);
            sf::Sprite *dajObr();
            void reSize(float x, float y);
            void eFocus(const float X, const float Y);
            bool active();
            point getPoz();
            void init(const std::string cesta_def, const std::string cesta_focus);
            void setPoz(point p);
            void setPoz(float x, float y);
        protected:
        private:
            sf::Texture deft;
            sf::Texture focust;
            sf::Sprite def;
            sf::Sprite focus;
            sf::Sprite* curr;
        };

        class Frame {
        public:
            Frame();
            Frame(float w, float h);
            void add(GUI::Elem e);
            void draw(sf::RenderWindow &window);
            void nastavVelkost(float X, float Y);
            virtual ~Frame();
        protected:
        private:
            std::vector<GUI::Elem> komponenty;
            float width;
            float height;
        };

        virtual ~GUI();
    protected:
    private:
};


obj\Debug\src\GUI.o||In function `ZN3GUI4ElemC1ERKS0_':|
\include\GUI.h|15|undefined reference to `vtable for GUI::Elem'|
obj\Debug\src\GUI.o||In function `ZN3GUI6ButtonD1Ev':|
\include\GUI.h|34|undefined reference to `GUI::Elem::~Elem()'|
\include\GUI.h|34|undefined reference to `GUI::Elem::~Elem()'|
obj\Debug\src\Menu.o||In function `ZN3GUI6ButtonC1Ev':|
\include\GUI.h|34|undefined reference to `GUI::Elem::~Elem()'|
\include\GUI.h|34|undefined reference to `GUI::Elem::~Elem()'|

Ja už neviem čo odo mňa chce :D

// Spojený príspevok Štv 23.04.15 18:24

Kód:
unsigned long long int fibM(int n){
    if (n < 2) return n;
    static std::map<int, unsigned long long int> mem;
    if(mem.count(n) > 0) return mem[n];
    unsigned long long int val = fibM(n-1) + fibM(n-2);
    mem[n] = val;
    return val;
}

int main()
{
    for(int i = 0; i < 50; i++){
        std::cout<<fibM(i)<<std::endl;
    }
    cin.get();
    return 0;
}



BX no skús spraviť niečo rýchlejšie :D A keď robíš Fibonacciho normálnou rekurziou, tak to je veľmi zložitý výpočet.

3D chcem mať len efekty, napr. v Menu nech tam niečo behá alebo sa točí. Ako v bežných hrách majú nejaké planétky a pod..


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 15.06.14
Prihlásený: 24.11.24
Príspevky: 17951
Témy: 143 | 143
Bydlisko: Bratislava
NapísalOffline : 23.04.2015 18:51 | C++/SFML/OpenGL

Tak som niečo s mojimi malými znalosťami v programovaní napísal, je to síce v delphi (čo je program založený na pascale), ale príde mi to o dosť jednoduchšie ako to tvoje
Kód:
n :=strtoint(inputbox('vstup','ktorý šlen fibonacciho postupnosti?',''));
x :=0;
y :=1;
if (n=1) then showmessage(inttostr(n)+'. člen fibonacicho postupnosti je '+inttostr(0))
  else if (n=2) then showmessage(inttostr(n)+'. člen fibonacicho postupnosti je '+inttostr(1))
        else
          begin
          for i := 3 to n do
              begin
              a :=x+y;
              x :=y;
              y :=a;
              end;
          showmessage(inttostr(n)+'. člen fibonacicho postupnosti je '+inttostr(y));


_________________
ITX >>> ATX
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 23.04.2015 19:41 | C++/SFML/OpenGL

Misosvk - napísal si to druhým najpomalším spôsobom, v čo som aj dúfal :D Miso122 to napísal správne a v podstate najrýchlejším spôsobom pre malé čísla (cca do 32bit to ešte celkom ujde, potom už na to treba ísť inak).
Zrýchliť by sa to dalo analytickým výpočtom (vzorec viď napr. wikipedia), ale tam by bolo treba použiť rýchlejšie mocnenie, než je rekurentné sčítanie a to by sa prejavilo až na veľkých číslach. A na veľké čísla sú ešte aj iné, lepšie algoritmy.

Ty si rýchlosť dosť zabil použitím mapy - skús si nájsť, čo to je a čo sa tam vlastne vykonáva ;) No a samozrejme rekurzia - tá nie je rýchla nikdy.


No a tie chyby sú tam preto, že neimplementuješ všetky virtuálne funkcie.
Takže všetky pekne implementuj, napr. pre setPoz v Button
Kód:
void setPoz(point p) {}

alebo z potomka úplne vyhoď.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.11.14
Prihlásený: 04.08.15
Príspevky: 27
Témy: 3 | 3
Napísal autor témyOffline : 23.04.2015 19:46 | C++/SFML/OpenGL

hmm ... sakra, Java allocuje základne typy podobne ako C++, na dôkaz o tom že je pomalá by bolo treba použiť zložitejšie objekty http://www.jelovic.com/articles/why_java_is_slow.htm

inak hej ten fib v pascale je dobrý, väčšinou ľudia takýto typ píšu rekurzívne bez pomocnej štruktúry na ukladanie a na to už od n = 10 vidno že je to pomalé kvôli počtu vnorení ...

// Spojený príspevok Štv 23.04.15 19:59

BX v prípade že z nejakého dôvodu nemôžeš použiť vzorec, alebo neexistuje je memoize najefektívnejšia metóda. A mapa sa mi zdá byť rýchla, nieje tam stredná hodnota zložitosti Log(n) pri .find() ? :D

A nie sorry, to vkladanie ... prebehne celu mapu :D :D Hej no s tou mapou som tomu dal, chcel som to spraviť efektívnejšie ako posúvať si n-2, n-1, n v premenných a nevyšlo. Ale ďakujem za vysvetlenie, som o niečo múdrejší :D

Aha tak implementovať skúsim, díky

// Spojený príspevok Štv 23.04.15 20:11

Kód:
sf::Sprite *GUI::Button::dajObr(){
    return this->curr;
}

void GUI::Button::eFocus(const float X, const float Y){
    if(X >= this->curr->getPosition().x &&
       X <= this->curr->getPosition().x + this->curr->getGlobalBounds().width &&
       Y >= this->curr->getPosition().y &&
       Y <= this->curr->getPosition().y + this->curr->getGlobalBounds().height)  this->curr = &focus;
    else this->curr = &def;
}

bool GUI::Button::active(){
    if (!this->def.getTexture() || !this->focus.getTexture()) return false;
    return true;
}

void GUI::Button::init(const std::string cesta_def, const std::string cesta_focus){
    if (this->deft.loadFromFile(cesta_def))this->def.setTexture(deft);
    if (this->focust.loadFromFile(cesta_focus))this->focus.setTexture(focust);
    this->curr = &def;
}

void GUI::Button::reSize(float x, float y){
    this->def.scale(x, y);
    this->focus.scale(x, y);
}

point GUI::Button::getPoz(){
    point p;
    p.x = this->curr->getPosition().x;
    p.y = this->curr->getPosition().y;
    return p;
}

void GUI::Button::setPoz(point p){
    this->def.setPosition(p.x, p.y);
    this->focus.setPosition(p.x, p.y);
}
void GUI::Button::setPoz(float x, float y){
    this->def.setPosition(x, y);
    this->focus.setPosition(x, y);
}

void GUI::Button::reSize(const float gX, const float gY, const float pomer, float t){
    bool ok = false;
    bool prvok = false;
    while(!ok){
        prvok = true;
        if(this->def.getGlobalBounds().width / gX < pomer - t ){this->def.scale(1.1,1.1);prvok = false;}
        else if (this->def.getGlobalBounds().width / gX > pomer + t ){this->def.scale(0.99,0.99);prvok = false;}
    }
    if (prvok){ok = true;}
}


GUI::Frame::Frame(){
    this->width = 0;
    this->height = 0;
}

GUI::Frame::Frame(float w, float h){
    this->width = w;
    this->height = h;
}

void GUI::Frame::add(GUI::Elem e){
   this->komponenty.push_back(e);
}

void GUI::Frame::nastavVelkost(float X, float Y){
    this->width = X;
    this->height = Y;
}

void GUI::Frame::draw(sf::RenderWindow &window){
//    for(typename std::vector<abs_typ>::iterator it = this->komponenty.begin(); it != this->komponenty.end(); ++it) {
       // window.draw(*it->getVal().dajObr());
  //  }
}

GUI::Frame::~Frame(){
    //dtor
}

GUI::~GUI()
{
    //dtor
}


vadí to keď ich mám v .cpp ? Viem že template to občas vadí, žeby aj dedičnosti ?

// Spojený príspevok Štv 23.04.15 20:29

edit: už mi to ide, reštartoval som PC :D Asi bug v C::B


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 23.04.2015 21:27 | C++/SFML/OpenGL

Ničomu to nevadí, práve naopak, v C++ by to malo byť oddelené na .hpp a .cpp súbory a do .hpp patria len a len deklarácie.

V C::B by možno pomohlo Clean a Rebuild, nabudúce keď ti to náhodou urobí, vyskúšaj.

A teraz som si všimol:
Citácia:
A keď robíš Fibonacciho normálnou rekurziou, tak to je veľmi zložitý výpočet.
Dva riadky nie sú zložitý výpočet :D Mal som na mysli skôr niečo pamäťovo a vypočetne náročnejšie, tam sa dajú uplatniť všeliaké optimalizácie.

Citácia:
3D chcem mať len efekty, napr. v Menu nech tam niečo behá alebo sa točí. Ako v bežných hrách majú nejaké planétky a pod..
Existuje tzv. 2.5D (dva a pol D), to by ti mohlo stačiť.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.11.14
Prihlásený: 04.08.15
Príspevky: 27
Témy: 3 | 3
Napísal autor témyOffline : 23.04.2015 22:31 | C++/SFML/OpenGL

Citácia:
Dva riadky nie sú zložitý výpočet :D Mal som na mysli skôr niečo pamäťovo a vypočetne náročnejšie, tam sa dajú uplatniť všeliaké optimalizácie.


Nemyslel som to ako náročnosť to naprogramovať, ale skôr čas aký je potrebný na výpočet. Skús si pustiť základný algoritmus fib kde sa rekurzívne vnára až po n = 1 a uvidíš že fib(30) mu zaberie dosť dlhý čas. Na mojej mašine 5 sekúnd :D

2,5 D riešenie by bolo fajn ale rád by som skúsil niečo takéto https://www.youtube.com/watch?v=yRrQx4PCvmA ... nejaký pekný objekt by rotoval na pozadí ako animácia. + potom nejaké random objekty ktoré by tam lietali ... vznikne preleti a mimo okno zas zanikne. To by už nebolo ťažké, skôr mi robí starosti ten postup akým donútiť SFML spracovať objekt. Objloader, scale, rotate ... všetko by sa dalo napísať vlastné podľa mňa, je na to plno vzorových matíc, ktorými stači prenásobiť vektory, ale čo s metódou sf::RenderTarget::draw() keď berie len 2d.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 23.04.2015 22:41 | C++/SFML/OpenGL

Jáj, no tak ja by som to nazval "náročný", nie "zložitý" výpočet. Samozrejme, že aj rekurzívne sčítanie dvoch čísel je náročný výpočet, ale prečo by som to sakra robil :)

To čo chceš sa dá nasimulovať aj v 2D - tým, že máš kameru fixnutú (základný pohľad na okno), tak by mohli stačiť pohyb, scale a rotácia a pri pekných obrázkoch to bude vyzerať aj oveľa krajšie, než na tom videu. A keď do toho chceš tak veľmi ťahať aj lineárnu algebru, tak si urobíš aj nejaké pekné dráhy pohybu. Ja by som tam použil hlúpe paraboly+scale a mal v paži :D


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.11.14
Prihlásený: 04.08.15
Príspevky: 27
Témy: 3 | 3
Napísal autor témyOffline : 26.04.2015 2:25 | C++/SFML/OpenGL

S tou fixnutou kamerou to znie ako super nápad :D Akurát bez z-tovej súradnice nebude treba pri renderovaní meniť vzdialenosti bodov aby sa tak opticky zaoblovali ? Každopádne by som to skúsil, no ak to spravím tak efektívne ako Fib .. bude to zaujímavé :D


 [ Príspevkov: 24 ] 


C++/SFML/OpenGL




© 2005 - 2024 PCforum, edited by JanoF