GameDev Suomi

Pelinkehitys => Esimerkit, moottorit & tutoriaalit => Aiheen aloitti: Swast - 13. Helmikuu 2019, 22:11

Otsikko: [GML][script]Debug-loki
Kirjoitti: Swast - 13. Helmikuu 2019, 22:11
Debug-loki -skripti
Yhteenveto: Luo peliin vianetsintälokin ja tallentaa sen sovelluskansioon.
Lisenssi:Public domain. Saa käyttää ja muokata miten haluaa. (Ei koske GM-filesystemiä! Tutustu sen omaan lisenssiin erikseen.)

Monet erinäisten ohjelmien tiedostoja tonkineet ovat varmasti huomanneet lähes kaikissa kaupallisissa peleissä ja muissa sovelluksissa olevan jonkinlainen tiedosto täynnä outoa tekstiä ja kellonaikoja. Näitä kutsutaan lokitiedostoiksi, joita pelintekijät käyttävät pelinsä bugien metsästykseen. Tämä on myös yleensä se tiedosto (tietokoneesi speksien ohella), jonka peli lähettää pelinkehittäjille pelin kaatuessa.

Oletko tähän mennessä käyttänyt "show_message"-funktiota debugaamiseen ja kironnut kuinka ärsyttävää sitä on koodista jälkeenpäin poistella ja kuinka rasittavaa on, että kyseinen ponnahdusikkuna jatkuvasti keskeyttää pelisi toiminnan? Ei hätää. Tein tähän ratkaisun viimeistä projektiani tehdessä ja täytyy sanoa, että tästä on ollut itselleni ainakin suunnatonta apua ja tulen käyttämään jokaisessa projektissani jatkossa.

