Portál AbcLinuxu, 7. prosinec 2019 23:36

Dokoncil jsem domaci ukol

1.2.2009 23:48 | Škola | poslední úprava: 26.6.2010 07:32

Uff. Mozna se to bude pred odevzdanim jeste trochu menit, ale hlavne jsem dokoncil to strasne dokumentovani. Tak jsem si rikal, ze bych to mohl konecne nekde zverejnit.

Mym ukolem bylo vytvorit neco podobneho jako je stara DOSova hra King's Quest 1. Tedy hru na motivy pohadek, kde hrac chodi s panackem a zadava mu slovni prikazy. Vice na strankach tohoto programu.        

Hodnocení: 81 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

2.2.2009 00:53 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
Odpovědět | Sbalit | Link | Blokovat | Admin
Zajímavé, ale měl bych pár připomínek :)
mirefek avatar 2.2.2009 18:26 mirefek | skóre: 6 | blog: proc_dalsi_nazev
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol

1) Uznavam, ze jsem musel resit nektere veci, ktere obvykle resi jine knihovny. To ma ovsem tu vyhodu, ze muzu vsechno udelat tak, jak ja budu chtit a budu presne vedet, jak moje funkce funguji. V nekterych souborech tedy zdanlive zbytecne resim veci kolem X a v jinych se soustredim na hru. Nechapu, co myslite tim, ze to je neprenositelne a pomale. Pomale se mi to tedy nejevi a pokud prenositelnosti myslite kompatibilitu se systemy bez X, tak ta mi nevadi.

2) Cestina bez hacku a carek vubec neni spatny vtip. Program ji podporuje hned ze dvou duvodu. Za prve zvlada cestinu s hacky a carkami jen v pripade, ze vas pocitac umi kodovani, ktere program potrebuje. Za druhe mam (a myslim, ze i nekdo dalsi) obvykle nastavenou anglickou klavesnici a prepinat kvuli hre na ceskou se mi nechce. Obzvlast, kdyz hru testuji a tedy soucasne upravuji zdrojaky. Navic hru spoustim prikazem "./kraluk" a druhy znak bych na ceske klavesnici musel hledat.

3) Uznavam, ze v modulech save a load by se vyjimky docela hodily. Kdyz mam ale cely zbytek v jednoduchem C-cku.

2.2.2009 19:09 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
1) No možná jste to udělal přesně tak, jak jste chtěl, ale pochybuji, že vám to pojede na každém X serveru v každé možné konfiguraci. Pomalé to samozřejmě bude, protože jste neměl čas řešit optimalizace, které za vás řeší jiné knihovny.

Například tento kód je prostě pomalý a jiné knihovny to řeší mnohem (klidně i 10x) líp:
void rescalePixmap (XImage *ximage, Pixmap *pxm)
/*********************************************/
{
  XImage *ipom;
  GC lgc;
  int i,j,x,x2,y;
  unsigned long pixel;

  if(*pxm) XFreePixmap(display, *pxm);  // Neni-li pxm None, odallokuji to
  if(ratio == 0 || !ximage){
    *pxm = None;
    return;
  }
  cekalose = 1;

  // Pripravim novou pixmapu:

  *pxm = XCreatePixmap(display, root,
		       ximage->width*ratio, ximage->height*ratio, ximage->depth);
  lgc = XCreateGC(display, *pxm, 0, NULL);

  if(ratio <= IMAGRAT){
    if(ratio == 1){  // Pomer je 1:1 -> neni treba aplikovat scale:
      XPutImage(display, *pxm, lgc, ximage, 0, 0, 0, 0,
		ximage->width, ximage->height);
      XFreeGC(display, lgc);
      return;
    }
    ipom = XCreateImage (display,
			 CopyFromParent, ximage->depth,
			 ximage->format, ximage->xoffset, 
			 malloc(ximage->bytes_per_line*ratio*
				ximage->height*ratio),
			 ximage->width*ratio, ximage->height*ratio,
			 ximage->bitmap_pad, ximage->bytes_per_line*ratio);
  }

  for(y=0; y<ximage->height; y++)
    for(x=0; x<ximage->width; x++){
      pixel = XGetPixel(ximage, x, y);    // Pro kazdy pixel ze zdrojoveho obrazku
      if(ratio <= IMAGRAT)
	for(j=y*ratio; j<(y+1)*ratio; j++)
	  for(i=x*ratio; i<(x+1)*ratio; i++)
	    XPutPixel(ipom, i, j, pixel); // vykreslim ctverec do pomocneho ximage
      else{
	// nebo vykreslim cely radek do pixmapy:

	for(x2 = x+1; x2<ximage->width && XGetPixel(ximage, x2, y) == pixel; x2++);
	XSetForeground(display, lgc, pixel);
	XFillRectangle(display, *pxm, lgc,
		       x*ratio, y*ratio, ratio*(x2-x), ratio);
	x = x2-1;
      }
    }

  if(ratio <= IMAGRAT)
    XPutImage(display, *pxm, lgc, ipom, 0, 0, 0, 0,
	      ipom->width, ipom->height);

  XFreeGC(display, lgc);
}
2) Háčky a čárky se dají jednoduše odfiltrovat, ale velmi těžce doplnit. Ale tím, že jste použíl přímo X bych věřil tomu, že jste se vůbec nechtěl zabývat tím, jak korektně zjistit unicode charakter ve všech různých konfiguracích X (a není to vůbec jednoduché), popřípadě jak pracovat s unicode (utf-8,16,32).

