Pravidla Ucet
Nepřihlášen

Článek

Menu

Práce s INI soubory
Napsal: jackm
Přidáno: 29.07. 2010

Naučte se pracovat s INI soubory.

Ahoj, řekl jsem si, že napíšu tutorial, jak pracovat v Game Makeru s INI soubory. Takže nejdříve Vám, řeknu k čemu INI soubor slouží. INI soubor, slouží k tomu abyste si do něj mohli ukládat například nejvyšší skóre, či jména hráčů, prostě různá data co souvisí s hrou(samozřejmě, není to speciální soubor pro Game Maker, ale využívá se docela často, nejvíce pro natavení dat různých aplikací). Dá se využít k plno věcem, výhodou INI souborů je, že ikdyž hru ukončíte údaje jsou v něm uložené, a dají se načíst například příští hru, narozdíl od proměnných, které existují jen po dobu hry. V tomto tutoriálu, Vás naučím jak do INI souborů zapisovat, zároveň i jejich obsah vypisovat, tím se Vaše hra může stát více atraktivní. Takže dejme tomu, že máme hru ve které si potřebujeme uložit jméno hráče a nejlepší skóre. Vytvoříme si nový objekt s názvem obj_ini, do Eventu nově vytvořeného objektu obj_ini, přidáme Event Create. Do Eventu Create přidáme Action Execute Code(control->Code). Otevře se nám okénko, kam budeme psát kód, ještě před zápisem a výpisem z INI souboru, musíme zjistit jméno hráče. Takže do okénka napíšeme:
jmeno=get_string("Zadej své jméno.","");

Hned po spuštění hry to hráče vyzve, k napsání jeho jména do menšího okénka, až ho hráč napíše zmáčkne OK, tím své jméno potvrdí a hráčovo jméno se nám uloží do lokální proměnné. Už máme hráčovo jméno, tak si ho hned zapíšeme do INI souboru, do okénka s kódem, kde už máme napsán kód pro zjištění hráčovo jména připíšeme na další řádek:
ini_open("informace.ini"); ini_write_string("INFORMACE","JMENO",jmeno); ini_close();

Rozebrání kódu:Nejdříve si otevřeme soubor s názvem informace.ini, soubor musí existovat a musí být ve složce s hrou! Na dalším řádku, zapíšeme do souboru hráčovo jméno, existují dva typy funkce pro zápis:ini_write_string a ini_write_real, my jsme použili 1.typ, protože slouží k zapsání textu, 2.typ slouží k zapsání čísel, to si ukážeme za chvíli na nejlepším skóre. První parametr u funkce pro zápis, ať už 1. či 2.typu je sekce, druhý je klíč a třetí hodnota, pro zápis, čili jmeno tam jsme si uložili jméno hráče, zde je ukázka co je to sekce, klíč a hodnota. [INFORMACE]-sekce JMENO-klíč=Jan(nebo-li hodnota proměnné jmeno) A na posledním řádku, ini soubor zavřeme. Tak a máme hotov, zápis hráčovo jména, takto by se ale formulář pro hráčovo jméno, zobrazoval vždy při spuštění hry, takže to ošetříme a to tak, že pokud již klíč(jméno) v INI souboru existuje, tak se hráče ptát nebudeme, a ani do INI souboru nic zapisovat nebudeme.Vrhneme se na to, změníme celý kód v Create, nový kód vypadá následovně:
ini_open("informace.ini"); nacteme=ini_read_string("INFORMACE","JMENO",""); if(nacteme="") { jmeno=get_string("Zadej své jméno.",""); ini_write_string("INFORMACE","JMENO",jmeno); ini_close(); } else { ini_close(); }

Rozebrání kódu:Nejdříve si INI soubor otevřeme abychom z něj mohli načíst aktuální hodnoty, v proměnné nacteme máme uloženo jméno, pokud bylo zadáno, pokud ne, tak tam nemáme uloženo nic. Dále zkontrolujeme pokud je načtená hodnota jména prázdná, tak vyvoláme okénko pro zadání jména a zapíšeme ho tam, celý kód pro získání jména a zápis do souboru, je popsán výše.Jinak se nic nestane, a soubor se akorát zavře. Tím jsme vyřešili získání hráčovo jména a zápis, dále pokud již jméno je uloženo v souboru, tak se nic nestane. 1.část máme hotovou, teď se vrhneme na zápis nejlepšího skóre. Do objektu obj_ini, jeho Eventu Create a Action Execute code, kde již máme kód pro hráčovo jméno, přípíšeme a nový řádek,
skore=0;

