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.
73 odezev
Teda kocoure, nic moc. 🙂
Myslím, že umíš lepší.
Eh, jak jsem psal není to nejlepší, ale snad to není tak špatné. Jak bys to zlepšil? Musím uznat, že je to neohrabané.
Možností je jistě víc, ale snažil bych se zbavit těch polí. Bylo by zajímavé zkusit to objektově, ale chtělo by to pokusy s měřením rychlosti, protože GM je někdy dost pomalý u věcí, kde k tomu není důvod. Přinejhorším bych šel do datových struktur. Jinak by možná stálo za to udělat set jednoduchých účinných postupů pro práci s textem obecně a hodit to sem. Myslím, že GM v tom má nativně značnou mezeru a lidi si vždycky upatlají nějaké polovičaté řešení pro jeden účel ke každé hře, což žere čas a produkuje chyby.
Jinak by to chtělo přehlednější formátování odstavců s kódem, když to má být vzor pro ostatní. Odsazení, komenty na řádcích, jiný typ písma a tak.
Díky za názor a dobré připomínky, ještě ten článek opravim, mě naopak přišla pole jako vcelku efektivní řešení a protože parsování proběhne ve creatu i vcelku rychlé řešení, jen elegance asi utrpěla smrtelný úder. Každopádně, jaký by byl rozdíl v rychlosti při použití datových struktur? Já to nikdy neměřil. Pohraji si ještě s formátováním článku.
Díky 🙂
Datové struktury by měly být rychlejší, když dokážeš využít některou z vestavěných funkcí, např. třídění nebo zamíchání. Pokud je použiješ čistě stejným způsobem jako pole, rychlejší nejsou. Teď jsem si cvičně změřil přístupy array a ds_grid při kopírování dvou polí s 500000 prvky. Klasické pole bylo o 3.7 vteřiny rychlejší. Datová struktura se hodí především k funkcionálnímu programování, protože žije nezávisle na objektu, ve kterém vznikla. ( je nutné volat destroy ) Obecně platí, že dobře použitá datová struktura vyrobí elegantní a rychlý kód, špatně použitá zpomalí a zkomplikuje úplně všechno.
V programu se nevyznám, ani jsem se nedíval, jak složité je to k užití, ale zdá se mi to dobré. Určitě by se mi něco takového občas hodilo. Ještě lepší by to bylo v případě, že by to umělo do textu zařazovat také sprity. („Kliknětě *obrázek myši s vyznačeným tlačítkem*“ atp.)
Až budu mít trochu času přidám verzi, která bude umět zpracovávat i sprity.
Za chvíli to vydám jako open word 😀
Musím se přiznat, že se jedná o ukázku kódu z mého projektu a v něm by jakákoliv grafika rušila čistě negrafické prostředí, tak mě původně ani nenapadlo něco takového udělat.
1contingency
define dissertation https://professionaldissertationwriting.org/
dissertation help galway https://professionaldissertationwriting.com/
writing a masters dissertation https://helpwithdissertationwritinglondon.com/
help with masters dissertation https://dissertationwritingcenter.com/
format for writing dissertation proposals https://accountingdissertationhelp.com/
dissertation review https://examplesofdissertation.com/
dissertation help uk https://businessdissertationhelp.com/
writing dissertation proposal https://dissertationhelpspecialist.com/
dissertation writing services uk https://dissertationhelperhub.com/
cheap dissertation help https://customthesiswritingservices.com/
online casino paysafe https://download-casino-slots.com/
win real money online casino for free https://firstonlinecasino.org/
888 casino online help https://onlinecasinofortunes.com/
foxwood online casino https://newlasvegascasinos.com/
online casino that accepts echeck https://trust-online-casino.com/
real casino slots online https://internet-casinos-online.net/
us online casino real money https://1freeslotscasino.com/
online real money casino usa https://vrgamescasino.com/
online casino with $5 minimum deposit https://casino-online-roulette.com/
casino online michigan https://casino-online-jackpot.com/
hollywood casino online https://onlineplayerscasino.com/
online casino no deposit sign up bonus https://ownonlinecasino.com/
newest pa online casino https://all-online-casino-games.com/
raging bull online casino https://casino8online.com/
top free vpn https://freehostingvpn.com/
free vpn? https://ippowervpn.net/
best vpn routers https://imfreevpn.net/
best vpn router 2019 https://superfreevpn.net/
best vpn app https://free-vpn-proxy.com/
buy vpn ip https://rsvpnorthvalley.com/
dating british gay men https://gay-singles-dating.com/
free and single https://freephotodating.com/
which online dating site is best https://onlinedatingbabes.com/
flirtbee https://adult-singles-online-dating.com/
sz dating seiten https://adult-classifieds-online-dating.com/
find international singles dating https://speedatingwebsites.com/
100% free dating sites https://wowdatingsites.com/
singles and personals https://freeadultdatingpasses.com/
sites online dating https://virtual-online-dating-service.com/
dating direct https://zonlinedating.com/
what is the most legit online casino https://online2casino.com/
rsweeps riversweeps online casino https://casinosonlinex.com/
free ohio gay chat rooms https://newgaychat.com/
gay chat now https://gaychatcams.net/
easy gay chat https://gaychatspots.com/
gay chat cam chat https://gay-live-chat.net/
totally free gay phone chat https://chatcongays.com/
free gay video chat https://gayphillychat.com/
chat gay en mexico.com https://gaychatnorules.com/
gay chat roullete https://gaymusclechatrooms.com/
free gay phone chat trial https://free-gay-sex-chat.com/
gay sex chat no registration https://gayinteracialchat.com/
gay random chat x4 https://gaymanchatrooms.com/
pay someone to write your paper https://sociologypapershelp.com/
buy college papers online https://uktermpaperwriters.com/
write my papers discount code https://write-my-paper-for-me.org/
paper writing help https://doyourpapersonline.com/
can i pay someone to write my paper https://cheapcustompaper.org/
pay someone to write a paper for me https://writingpaperservice.net/
paper writing service reviews https://writemypaperquick.com/
buy school papers https://essaybuypaper.com/
how to find someone to write my paper https://papercranewritingservices.com/
buy cheap paper https://ypaywallpapers.com/
help writing college papers https://studentpaperhelp.com/
1wayfarer