3) Asi né jen tam :-) Já jsem to napsal hlavně v souvislosti s malloc(), kde nikde nekontrolujete, jestli vám náhodou nevrátil NULL. Pro takovou hru je to samozřejmě prkotina, ale je to velmi špatný zvyk a věřím tomu, že v nějakém projektu, na kterém pracuje víc lidí by toto ostatním velice vadilo.

mirefek avatar 2.2.2009 19:40 mirefek | skóre: 6 | blog: proc_dalsi_nazev
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol

1) Myslim, ze funkci rescalePixmap mam docela dobrou. Predevsim proto, ze tim pomerne rychle nataham pixmapy pres sit na X server. Ja opravdu kvuli teto funkci zadne zpomaleni hry nepocituji, ale mozna mam jen prilis rychly pocitac. Navic nevim, jestli pouziti jinych knihoven prinese vzdy zrychleni. Ty jine knihovny totiz resi obvykle mnohem obecnejsi problemy nez ja.

2) Vim, ze se hacky a carky daji odfiltrovat, ale hure doplnit. Ten program vsak nema za ukol odfiltrovavat hacky a carky. Mam vsak na vyber jak jazyk, kde hacky a carky odfiltrovane jsou, tak jazyk, kde nejsou. Priznavam, ze spravna podpora UTF-8 v X je prilis slozita, takze tento program zvlada cestinu s hacky a carkami pouze v kodovani, iso8859-2.

3) Aha. Ale to uz je skoro jedno jestli program zkolabuje na Segmentation fault nebo na vyjimku, ze se nepodarilo pouzit malloc.

2.2.2009 20:44 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
1) Ta funkce je pomalá. Kdybych změřil, kolik cyklů trvá jeden pixel vaši funkce a funkce v nějaké knihovně, byly by rozdíly v řádech desítek. Zrychlení vám přinese už knihovna, která se zabývá počítačovou grafikou a na rescaling je použitý třeba algoritmus využívající SSE (qimageblitz je dobrý příklad, původem z imlib2).

2) Pokud nechcete závislost na knihovnách, které má většina uživatelů, je to váš boj :-)

3) Existuje dobrý zvyk programátorů. Klidně si můžete napsat funkci xmalloc(), která spadne při chybě, někteří to tak normálně dělají, ale ignorovat návratové hodnoty u funkcí, které můžou selhat je prostě špatné.
Luk avatar 2.2.2009 21:43 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
Klidně si můžete napsat funkci xmalloc(), která spadne při chybě, někteří to tak normálně dělají, ale ignorovat návratové hodnoty u funkcí, které můžou selhat je prostě špatné.
Kromě toho není běžně důvod, aby to při selhání malloc() padalo přímo na hubu. Program může běžet dál, třeba chvíli počkat a pak zkusit alokaci znovu. Připomínám, že selhání malloc() je na Linuxu prakticky vyloučené, protože ve výchozím nastavení je povolen overcommit a jádro může tedy zvesela přidělovat paměť, kterou vůbec nemá (přidělí se ve skutečnosti až při výpadku stránky, když se proces do té paměti pokusí něco zapsat).
LinuxMarket - linuxový e-shop | LinuxEXPRES - linuxový magazín | OpenOffice.cz - portál uživatelů OpenOffice/LibreOffice
mirefek avatar 3.2.2009 08:24 mirefek | skóre: 6 | blog: proc_dalsi_nazev
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol

