sâmbătă, 25 aprilie 2015

OpenFrameworks. Unde face de folosit și unde nu prea.

Wow! Au trecut aproape 2 ani de la ultima mea postare. Nu am postat nimic atâta timp, fiindcă nu am avut teme de postare, timp și uneori nici dorință. Azi am decis până la urmă să mai scriu ceva. :)

OpenFrameworks

Ultima dată eu am postat despre primul joc făcut în C++ și OpenGL (vezi aici). După aceea am încercat un framework foarte comod pentru a desena rapid ceva pe ecran. Acest framework se numește OpenFrameworks. După părerea mea este foarte comodă pentru cei care iubesc să folosească C++ și dorește să facă ceva interactiv pe ecran. OF nu este doar pentru grafică, acesta are multe alte funcții ca rularea coloanelor sonore, extragerea spectrului coloanei sonore, poate comunica cu Arduino, sau cu orice alt dispozitiv care comunică prin porturi seriale, multe utilități pentru accesarea unei pagini HTTP, citirea și scrierea fișierelor, înregistrarea și rularea fișierelor video ș.a. Și asta nu este totul. OF are o comunitatea destul de mare care e gata să ajute pe oricine. La fel sunt și o mulțime de tot felul de addon-uri pentru OF făcute de comunitate.
Eu am folosit acest framework anul trecut cu gândul că voi încerca să fac un joc folosind acel framework. Pentru a studia cât mai bine acest framework, am început să portez proiectul FABE. Portarea a fost destul de simplu de făcut, fiindcă OF are un cod destul de flexibil și are toate abstracțiile necesare pentru a ușura programarea grafică. Deci am portat meniul principal și mergea destul de bine, dar așa și nu am mai terminat de portat întregul joc. Primul motiv a fost că după terminarea portării meniului principal deja am avut toate cunoștințele necesare pentru a începe liniștit un proiect nou folosind OF, iar al doilea motiv a fost plictisirea mea cu FABE. Eu am pierdut orice interes în rescrierea acestui joc, sau întreținerea acestuia (poate cândva voi explica de ce).

Unde face de folosit?

OF se poate de folosit aproape la orice proiect care necesită ceva interactivitate audio-vizuală. Se poate de conectat cu vreun dispozitiv făcut de tine și să trimiți printr-un port serial datele la OF, apoi de făcut ceva grafic interesant care reacționează de la acel dispozitiv. Poți folosi si pentru a face jocuri video, deoarece că OF este un framework flexibil și se poate de folosit și pentru aceasta. Este foarte bun pentru a înțelege cum se face grafica în aplicații, cum grafica poate interacționa cu sunetele și alte chestii care-ți vin în cap. :)

Unde nu face de folosit?

Peste tot unde nu are sens de făcut ceva interactiv și la proiecte mari. OF e foarte bun pentru proiecte mici și pentru tot felul de experimente interesante, însă pentru ceva mai serios nu recomand deloc. Dacă dorești să faci ceva ce ai dori să arunci pe piață, atunci OF nu este alegerea bună. La fel dacă dorești să faci un joc, dar nu dorești să reinventezi roata atunci OF nu este alegerea potrivită. Și dacă dorești să faci o bombă nucleară, iar din OF să-i dai foc, atunci OF nu este alegerea potrivită. :)

Cu alte cuvinte, OF e bun pentru proiecte personale, pentru a te lăuda cuiva ce chestii frumoase și stranii poți face în C++ și pentru a studia grafica pe calculator, fiindcă abstractizează destul de bine lucrurile strașnice a lui OpenGL. :)

marți, 27 august 2013

FABE final release

     

     Hmm... Nici nu știu cum să încep. Am un anunț, din tema cestei postări probabil totul deja e clar. În sfârșit am finisat de făcut jocul! Haidem să începem de la început.
     La începutul primăverii am avut la universitate de făcut un proiect de curs la obiectul "Structuri de date și Algoritmi". Profesorul mi-a dat voie să-mi aleg singur tema, ceea ce înseamnă că nu era neapărat să fie din lista de teme, dar trebuie să fie la fel de complexă sau mai complexă decât ceea ce se află în lista de teme. Eu am vrut să fac un video joc. Însă aici a apărut prima problemă: Ce fel de joc să fac, care să fie complex și interesant? Da, desigur că la general crearea unui joc deja ceva destul de complex, dar aici totul e relativ. De ce? Deoarece sunt o multitudine de programe care ușurează mult acest proces și utilizatorul doar trebuie să se gândească la jocul său, adică cum acesta va arăta, ce sunete să aibă, ce stil de artă să aibă, genul jocului și altele. Însă în cazul meu trebuia să fac singur totul. Ce asta înseamnă? Asta înseamnă că trebuie singur să-mi fac un fel de mic motor grafic care să fie în stare să desene ceea ce vreau eu. Să fie în stare să desene text pe ecran, să fie în stare să afișeze imagini pe care le încarci de pe HDD, trebuie să fie în stare de a reda sunete și altele. De aici iese că nu va fi așa de ușor de făcut un joc în cazul meu. Bun, acum să mergem mai departe.
      Eu nu știam ce joc să fac, însă știam din start că trebuie să fie simplu, din punct de vedere a graficii și sunetului. Să fie simplu, dar cu gust. Să fie pur gameplay care să aibă mecanici simple, dar să fie în același moment interesant de jucat din nou și din nou. Și cel mai principalul să-mi placă mie să mă joc în dânsul. :)
      Profesorul mi-a propus să fac un joc gen puzzle, ceva de tipul cubik rubik (engleză: rubik cube). De din momentul acesta deodată, ca și cum mi-a trosnit cineva cu ciocanul pe cap, am ajuns la ideea de a face un joc în care să ia regula principală al jocului cubik rubik: strânge 6 feți cu 6 culori unice. De aici și a apărut denumirea jocului FABE(din engleză FAce cuBE).
      Jocul arată în felul următor:
FABE - Easy difficulty (screenshot)
     Jucătorul controlează conturul roz care se află în jurul unei mici feți. Pentru a se mișca, jucătorul apasă butoanele sus/jos/dreapta/stânga de la tastatură, sau de la xbox360 gamepad, sau orice alt gamepad care are funcționalitatea xInput. Iar pentru ca să schimbe o altă față de altă culoare, acesta apasă pe butonul SPACE de la tastatură sau butonul A de la gamepad. În joc există un oarecare timp limită în care jucătorul trebuie să reușească să colecteze o față întreagă de o culoare unică. În dependență de cât de rapid aceste culori sunt colectate jucătorul va primi un anumit scor.
     Screenshot-ul de sus reprezintă doar modul ușor al jocului, în care jucătorul se poate învăța mecanicile inițiale ale jocului. La dificultatea normal și greu al jocului mai apare o mecanică al jocului și aceasta e încă un contur roz pe care se poate de rotit în jurul principalului contur. În așa mod jocul devine un pic mai complex.
FABE - normal difficulty (screenshot)
    Screenshot-ul dat reprezintă dificultatea normală al jocului. Bun, aceasta eu cred că e de ajuns. Acum e timpul pentru ceva video gameplay, pentru ca să fie încă mai clar totul.


    Jocul se poate de descărcat de pe linkul următor: Fabe installer
    Pentru a rula jocul este nevoie de:
  • CPU: orice procesor modern
  • GPU: procesor grafic cu suport de OpenGL 3.3
  • RAM: 512MB
  • HDD: 80MB
  • O tastatură sau un xbox360 gamepad, sau un gamepad care suportă tehnologia xInput. 
Pentru a avea o experiență cât mai plăcută de joc, recomand să folosiți un gamepad în loc de tastatură.

miercuri, 7 august 2013

FABE pre-alpha: source code

     Deci, în postarea precedentă eu am promis că voi posta codul sursă la jocul prototip. Vreau din start să vă avertizez, prototipul este plin de bug-uri și leak-uri de memorie, nu anume memorie heap, acolo totul e normal, leak-ul merge la nivel de memoria video, care se află în GPU. Build-ul la care lucrez acum am eliminat leak-urile legate de video memorie și multe bug-uri vizuale care se întâlneau rar în prototip, însă când apăreau ele distrugeau toată experiența jocului. În arhivă am inclus doar fișierele cu codul sursă, librăriile dependente și proiectul va trebui singuri să configurați. Am făcut în așa mod, din cauză că eu nu știu dacă voi vă folosiți de același IDE ca și mine, sau pur și simplu scrieți prin editor de cod și compilați direct prin compilator. Fișierele de sunet eu la fel am exclus, din cauză că acestea ocupă mult loc, însă programul nu va rula, dacă nu aveți inclus sunetele celea. Desigur puteți exclude codul legat de sunete, eu când am scris prototipul m-am străduit ca totul să fie OOP, pentru ca să fie mai ușor de modificat codul și de exclus componentele inutile.
     Librăriile de care depinde jocul sunt următoarele:
    Acestea sunt librăriile de care jocul prototip depinde. La fiecare text este atașat un link, așa că puteți să faceți click pe dânsele și să le scoateți. Ok, acum structura codului și cum acesta este amenajat. Să începem cu cel mai principalul, fără de care nimic nu ar fi posibil.
    Clasa OpenGLBase.h conține datele principale pentru ca desenatul imaginii pe ecran să fie posibil. Această clasă se mai folosește de alte clase care răspund de anumite chestii legate de transmiterea datelor în buffer. Acestea sunt Program.h și Shader.h. Program.h este clasa care din 2 sau mai multe shader-e crează un program care este interpretat de GPU. Ce asta înseamnă, pentru a desena anumite chestii la ecran, este nevoie de un program dedicat anume desenatului la ecran. Shader.h este codul sursă dedicat pentru GPU care este deodată compilat ca să fie mai târziu atașat împreună cu alte shader-e într-un program întreg.
     FaceMesh.h și Player.h sunt acelea care moștenesc clasa OpenGLBase.h și în acelea se scriu datele pentru desenare pe ecran.
     FaceColon.h este o clasă care generează o coloană de obiecte de tipul FaceMesh.h. La fel în FaceColon.h se controlează când trebuie să fie animate obiectele FaceMesh. Pentru ca să fie clar programului când să animeze o coloană, acesta are nevoie de un mod de comunicare cu obiectul Player.h. Aceasta se face în metoda de actualizare a datelor, și anume în parametrul metodei de actualizare Update() se transmite poziția obiectului Player.h. În așa mod am făcut ca coloanele să comunice cu player-ul.
     Pentru sunete sunt folosite 3 fișiere:
  • SoundEngine.h - Generează motor pentru ca să ruleze sunetele;
  • AudioSource.h - Crează un obiect care încarcă un fișier cu sunet;
  • WAVLoader.h - Funcție care permite citirea fișierelor sunet de tip WAV.