Koska YoYoGames on tehnyt helvetin fiksun ratkaisun ja päättänyt, että Game Maker Studio pyörii "sandboxissa", eli et voi päättää itse mihin tiedostosi tallennat, niin mikäli käytät scriptiä studiossa, joudut lataamaan tämän lisäosan: (Suosittelen muutenkin lataamaan ja käyttämään. Säästää paljon harmaita hiuksia. Voit lisäosan avulla esim. tallentaa pelin tallennukset omaan kansioon.
GMFileSystem:
https://code.google.com/archive/p/gm-filesystem/
(Lataa "Downloads"-linkistä viimeisin versio)
Lisäosaa ei tarvita Game Maker 8.1:ssä eikä edeltävissä versioissa. Tällöin poistat vain FS_ -alkuliitteen tekstitiedostoihin liittyvissä funktioissa ja scriptit toimivat normaalisti. Voit myös käyttää scriptiä Studiossa ilman lisäosaa, mutta et pääse lokitiedostoon käsiksi testattua peliäsi, sillä Studio poistaa luomasi tiedostot joka runin jälkeen. Kun julkaiset pelin ja compilaat sen, niin tiedosto pysyy tallessa, mutta se ilmestyy pelisi %appdata%-kansioon.



Scriptit:

DebugInit()
Alustaa scriptin ainoan muuttujan "global.debug_log", joka säilyttää lokin tietoja ennen tallennusta tiedostoon.
Aseta tämä "pääobjektisi" (objekti joka alustaa itsensä ensimmäisenä) Create-eventiin.

global.debug_log = "["+ string( current_day ) + "/" + string( current_month ) + "/" + string( current_year ) + "][" + string( current_hour ) + ":" + string( current_minute ) + "] Session started!#";


DebugWrite( string comment )
Tätä scriptiä tulet koodissasi useimmiten käyttämään. Anna tälle funktiolle merkkijono, jonka haluat lisätä debug-lokiin.

/*
DebugWrite( string comment)

Adds a line of text to the debug-string*/
global.debug_log += "[" + string( current_hour ) + ":" + string( current_minute ) + "] " + argument0 + "#";


DebugSave( boolean game_ended )
Tämä scripti tallentaa lokitiedostosi. Anna scriptin argumentille arvo true, jos peli päättyy, niin peli merkitsee lokiin tiedon pelin päättymisestä. Jos argumentin arvo on false, niin peli olettaa, ettei peli ole päättymässä, vaan tallennat vain lokin.
/*
DebugSave( boolean game_ended )

Saves the debug log to a file*/

var file;
file = FS_file_text_open_append( program_directory + "DebugLog.txt" )

var lines, i, line;
lines = string_count(  "#", global.debug_log );


for( i = 0; i < lines; i += 1 )
{
    line = string_copy( global.debug_log, 1, string_pos( "#", global.debug_log ) - 1 );
    global.debug_log = string_delete( global.debug_log, 1, string_pos( "#", global.debug_log ) );
    FS_file_text_write_string( file, line );
    FS_file_text_writeln( file );
}
FS_file_text_write_string( file, "[" + string( current_hour ) + ":" + string( current_minute ) + "] DebugLog saved!" );
FS_file_text_writeln( file );
if ( argument0 == true ) /* Checking if the game is about to end */
{
    FS_file_text_write_string( file, "["+ string( current_day ) + "/" + string( current_month ) + "/" + string( current_year ) + "]
    //Poista tämä välilyönti ja kommentti. Venytti sivua liikaa :D[" + string( current_hour ) + ":" + string( current_minute ) + "] Session ended!" );
    FS_file_text_writeln( file );
    FS_file_text_writeln( file );
}
FS_file_text_close( file );

global.debug_log = "";





Käyttöohje:
Aseta DebugInit() "pääobjektisi" (objekti joka alustaa itsensä ensimmäisenä) Create-eventiin.

Seuraavaksi DebugWrite-scriptin käyttö:
Voit esimerkiksi haluta tietää tappelupelissä mitä vahinkoa pelaajan hahmon lyönnit tuottavat viholliseen, muttet halua piirtää sitä peliin tai muutenkaan ilmoittaa siitä pelaajalle:
//Lyöntiskriptisi tähän
DebugWrite( "Player hit " + obj_enemy.name + " with " + string( hit_damage ) + " damage." );

Korvaat tietenkin obj_enemyn vihollisobjektin nimellä ja muuttujan name vihollisobjektin nimimuuttujalla ja muuttujan hit_damage sillä muuttujalla, joka kertoo lyönnin vahinkomäärän.
Nyt scripti kirjoittaa tuon tekstin global.debug_log -muuttujaan, joka pitää väliaikaisesti tietoa debug-lokista.

Tämän jälkeen lisäät skriptin DebugSave( boolean game_end) Game End-eventiin:
DebugSave( true );



On myös hyvä tallentaa lokia kesken pelin, koska muuten muuttujaan global.debug_log saattaa kerääntyä ihan hirveän pitkä määrä tekstiä, joka voi kaataa pelisi. (Epätodennäköistä, mutta mahdollista, jos peliin varattu muisti loppuu) Toiseksi, jos pelisi kaatuu eikä Game End -eventti ehdi suorittaa itseään, menetät kaikki tallentamattomat lokitiedot.
Kun tallennat keskeyttämättä peliä laita DebugSave tähän muotoon, ettei skripti merkitse lokissa peliä päättyneeksi (Session ended):
DebugSave( false );

Lokin voi vaikka laittaa tallentumaan kun vaihdat huonetta tai koodaat sen tallentumaan vaikka joka kymmenes minuutti.

Löydät peliä testaessa tiedostosi polusta "C:\Users\Kayttajanimi\AppData\Roaming\GameMaker-Studio" ja kun julkaiset pelisi (compilaat sen), löydät sen samasta kansiosta missä pelisovelluksesi on.


Tässä vielä esimerkki oman pelini lokitiedostosta, joka antaa tietoa pelini lokalisaatiokoodista:
Koodia: [Valitse]
[13/2/2019][21:51] Session started!
[21:51] Localization's initialization complete.
[21:51] --Starting to read the localization file: 'English.txt'
[21:51] Line of comment found
[21:51] Localization key 'MENU_CC_HUE' assigned to 'Hue'
[21:51] Localization key 'MENU_CC_SAT' assigned to 'Saturation'
[21:51] Localization key 'MENU_CC_LUM' assigned to 'Luminosity'
[21:51] Line of comment found
[21:51] Localization key 'MENU_CC_HEAD' assigned to 'Head'
[21:51] Localization key 'MENU_CC_TORSO' assigned to 'Torso'
[21:51] Localization key 'MENU_CC_LEGS' assigned to 'Legs'
[21:51] Localization key 'MENU_MAIN_COPYRIGHT' not found!
[21:51] --Localization complete
[21:51] DebugLog saved!
[13/2/2019][21:51] Session ended!




Muuta:
-Jos et halua valmiiseen peliin debug-lokia, voit estää scriptien toiminnan luomalla yleisen "global.debug"-muuttujan ja laittamalla jokaisen debug-loki -skriptin alkuun:
if ( global.debug = false )
{
    exit
}

Tästä lokista voi tosin olla hyötyä valmiissakin projektissa, sillä jos pelaaja luovuttaa sen sinulle havaittuaan bugin pelissä, pystyt sen avulla paremmin metsästämään mistä bugi johtuu.


-Tämä scripti ei tallenna lokia, kun peli kaatuu Fatal erroriin (esim. jos jokin muuttuja on alustamatta pelissä ja GM pakottaa sulkemaan pelin). Scriptiä ei ole tarkoitettu aloittelijakoodaajille, vaan heille, jotka tekevät astetta edistyksellisempiä koodeja, joiden virheet ei välttämättä kaada peliä, mutta voivat aiheuttaa koodin toimimaan väärin.

-Pelin versionumeron saa lokiin myös helposti näkyviin luomalla ensin versionumero-muuttujan ja lisäämällä sen DebugInit ja DebugSave-skriptien aloitusteksiin, joka löytyy global.debug_log muuttujaan asetettuna. Voit toki kirjoittaa sen myös muuttujaan suoraan, mutta joudut version vaihtuessa joka kerta muokkaamaan saman tekstin kahteen kertaan sen sijaan, että muokkaisit yhtä muuttujaa. Versionumeromuuttuja on myös muussakin käytössä kätevä. Voit esim. piirtää sen näkyville pelin päävalikon alakulmaan.