.Tím jsme definovali lokální proměnnou skore, která nám bude sloužit pro testování zápisu nejlepšího skóre. Dále napíšeme zápis nejlepšího skóre, rovnou to ale ošetříme kontrolou, pokud je skóre větší než aktuální nejlepší skóre v souboru, tak ho zapíšeme, jelikož to budeme ale kontrolovat po celé trvání hry, přidáme do Eventu Event Other->Room end(vždy když, ukončíme room, tak se provede kontrola, případně zápis nového vyššího skóre, dal by se použít Event Step, ten by to ale kontroloval po celou dobu hry, což by bylo více náročné) a do Eventu Room end, Akci Execute Code(control->Code). Otevře se nám okénko, do kterého budeme psát kód pro zápis nejlepšího skóre. Připišme tedy do okénka s kódem toto:
ini_open("informace.ini");
nacteme2=ini_read_real("INFORMACE","NEJSKORE","");
if(nacteme2<=skore)
{
ini_write_real("INFORMACE","NEJSKORE",skore);
ini_close();
}
else
{
ini_close();
}
e Otevřeli jsme soubor informace.ini, do proměnné nacteme2 si načteme hodnotu aktuálního skóre.Zkontrolujeme zda je načtené skóre menší než aktuální skóre ve hře, pokud ano zapíšeme to aktuální. Jak vidíme zapisujeme pomocí funkce ini_write_real, jelikož skóre je číselné hodnoty.Více informací, o tom jak probíhá zápis a v čem se liší najdete výše. No a pokud je skóre v souboru, vyšší jak aktuální ve hře, tak jen soubor zavřeme. Pro test si do objektu obj_ini, přidáme dva Eventy Keyboard->Enter a Keyboard->Space, k oboum eventům přiradíme Action Execute code(control->Code). Do okénka, které se nám otevře pro napsání kódu v Eventu Enter napíšeme:
skore=20;

, do okénka v Eventu Space:
skore=50;

. Spustíme hru, pokud máme jméno již zapsáno, tak ho nebudem psát, pokud ne tak do okénka napíšeme své jméno, potvrdíme tlačítkem OK. Nejdříve zmáčkneme Enter, a ukončíme hru, koukneme se do souboru informace.ini(je ve složce s hrou), a uvidíme že je klíč u sekce NEJSKORE 20. Znovu spustíme hru a zmáčkneme Space(mezerník), hru opět ukončíme a kouknem se do informace.ini uvidíme, že klíč u sekce NEJSKORE je 50. Tak a teď ještě zkusíme, jestli to opradu funguje tak, že se tam zapisuje jen nejlepší skóre, čili spustíme hru, a zmáčkneme Enter, tím se bude skóre rovnat 20.Hru ukončíme a koukneme se do informace.ini, uvidíme že klíč u sekce NEJSKORE je 50, čili opravdu vyšší než 20. Nyní už víte, jak na zápis hráčovo jména a nejlepšího skóre. Ještě Vás naučím jak vypisovat obsah INI souborů. Přidáme do objektu obj_ini Event Draw, do Eventu Drawu Action Execute code(control->Code). Do okénka, které se nám otevře napíšeme:
ini_open("informace.ini"); hracovojmeno=ini_read_string("INFORMACE","JMENO",""); nejlepsiskore=ini_read_real("INFORMACE","NEJSKORE",""); ceil(nejlepsiskore); ini_close(); draw_text(x,y,"Hráčovo jméno:"+string(hracovojmeno)+"#"+"Nejlepší skóre:"+string(skore));