Aici nu am ce explica, din cauză că după citirea documentației librăriei OpenAL, totul va fi clar.
     Pentru animațiile player-ului și coloanelor de fețe am făcut o clasă aparte care se află în fișierul Animation.h.
     În Constants.h se află niște enumerații și variabile constante de care programul se folosește într-una.
Funcția main() din care totul începe să ruleze se află în fișierul fabe_app.cpp. Game.h păstrează în dânsul toate coloanele cu fețe și player-ul, la fel prin această clasă se verifică dacă se strânge o singură culoare pe prima poziție din coloane.

     Asta este totul ce pot să zic aici despre codul sursă a prototipului. Restul deja va trebui singuri să vă uitați și să analizați ce "prostii" am scris :-P, link-ul la sursă se află aici: FABE-pre-alpha-source-code.zip.

P.S. Codul nu este bine comentat, așa că nu vă recomand să-l citiți. Mie mi-a fost lene să-l rescriu. :-P

vineri, 14 iunie 2013

OpenGL și C++

    Eu demult nu am postat nimic aici și îmi cer scuze dacă cineva a stat și a urmărit acest blog așa de mult timp, eu am avut un motiv pentru aceasta. Eu am terminat colegiul și am intrat la universitate și în paralel căutam un API pentru programarea graficii și cum să folosesc acel API în dezvoltarea jocurilor. Am dat de DirectX și de OpenGL. Ambele au fost bine documentate și pe internet am găsit multă informație referitoare la acestea două. La momentul cela apăruse o problemă, eu vroiam să le învăț pe ambele, în paralel, însă aceasta s-a dovedit a fi imposibil pentru mine, deoarece eu mi-am dat seama cât de multe nu cunosc despre programarea graficii și cum aceasta funcționează. La început eu foloseam XNA cu C#, acolo era foarte simplu să încarci ceva, începând de la o simplă imagine și terminând cu modele 3D cu sunete, efecte și multe altele. Eu însă nici XNA nu l-am studiat până la capăt, știam doar cum să fac un joc 2D, cu ceva muzică și sunete.
   Păi de ce atunci a fost imposibil pentru mine să le învăț pe ambele odată? Răspunsul s-a dovedit a fi unul foarte simplu. În primul rând DirectX și OpenGL au o sintaxă diferită una de alta, în orice caz mie așa îmi pare. În al doilea rând pentru a înțelege cum funcționează DirectX, trebuie de înțeles cum funcționează COM-urile. Eu nu am vrut să învăț COM-urile pentru a înțelege DirectX, am fost nerăbdător și vroiam cât mai rapid să trec la studierea API-ului, însă când am început să-l studiez, nu am putut să înțeleg multe, din cauză că nu cunoșteam cum funcționează un COM. OpenGL însă s-a dovedit a fi mai simplu de înțeles decât DirectX. OpenGL comunică cu programele prin intermediul unor funcții și a fost simplu de desenat primul meu triunghi acolo. Eu acum am în vedere versiunea 3.3 a lui OpenGL, deoarece am vrut să studiez deodată variantă modernă a lui, unde se folosesc shader-e și totul se poate de controlat așa cum dorești.
   Deci până la urmă trebuia să aleg una din acele API-uri și să o studiez așa cum se cuvine pentru a înțelege și a folosi îndeplin posibilitățile acestuia. Am ales OpenGL, desigur acesta la fel nu este simplu de înțeles la început, mi-a trebuit mult timp până când am însușit cele mai simple baze. Defapt eu abia cunosc doar aceste baze și acum doresc să studiez mai departe pentru a putea face ceva mai interesant și mai plăcut vizual. După ce am simțit că eu cunosc cât de cât bine bazele, am încercat să fac singur un mic prototip de joc, dar stați un pic, eu încă nu am explicat încă un lucru.

   În OpenGL se poate de programat folosind limbajul C/C++, sau dacă stau pe MacOS, Objective-C, sau dacă doresc pe web browser(WebGL), atunci javascript, sau în cel mai rău caz pe java(Mie nu-mi place java, mult cod într-aiurea care crează impresia că faci ceva, părerea mea subiectivă). Eu deja cunoșteam ceva baze în C++ și de aceea am ales să studiez OpenGL folosind anume acest limbaj de programare.
   Deci după cum am scris mai sus, eu am ales OpenGL și C++, și am mai menționat că am încercat să fac un prototip de joc. Prototipul se numește FABE(de la face și cube). Ideea jocului este de strânge o față de "cub" să fie de aceeași culoare. Mai jos este un video care demonstrează rularea acestui prototip:

    Prototipul a fost compilat în Visual C++ 2012. Pentru a crea fereastra și contextul lui OpenGL, am folosit GLFW și deja pentru ca să pot ușor opera cu funcțiile OpenGL, am folosit GLEW. Toate acele link-uri pot fi apăsate și puteți studia singuri fiecare lucru folosit de mine pentru a crea acest prototip.
    Desigur nu are nimic din ceea ce se numește "Grafică", deoarece eu deja am mai scris că cunosc doar bazele la moment și nu știu să fac shading să pun diferite efecte și altele. La fel pentru ca prototipul să se socoată un joc, trebuie să aibă măcar un menu, ceea ce nu este în jocul meu.
    La moment eu doresc să fac un mic motor pentru ca să pot să fac din acest prototip un joc. Source code-ul la acest prototip nu am inclus, voi include doar prototipul, pentru ca să probați jocul. Citiți README.txt înainte de a rula acest joc.

