GM(S) – Postřehy pána much, díl první.

Dobrý den, jistě se Vám někdy stalo, že jste v GM potřebovali vykreslovat text s velmi detailní kontrolou, řekněme měnit barvu jednotlivých slov, jejich velikost či font, aplikovat různé efekty.

V dnešním krátkém návodu/úvaze Vám nabídnu své řešení, nikde není psáno že je dobré, ale je aspoň funkční. Před přečtením článku doporučuji mít aspoň základní znalost GML, ale hlavně solidní programátorské myšlení, nuže pusťme se do toho.

 

Předpokládejme, že si vytvoříme výchozí objekt ze kterého budou vycházet jeho potomci, vytvořme si tedy objekt a nazvěme ho oTextEngine.

Přejdeme k create eventu, toto bude hlavní část naší práce a proběhne zde „logika“ kódu, pak již jen vykreslíme výsledek v draw eventu.

Nadefinujeme si proměnné:

tick = 0; // Aktuální step od vytvoření instance, použijeme k animacím
xx = x; // Výchozí souřadnice na psaní
yy = y; // Výchozí souřadnice na psaní

 

Nyní nadefinujeme makra, která nám usnadní orientaci v programu, přidáváte je samozřejmě do „all configurations“

  • m_text = 0
  • m_color = 1
  • m_size = 2
  • m_tick = 3
  • m_alpha = 4
  • m_x = 5
  • m_y = 6

 

Vstup algoritmu bude následovný:

str[0,m_text] = „Welcome“;
str[1,m_text] = „player,“;
str[2,m_text] = „and hello from“;
str[3,m_text] = „Platinumsoftware#“;
str[4,m_text] = „We rock!“;
str[5,m_text] = „And you rock too!“;

lenght = 6;

//****************************************************

text_width = 400;

// Zde se bude nacházet konfigurace jednotlivých vlastností, u kterých //nebudeme chtít výchozí hodnotu, prozatím necháme místo volné.

//****************************************************

Budeme tedy mít definované 2d pole, v prvním rozměru si definujeme části stringu a dělíme je na jednotlivé celky. Proměnná lenght určuje počet části (funkce array_get_lenght z bůhví jakého důvodu nefungovala správně…). V druhé určujeme vlastnosti každého prvku. Budou: string, barva, velikost(font), tick(počet stepů do začátku animace), alpha, x,y.

 

Nyní, čistě z přehlednosti definujeme skript a nazveme ho scrTextEngineSetUpDefaults, do jeho těla napíšeme:

/// scrTextEngineSetUpDefaults()

str[0,m_tick] = 20;
for(a=0 a<lenght a++)
{

str[a,m_alpha] = 0;
str[a,m_color] = c_white;
str[a,m_size] = fntText;
if (a>0){str[a,m_tick] = str[a-1,m_tick]+40;}
}

 

Tedy nadefinujeme počet stepů do začátku animace prvního prvku a nastavíme výchozí hodnoty dalších vlastností.

 

Nyní se vrátíme do create eventu a vepíšeme (tzn ne ctrl c+v):

scrTextEngineSetUpDefaults();

for(a = 1 a<lenght a++)
{
str[a,m_text] = string_insert(“ „,str[a,m_text],0)
}
lenght_temp = string_width(str[0,m_text]);

for (a=0 a<lenght a++)
{
str[a,m_x] = lenght_temp+xx;
str[a,m_y] = yy;

lenght_temp += string_width(str[a,m_text])
width = string_length(str[a,m_text])

if (string_pos(„#“,str[a,m_text]) != 0)
{

pos = string_pos(„#“,str[a,m_text]);
string_delete(str[a,m_text],pos,1);
yy+=(string_height(str[a,m_text]))
lenght_temp = string_width(str[0,m_text]);
str[a+1,m_text] = string_delete(str[a+1,m_text],1,1)

}
else
{
if (lenght_temp > text_width)
{
yy+=(string_height(str[a,m_text]))
lenght_temp = string_width(str[0,m_text]);
str[a+1,m_text] = string_delete(str[a+1,m_text],1,1)

}

}
}
Provedeme tedy jakési „naparsování“ textu do adekvátních řetězců, které jsou připravené na výstup. Logiku jistě chápete a není potřeba ji vysvětlovat (bylo by to zdlouhavé a jde pouze o nápad).

 

 

Nyní už jen zbývá přejít do draw eventu a vypsat výsledky:

 

tick += 1;
draw_set_color(c_white)

for(a=0 a<lenght a++)
{
if (tick >= str[a,m_tick])
{
if (str[a,m_alpha] < 1 )
{
str[a,m_alpha] += 0.02;
}

draw_set_alpha(str[a,m_alpha]);
draw_set_colour(str[a,m_color]);
draw_set_font(-1);
draw_text(str[a,m_x],str[a,m_y],str[a,m_text]) ;
}

draw_set_alpha(1)
}

Můžeme se vrátit do create eventu a do volného místa v ohvězdičkovaných řádcích (za definici proměnné) změníme hodnoty, se kterými nejsme spokojeni, např.

 

str[1,m_color] = make_colour_rgb(0,0,255);
str[5,m_color] = make_colour_rgb(0,255,255);

 

 

Pokud jste nechápali, pochopili jste jak funguje kouzelné # v GM(S), obdoba /r/n z C# a zalamování textu.

 

Toť vše dámy a pánové, pro dnešek stačí a uvidíme se u dalšího dílu mých postřehů a nápadů, pěkný zbytek večera a úspěchy přeje Váš LordOfFlies. 🙂

 

 

PS: logiku jsem vymýšlel asi jen půl hodiny, ale je funkční. Některé druhy fontů můžou způsobovat blbnutí systému, čistě ale ze strany GMS. Použijte prosím hodnotu -1.

Pokud jste řešili nějaký problém a jednalo se o něco závažnějšího, napište mi PM a třeba se Váš problém objeví s řešením v dalších postřezích.

Bezejmenný

Hotový create event