Rozebrání kódu:Otevřeme soubor informace.ini, do proměnné hracovojmeno si uložíme hodnotu z Sekce Informace a Klíče Jmeno. Do proměnné nejlepsiskore si uložíme hodnotu z Sekce Informace a Klíče Nejskore, pak ho ještě zaokrouhíme jinak by to dělalo problémy. Soubor zavřeme a vypíšeme hráčovo jméno a nejlepší skóre(# je mezera). Tak a už víte, jak na INI soubory, doufám že Vám tento tutoriál pomůže, dal mi docela práci, pokud Vám něco není jasné, možná to pochopíte více z přiloženého příkladu a pokud se Vám nezobrazují české znaky, vytvořte nový font, stistkněte tlačítko All a do Eventu Drawu Action Execute code přidejte
draw_set_font(font0);

.
Jelikož, jsem to nepsal ve Wordu, tak nevidím pravopisné chyby, až budu mít přístup k Wordu opravím to.
Příklad(pro GM6)
Klíčová slova: ini soubory ini_read ini_write
 

Komentáře:

Napsal: DDL Blue
Přidáno: 30.07. 2010

U ini funguje dobře, ale u texťáků mi vřdycky dělala hrozný problémy...

Trvalý odkaz

Napsal: Quadman
Přidáno: 30.07. 2010

Nemá chybu, len plní svoju funkciu, teda zapisuje celé čísla (...,-3,-2,-1,0,1,2,3,...)

Trvalý odkaz

Napsal: jackm
Přidáno: 30.07. 2010

Jak říká Satik, Matt asi <> zakázal, kvůli PHP a HTML, čili se < a > dá použít, nebo =.

Seeker:Nepřesné to je 50 to zapsalo jako 49,xxxxx, já osobně to zapisuji pomocí stringu, jenže jsem chtěl ukázat k čemu je real a string.

Trvalý odkaz

Napsal: Seeker
Přidáno: 30.07. 2010

Jinak taky dobrá rada: nepoužívejte ini_write_real - má chybu, je nepřesný. Lepší ini_write_string("section","key",string(real proměnná))

Trvalý odkaz

Napsal: Satik64
Přidáno: 30.07. 2010

Ajo ono se to přímo zobrazolo :D tak &.l.t.; a &.g.t.; bez teček, kdyby to bylo potřeba použít

Trvalý odkaz

Napsal: Satik64
Přidáno: 30.07. 2010

Se psaním <> mám taky problémy, používám zatím náhradu < a >

Trvalý odkaz

Napsal: jackm
Přidáno: 30.07. 2010

Jo díky, vím že to jde i s =, ale já nejsem zvyklý to používat a jde to bez toho.. :D

Trvalý odkaz

Napsal: NicharCZ
Přidáno: 30.07. 2010

Mno, přesně s tímto operátorem jsem měl také problém, nevím proč, ale následující znaky se prostě nezobrazí. Pístnu Mattovi. Zatím jsem to vyřešil tímhle ">=". Jinak se ti to zatím nezobrazí.. :|

Trvalý odkaz

Napsal: jackm
Přidáno: 30.07. 2010

Dík, kód: ini_open("informace.ini");

nacteme2=ini_read_real("INFORMACE","NEJSKORE","");

if(nacteme2<skore)

{

ini_write_real("INFORMACE","NEJSKORE",skore);

ini_close();

}

else

{

ini_close();

}

Trvalý odkaz

Napsal: NicharCZ
Přidáno: 30.07. 2010

Tak to se mi také stalo, když jsem dělal cyklus "for", mno, postni to sem do komentářů a nějak se ti to pokusím tam hodit...

Trvalý odkaz

Napsal: jackm
Přidáno: 30.07. 2010

Akorát, jak je ten článek dlouhý, tak hodil menu úplně jinam a tadle část:ini_open("informace.ini"); nacteme2=ini_read_real("INFORMACE","NEJSKORE",""); if(nacteme2 není celá, přitom jsem to tam celé dával. :(

Trvalý odkaz

Napsal: NicharCZ
Přidáno: 30.07. 2010

Nesmaže, neboj.. Je dobře, žes to udělal na příkladu, proměnné... Díky tomuhle tutoriálu a tomu obecnějšímu budou .ini soubory všem jasnější..

Trvalý odkaz

Napsal: jackm
Přidáno: 30.07. 2010

Tady, je to ukázané spíše na proměnných, každopádně není to úplně stejné, tak doufám, že mi to ale nesmažete, když už jsem si stím dal práci.

Trvalý odkaz

Napsal: Quadman
Přidáno: 30.07. 2010

Dobré to je, ale nebolo to tu už?

http://www.velkejchytrak.cz/index.php?str=read&id=14

Trvalý odkaz

Velkej Chytrák
Copyright (c) 2001-2010