1) Nechapu, proc obvinujete z pomalosti funkci, ktera vetsinu prace prenecha X serveru. Vy tu pomalost pocitujete nejak lidsky? Nebo jste se jen podival do zdrojaku a shledal, ze to je pomale. Myslim, ze je spousta jinych a pouzivanejsich programu, ktere by se daly zrychlit. Pokud mate pocit, ze muj program dlouho startuje, je to spise tim, ze pri startu nacitam mnohem vice obrazku nez je nezbytne.

3) No dobra s tim mallocem mate asi pravdu. Vypadalo by to profesionalsteji.

3.2.2009 13:47 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
1)

Abych se přiznal, mi osobně je to úplně jedno, ten projekt reprezentuje vaše programovací schopnosti, né moje :-)

Chtěl jsem vám jen vysvětlit, že nemůžete napsat rychlou funkci pro scaling, pokud se tím tématem nezabýváte. Vaše funkce vygeneruje takový traffic, že kdyby jste si ten scaling udělal na klientu a pomocí XPutImage() to přenesl na server, tak uděláte mnohem líp.

PS: Ať se daří :)
mirefek avatar 3.2.2009 16:00 mirefek | skóre: 6 | blog: proc_dalsi_nazev
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol

Ja jsem to puvodne mel naprogramovane tak, ze udelam scaling na klientu a pak to prenesu na server funkci XPutImage(). Pak jsem ovsem experimentalne zjistil, ze postupne vykreslovani pomoci XFillRectangle() funguje pres sit rychleji, predevsim pri velkych zvetsenich. To, co zdrzovalo, nebyl pomaly scaling na klientu, ale sit. Kdyz program spustim na stejnem pocitaci, jako je X server, je zmena policka okamzita v obou pripadech.

Nicmene dekuji za vase pripominky, priste se mozna pokusim o lepsi optimalizaci rychlosti, nejlepe za pomoci goto konstrukci :)

hikikomori82 avatar 2.2.2009 00:57 hikikomori82 | skóre: 18 | blog: foobar | Košice
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
Odpovědět | Sbalit | Link | Blokovat | Admin
Smekám. Ked nebudes vediet kam dalej, mrkni sa na kniznicu cairo. Je to este jednoduchsie ako xlib+libxpm a ako bonus ti budu fungovat utf8 fonty a png obrazky (vratene priehladnosti).
Slobodný font na technické kreslenie
2.2.2009 07:45 Zdenek
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
Spis nez cairo bych pouzil SDL, zvlast kdyz jsou to bitmapy.
2.2.2009 17:19 Václav HFechs Švirga | skóre: 26 | blog: HF | Kopřivnice
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
Já bych použil obojí, jde to krásně propojit. V SDL se krásně pracuje s bitmapa, ale bohužel už blbě s kreslením ruzných 2D věcí (a to je cairo perfektní, navíc se místo bitmap můŽe použít SVG).
Baník pyčo!
mirefek avatar 2.2.2009 18:14 mirefek | skóre: 6 | blog: proc_dalsi_nazev
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol

Oboji bych nepouzil, protoze se mi nejevi dobre mit program zavisly na spouste dalsich knihoven.

Cairo neznam, ale SDL nemam rad. Zkousel jsem nejaky jednoduchy SDL programek a ten vytocil procesor na plne obratky. Je mi jasne, ze se v SDL da nejak zaridit, aby se to nestalo, ale tento priklad ci tutorial me od SDL lehce odradil. Navic vsechny SDL hry, ktere znam, pri fullscreenu zcela zablokuji windowmanager.