P.S. Jocul are muzică și sunet. Pentru aceasta am folosit OpenAL. În link-ul mai jos se află un fișier zip în care se află instrucțiunile necesare pentru a rula jocul. Eu multe nu am explicat aici, de aceea în următoarea mea postare, voi explica în detaliu cum funcționează acest joc și voi include și codul sursă al acestuia.

vineri, 15 iunie 2012

Jumpy Pants Update (0.1.1)




      În update-ul acesta am eliminat bug-ul, care desena 2 eroi deodată.

Link la update: http://tiny.cc/kksxfw

      Dacă mai observați bug-uri, îmi scrieți mie pe facebook sau lăsați aici un comentariu cu imaginea unde s-a observat bug-ul.


P.S. Pentru a vedea cerințele minime căutați postările mai vechi.

P.S.S Acest Update include în sine tot jocul, nu este nevoie de a instala versiunile precedente.

marți, 12 iunie 2012

Jumpy Pants (System Requirements update)

       

        Ok, am mai probat la o varietate de calculatoare, și am am făcut modificări la cerințele jocului la sistem.


CPU: Pentium 4 sau AMD Sempron 2600+ (posibil să meargă la și mai slabe procesoare)
Video Card: merge liber la aproape orice card începînd de la 64Mb



        Dacă aveți cineva niște PC-uri mai slabe ca aceea ce sunt scrie aici, probați jocul și lăsați comentariu pe blog împreună cu informația despre PC-ul dumneavoastră.

sâmbătă, 9 iunie 2012

Jumpy Pants (Update 0.1)

Salut tuturor care au încercat jocul meu și care încă nu. Astăzi am făcut un mic update la joc. Am adăugat "Options" în meniul principal și atunci când apăsați ESC în timpul jocului.

Options arată în felul următor:
Options


După cum vedeți în screenshot-ul de mai sus au apărut 5 opțiuni în submeniul "Options"

  • Change Fullscreen/Windowed - Această opțiune vă permite ca jocul să fie pe întreg ecran al monitorului.(Rezoluția jocului nu se schimbă, ea rămîne aceeași.)
  • Music - Această opțiune vă permite să închideți muzica din joc sau s-o porniți înapoi.
  • Sound - Această opțiune vă permite să închideți sunetele din joc.
  • Reset High Score (0m) - Această opțiune vă permite să resetați scorul maxim acumulat.(Ceea ce se află în paranteze este scorul maxim pe care voi l-ați acumulat în joc)
  • Back - Această opțiune vă întoarce înapoi în meniu principal.

Toate aceste opțiuni se schimbă apăsînd tasta ENTER sau SPACE.

Link la jocul actualizat: Jumpy Pants Update 0.1

Distracție plăcută!

P.S. Acest update nu necesită versiunea precedentă a jocului, e destul doar să scoateți acest instalator pentru ca să puteți juca.