Üdv mindenkinek!
Engem Pintér K. Gábornak hívnak, s elől járóban pár dolgot írnék le, főképp azt a folyamatot, mely a GNU/LINUX-hoz, s a demózás felé fordított (PC-n).
Anno kiskoromban nem volt saját gépem, s pénzünk sem rá, így Békásmegyeren, egy számítógép klubba jártam el, ahol többek között a programozással, elektronikával és sok egyéb hasznos dologgal ismerkedtem meg, s legszebb éveimet kaptam. Sok dologba vágtunk bele, többek között számítógépet terveztünk és építettünk (ez volt a KÜTYÜ a KOS OS.-el). Aztán eljött az idő, mikor boldog tulajdonosa lettem egy COMMODORE64-es gépnek, s később jött a PC, először MS-DOS, majd Windows 3.11 - WinXP-ig, sokáig esküdtem a DOS-ra, mivel a Windowst hamar megutáltam, s kb. 3/4 éve áttértem az UBUNTU GNU/LINUX-ra, mely az első másodperctől kezdve megfogott, s kijelenthetem (persze csak a magam nevében), hogy ez az az OP., mely hiányzott a PC-ről, amire 14 évet vártam (igaz, még nem vagyok nagy koponya a GNU/LINUX világában, de idáig is 99%-ban csak sikerélményt nyújtott mind a programozásban, mind más területen is).
Egyik jó barátommal (aki már nagy koponyának mondható GNU/LINUX-os berkekben) elhatároztuk, hogy kitanuljuk az SDL-t és az OPENGL-t, s természetesen a 3D programozást, annak minden velejárójával. Igaz óriási fába vágtuk piciny baltánkat, de ez volt a lényeg, a kihívás, s a sikerélmény édes íze, s aszem erre a feladatra keresve sem találhattam volna jobb op rendszert, mint az Ubuntu GNU/LINUX. Azóta már sok karakter pattogott a képernyőn, pár ezer sornyi kódon túl vagyunk (s persze majdnem ugyanennyi "szegmentálási hiba" hibaüzeneten is), s jópár pixelt is megtornáztattunk a TFT-n, s a CPU-t sem kíméltük, kíméljük, de ez már a következő bejegyzés témája lesz.
UI.: A GNU/LINUX iránti rajongásom főképp a 8bites korszakomból fakad, felidézi bennem ezen korszakomat (a lelkesedést) a stabilitása, türelmessége és ami a legjobban tetszik, hogy mindezt úgy, hogy (kis molyolás árán) mai szemmel azt mondhatom a "csili-vili" oldaláról, hogy HŰHA, s sok win7-es embert is sikerült ámulatba ejtenem vele.
----------------------------------------------------------------------------------------------------------
Nos, itt a folytatás...
Kezdetnek csak egy ablakban pixelenként szerettem volna valamit alkotni (révén, hogy GNU/LINUX előtt Turbo Pascalban írogattam), de hamar beláttam (kis olvasgatás és forumozgatás után), hogy sajnos kernelből ki van zárva, így jött az SDL, melynek telepítésének kinyomozása egyszerű volt, (apt-get install libsdl1.2-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev, majd telepíteni kell a yum, ezek után yum install SDL-devel SDL_mixer-devel SDL_image-devel SDL_ttf-devel, s végezetül http://www.libsdl.org/download-1.2.php oldalról le kell tölteni az SDL-devel-1.2.9-1.i386.rpm csomagot, s telepíteni kell), s már kész is az alapja annak, hogy belevágjunk eme rögös útba, mely tele van sok siker- és kudarc élménnyel. Kezdettől fogva C++-ban írogattam és próbálkoztam (ez a g++), kisebb - nagyobb sikerekkel, majd mikor már úgy éreztem, hogy SDL-ben már majdnem mindent meg tudok csinálni, s nagyjából átláttam a működését, algoritmusait, könyvtárait, átnyargaltam az OPENGL-re, mely keményebb dió, itt már nem volt elég az egyszerű 2D-s matematika, ki kell tanulni a 3D-t, mely magában foglal pár magasabb szintű matematikát, s meg kellett tanulni magas szinten bánni a mátrixokkal (nem a Mátrix c. filmben megismerttel, hanem a matematikai mátrixokkal), mivel egy akármilyen 3D-s testnek szörnyű sok adatai vannak, s sokszor az egész testen kell számításokat végezni, ezért kerültek mátrixokba (egyrészt a sok adat átláthatóbb tárolása érdekében, másrészt a műveletek hatékony elvégzéséhez, mivel bármely matematikai művelet elvégezhető mátrixokon is). Sajnos be kellett látnom, hogy az SDL ismerete és az OPENGL alapszintű ismerete nagyon-nagyon kevés egy jó demóra, ismerni kell egy jó 3D modellező programot is, melyben a 3D-s testeket elő lehet állítani, s texturázni (én a wings3D-t használom, a texturázási része sok fejtörést okozott, mivel sehol sem találtam erről a részről leírást, így magamnak kellett kitalálnom a hogyanokat). De még ez is kevés, mivel az SDL (Simple Directmedia Layer, mint a neve is utal rá) egy médialejátszásra kitalált függvénykörnyezet (ha nem pontosan így van, akkor elnézést), az OPENGL pedig csak a 3 ill. 2D-s ábrázolásra jó, tehát ha azt akarom, hogy legyen hangja (zene, hangeffektek, stb...), akkor szükségem van mindkettőre, így az egyetlen járható útnak az mutatkozott, ha inicializálom az SDL-t, megnyitom vele a grafikus ablakot, s inicializálom SDL-ből az OPENGL-t is. Ez idáig rendbe is volt, így már tudtam pixelenként programozni, de nem az igazi, mert még egy nagyon erős gépen is nagyon lassú volt, a notimon pedig esélytelen, így a kész 3D-s alakzatok felé kellett fordulnom, de jött a következő probléma, hogy hogyan lehet OPENGL-ben egy adott 3D-s objektumot (testet) betölteni. Sok-sok próbálkozás és netezés árán rátaláltam egy objektum betöltő kódra, mely .3ds kiterjesztésű fájlokat képes betölteni, így meg tudtam jeleníteni a saját objektumaimat, azokat meg tudtam forgatni, s mozgatni ablakban, jelenleg 3D-s effektek előállításán, s animálásán töprengek... Nos, legközelebb elkezdem pontosan taglalni az elejével, azaz az SDL nevű jószág programozásával, hátha érdekel még valakit a programozás világa, őszintén megvallva azért fogtam bele a blog írásába, hogy hátha lesznek olyan emberek, akiknek az érdeklődését fel tudom kelteni... (Egy LÁMA kérdés: eszembe jutott, hogy a legelső SDL-es demó kezdeményemet megosztanám veletek, mind a forráskódot, mind a bináris fájlt, de nem tudom, hogyan tudnám ide feltölteni, valaki tudna ebben segíteni? Köszönöm!)
---------------------------------------------------------------------------------------------------------
Üdv újra!
Elnézést a nagy kihagyásért, de valami vírust szedtem össze, s közel 40C°-os lázzal feküdtem, s megmoccanni sem bírtam, szóval frissítenem kéne a víruspajzsomat...
Nos, úgy gondoltam, hogy már egy kis kódot közzé is teszek:
----------------------------{kep.cpp [C++ kód]}-----------------------------------
#include "SDL/SDL.h" /*<- SDL.h header fájl meghívása*/
#include "SDL/SDL_image.h" /*<- SDL_image.h header fájl meghívása, mely a képek kezeléséért felelős*/
main() /*főprogram kezdete*/
{
SDL_Surface *screen; /* képernyő beállításokra mutató pointer, a neve lehet bármi...*/
SDL_Surface *picture;/* a betöltendő kép adataira mutató pointer */
SDL_Rect r_picture; /* a betöltendő kép megjelenítési koordinátáit, hosszát és magasságára mutató pointer */
SDL_Init(SDL_INIT_VIDEO); /* az SDL rendszer inicializálása */
screen=SDL_SetVideoMode( 800, 600, 32, SDL_DOUBLEBUF | SDL_HWSURFACE);
/* a fent deklarált screen nevű SDL_Surface típusú pointernek átadjuk a grafikus képernyő paramétereit (bármilyen ablakkezelő rendszerben automatikusan megalkotja az ablakot), mely rendre a következő: maxX, maxY, azaz a grafikus lapunk felbontása; maxC, azaz a grafikus lapunk színmélysége; SDL_DOUBLEBUF, azaz megadjuk, hogy dupla buffer memóriát foglaljon le, SDL_HWSURFACE, azaz hardweres gyorsítást kérünk*/
picture=IMG_Load( "akármi.bmp" ); /* itt töltjük be a picture pointerbe az akármi.bmp képfájlt (itt bármilyen .bmp képfájlt megadhatsz, ami a program könyvtárában van, ellenkező esetben kell a teljes elérési út) */
r_picture.x=1; /*megadjuk képünk X koordináját */
r_picture.y=1; /* -----------II------- Y -----II------ */
SDL_BlitSurface(picture, NULL, screen, &r_picture);
/* az SDL_BlitSurface() függvénnyel kirakjuk a képet: picture : képre mutató pointer, screen : grafikus lapra mutató pointer, &r_picture : kép koordinátáira mutató pointer*/
SDL_Delay(20000); /* 20000 nS-ig felfüggeszti a program futását */
SDL_FreeSurface(picture); /* a picture pointer, az adott memóriaterület felszabadítása, melyre mutat (ahol a kép foglalt helyet) */
SDL_Quit(); /*lezárjuk az SDL rendszert */
}
-------------------------------{EOF}---------------------------
A kód fordítása: g++ kep.cpp -lSDL -lSDL_image.
Így egy, vagy több kép helyezhető el a grafikus lapunkon ( több kép esetén értelemszerüleg több SDL_Surface mutatót, s a hozzájuk tartozó SDL_Rect mutatót is kell deklarálni). Remélem, hogy ha leírom, hogy konzolban a touch fájlnév.kit paranccsal lehet új fájlt létrehozni, senki sem sértődik meg, s nem tartotok okoskodónak (távol áll tőlem).
{Még egy hangyányi megjegyzés, mert egyik ismerősöm (aki prog. matematikus, s véleményezte a blogomat) azt mondta, hogy OOP nélkül sehova sem jutunk, de mint ahogy neki is kifejtettem, így Nektek is, aztán úgyis véleményezitek a dolgot... Nos, nem szeretném bonyolítani feleslegesen, aki tudja, annak már nem kell leírni, aki még nem, annak még nem kell leírni. Olyan ütemben, s úgy szeretném leírni, ahogy én eljutottam oda, ahol jelenleg tartok, s amúgy úgy tartom, hogy kétféle programozó van, az egyik, aki egyetemen végzett, Ők (elnézést tőlük) 90%-ban túlságosan "falak" között gondolkodnak, s van a hobbi programozó, aki bár (nem biztos) jóval kevesebb tudással, de szabadabb gondolkodással, több megközelítéssel áll a dolgok megoldásához, s egész nap úgyis kódol, meg tervez, (persze vaskos szabályok mellett, ami a hobbi programozót nem köti). Így lehet az, hogy sokszor egy-egy jelentős informatikai szabadalom egy hobbi programozótól születik. Ezen elmélkedtünk egész délután, s a végén erre jutottunk, s azért hozzátenném, hogy majd azért a sűrűjében szükség lesz az OOP-re is, de szerencsére (legalább is nekem) a C++-os megvalósítása átláthatónak és nagyon könnyen megérthetőnek tűnik.}
---------------------------------------------------------------------------------------------------------
Üdv mindenkinek újra!
Ember tervez, isten végez... Sajnos az élet megint beleszólt a napirendembe, úgyhogy most a folytatás...
Biztos sokunkkal előfordult már (velem számtalanszor), hogy jött egy jó ötlet, s azonnal (hű bele Balázs módjára) nekiestem kódolni, se stilisztika, se átgondolt változó név, stb., s mikor kis idő múlva elő akartam venni a kódot, addigra totál elfelejtettem, hogy ki kivel van, s nagyon sok időm ment el kibogozni (párszor fel is adtam), s párszor, hogy az ötlet nem működött elsőre, másodszorra, sokadszorra, így dzsungel lett, átláthatatlan, úgyhogy bekerült a soha meg nem valósult projektek közé. Ilyesféle gondoktól való megóvás érdekében leírom, hogy hogyan készítem manapság programjaimat, demóimat.
Nos, ugyebár legelőszőr csak egy ötletem van, ezt papírra vetem, majd a kötelező sablonoktól eltekintve (SDL, OPENGL inicializálás, stb.) leírom a gerincét, megválogatva a változókat, s neveiket (mindig igyekszem olyan neveket választani, ami utal a funkciójukra, de nem csak a változó nevekkel, hanem a szubrutin(ok) neveire is ugyanígy ügyelve). Mikor ezen túl vagyok, nekiesek kódolni, persze kényesen figyelve a stilisztikára. Megesett ugyanis (nem is egyszer), hogy a sok egymásba ágyazott feltételek, ciklusok, stb. írásakor szimpla figyelmetlenség miatt kimaradt egy-egy zárójel, vagy éppenséggel több lett a kelleténél, így fordíthatatlanra sikeredett a program, vagy ha igen, valami egészen mást csinált, mint amit elvártam tőle (ekkor jött a hibajavítás, ez esetben jobb volt, mikor nem fordult le, mert ekkor legalább azt tudtam, hogy mit keressek), így sok ilyen hibából is adódott pár dobott projektem. Amire gondolok:
-------[rossz stilisztika]--------
int valami(int vx; int vy){
...
for(i=0;i<500;i++){
for(i1=0;i1<500;i1++){
if(i*i1>2500){
for(n=i;n5000){
...
for(h=0;h<200;h++){
...
if(h*i22500){
for(n=i;n5000){
...
for(h=0;h<200;h++){
...
if(h*i2