2.2.2009 02:08 JohnnyDoe | skóre: 11 | blog: Alesort blog
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
Odpovědět | Sbalit | Link | Blokovat | Admin
Wtf, "Mirek Olšák", syn TOHO Petra Olšáka :-).
Luk avatar 2.2.2009 06:34 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
Ano, toho: "To 'h' je hodnost, a ne něco jiného, například ... suvenýr z Prahy." "Teď to zakryjeme ... rucema ... rukoumi..." "Tak, a teď tu závorku musíme vyšpekulovat, aby to vyšlo..." "V tom je jádro pudla, tedy zakopaný jezevčík..." :-D
LinuxMarket - linuxový e-shop | LinuxEXPRES - linuxový magazín | OpenOffice.cz - portál uživatelů OpenOffice/LibreOffice
2.2.2009 13:19 fakenickname | skóre: 42 | blog: fakeblog
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
Tak to se nedivim ze dokumentaci psal v texu :-))
Luk avatar 2.2.2009 14:14 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
TEX je náhodou vynikající. Psal jsem v něm diplomku a bylo to naprosto v pohodě. Narozdíl od lidí, co ji mastili ve Wordu, jsem se soustředil jen na obsah a výsledkem byl skvělý PDF soubor o velikosti 300 KB.
LinuxMarket - linuxový e-shop | LinuxEXPRES - linuxový magazín | OpenOffice.cz - portál uživatelů OpenOffice/LibreOffice
2.2.2009 14:29 fakenickname | skóre: 42 | blog: fakeblog
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
vsak ja nic nerikam proti texu.. jen poukazuji na tu zajimavou "nahodu", ze syn pana profesora olsaka si zrovna vybral tex.. ;-)
mirefek avatar 2.2.2009 18:50 mirefek | skóre: 6 | blog: proc_dalsi_nazev
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol

Pravda, mel jsem ohromne "stesti", ze nedavno vysel docby.tex.

xxx avatar 2.2.2009 14:40 xxx | skóre: 42 | blog: Na Kafíčko
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
Navíc ten styl toho textu je naprosto nezaměnitelný. Po spatření, že věc se nachází na leibniz.feld... jsem už ani sekundu nepochyboval. No nic jdu zamáčknout nostalgickou slzu za lingebru.
Please rise for the Futurama theme song.
Luk avatar 2.2.2009 15:56 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
"Lineární algebra, to není setřepat matici do horního trojúhelníkového tvaru. Lineární algebra, to je umět v tom myslet." :-D
LinuxMarket - linuxový e-shop | LinuxEXPRES - linuxový magazín | OpenOffice.cz - portál uživatelů OpenOffice/LibreOffice
onion avatar 3.2.2009 00:31 onion | skóre: 8 | blog: onion | Praha
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol

Jo, taky jsem na to čuměl :-D Rodina Olšáků mě prostě pronásleduje, zavřu Ďábelsky Žlutá Skripta(tm), jdu se odreagovat na abíčko a kdo na mě koukne - Olšák :-) 

Luk avatar 3.2.2009 01:18 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
jdu se odreagovat na abíčko a kdo na mě koukne - Olšák
Nejen na abíčku. Také na Rootu a Linuxzone, ale už je to dávno ;-)
LinuxMarket - linuxový e-shop | LinuxEXPRES - linuxový magazín | OpenOffice.cz - portál uživatelů OpenOffice/LibreOffice
2.2.2009 02:09 letec
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol
Odpovědět | Sbalit | Link | Blokovat | Admin
Vypadá to zajímavě, ale ta čeština...
8.2.2009 10:22 Petr Olšák
Rozbalit Rozbalit vše Re: Dokoncil jsem domaci ukol

Vrátil jsem se z dovolené a koukám, syn zveřejnil svůj program. Dovolil bych si pár poznámek.

Čeština v programu funguje, pokud systém dovolí programu lokálně nastavit LC_CTYPE=cs_CZ.ISO8859-2, o což se program při svém startu snaží. Varianta "cestina" je jen v záloze, pokud by toto nevyšlo, nebo pokud uživatel nemá rád, že musí mít pokoněnou klávesnici Husem.

O tom, jaké knihovny by se daly použít a zda je přímé použití jen Xlibu pomalejší nebo rychlejší, bych rád polemizoval, ale do této diskuse to nepatří. Spíše by nás oba zajímalo, zda je hra hratelná bez čítů (cheats). Měl jsem v některých místech hry jiný pocit než Mirek, tj. že na další postup hráč nemůže přijít. Bohužel, u nás doma to nemůžeme vyzkoušet, protože víme, jak se to má hrát (koukali jsme Mirkovi, když to tvořil, pod ruce).

Povedlo se to někomu dohrát do konce?

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.