Diskuze: Heslo
V předchozím kvízu, Online test znalostí GameMakeru, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 50 zpráv z 52.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí GameMakeru, jsme si ověřili nabyté zkušenosti z kurzu.
V GM se dá vše, ale budeš si to asi muset naprogramovat sám
EventCreate - ikona ExecuteCode:
password='devbook';
keyboard_string='';
unlocked=0;
EventDraw - ikona ExecuteCode:
var i,r,s ;
i=0; r=4; s=11;
repeat string_length(keyboard_string)
{
draw_ellipse_color((si)+x-r-1,y-r-1,(si)+x+r+1,y+r+1,c_black,c_black,0);
draw_ellipse_color((si)+x-r,y-r,(si)+x+r,y+r,c_black,c_white,0);
i+=1;
}
if (unlocked)
{
draw_set_alpha(0.5);
draw_line_width_color(5+x+(si),y,11+x+(si),y+6,5,c_black,c_black);
draw_line_width_color(10+x+(si),y+5,18+x+(si),y-11,5,c_black,c_black)
draw_set_alpha(1);
draw_line_width_color(5+x+(si),y,10+x+(si),y+5,3,c_green,c_lime);
draw_line_width_color(10+x+(si),y+5,17+x+(si),y-10,3,c_green,c_lime)
}
EventReleaseEnter - ikona ExecuteCode:
if (keyboard_string)=password
{ unlocked=1; }
Ten keyboard_string vypadá jako užitečná věc, nevěděl jsem o ní Mrzí mě ale, jak jsou tyhle GM kódy vždycky špatně napsané, žádné konvence, např. proměnné i, r s nebo jak jsou zapsány podmínky.
Část kódu se zformátovala, chtělo by ho vkládat jako zdrojový kód, takhle asi nebude fungovat, chybí tam nějaké hvězdičky.
Ajaj, to mě mohlo trknout.
Když to bude v tagu code, tak to bude OK?
>samo007:
Tady je link na gmk, ten pojede vždycky:
http://www.povray.cz/…wordType.gmk
Ano, v code to bude chápáno jako zdrojový kód a bude také zvýrazněna syntaxe.
Název proměnné by měl vystihovat to, co je v ní uloženo.
Ten repeat je příšerný, to je práce pro for cyklus.
Zápis té poslední podmínky jsem také nepochopil, proč dávat do závorky proměnnou místo celé podmínky a proč porovnávat =?
Tyhle kódy jsou jak nemoc, nikdo jim nerozumí, někdo to napíše, další stahnou a zkopírují, ty chyby nevidí, pak si tam přidají další a další proměnné...
To je jen důsledek vložení kódu jako prostého textu.
Pokud dodržuje určité zvyklosti, např. r=poloměr a x,y=souřadnice apod, tak s jednopísmennými názvy proměnných nemusí být problém. U delších výrazů to může být i přínosem ke zvýšení čitelnosti, zejména u matematických vzorců.
Pokud vím, tak cykly repeat a for nemusí být ekvivalentní.
To vím. Očekával jsem od TomBen reakci, že to sem pošle znovu a tentokrát to vloží správně.
Proměnná si vznikla tím, že jsem to nedal do code.
Měla tam být násobící hvězdička.
>sdraco:
Názvy proměnných mám v tomto duchu správně.
i je běžný inkrementační prvek
r je radius
s je space
Repeat je pravda trochu programátorská ohavnost,
ale je kratší a přehlednější. Není důvod ho nepoužít.
Ta závorka v porovnávání je normální překlep.
Nenapadlo mě, že tak průhledný a krátký kód musím vůbec řešit.
V tom GMK je to samozřejmě funkční. Ten závorkový překlep tam
sice je, ale to nemá na funkčnost žádný vliv. Proto jsem to
taky přehlédl. I to se stane.
Ale abych tady nenechával rozvrtaný kód, zkusím to znovu vložit
a snad tentokrát lépe:
Create:
password='devbook';
keyboard_string='';
unlocked=0;
Draw
var i,r,s ;
i=0; r=4; s=11;
repeat string_length(keyboard_string)
{
draw_ellipse_color((s*i)+x-r-1,y-r-1,(s*i)+x+r+1,y+r+1,c_black,c_black,0);
draw_ellipse_color((s*i)+x-r,y-r,(s*i)+x+r,y+r,c_black,c_white,0);
i+=1;
}
if (unlocked)
{
draw_set_alpha(0.5);
draw_line_width_color(5+x+(s*i),y,11+x+(s*i),y+6,5,c_black,c_black);
draw_line_width_color(10+x+(s*i),y+5,18+x+(s*i),y-11,5,c_black,c_black)
draw_set_alpha(1);
draw_line_width_color(5+x+(s*i),y,10+x+(s*i),y+5,3,c_green,c_lime);
draw_line_width_color(10+x+(s*i),y+5,17+x+(s*i),y-10,3,c_green,c_lime)
}
ReleaseEnter
if (keyboard_string=password)
{ unlocked=1; }
Repeat je cyklus bez řídící proměnné, for cyklus je cyklus s řídící proměnnou. Zde se do repeat vloží řídící proměnná, to nedává smysl.
Máš pravdu, radius dává smysl, ale na space bych tedy nepřišel
Jenže v daném cyklu i
není řídicí proměnnou, ale
počitadlem. Kdyby byla řídicí proměnnou, přestala by po opuštění cyklu
platit a nemohla by se použít v následujícím bloku if
.
Viděl bych to takhle (snad neudělám chybu, nechce se mi to zkoušet):
Create
password = 'devbook';
keyboard_string = '';
unlocked = false;
Draw
// zde by se možná dalo přiřadit rovnou
var r, space, length;
r = 4;
space = 11;
length = string_length(keyboard_string);
for (i = 0; i < length; i++)
{
// tady možná také to var, chtělo by zkusit...
// každopádně proč 4x počítat střed?
cx = space * i + x;
cy = y;
draw_ellipse_color(cx - r - 1, cy - r - 1, cx + r + 1, cy + r + 1, c_black, c_black, 0);
draw_ellipse_color(cx - r, cy - r, cx + r, cy + r, c_black, c_white, 0);
}
if (unlocked)
{
draw_set_alpha(0.5);
// na tohle už nemám :D
draw_line_width_color(5+x+(space*length),y,11+x+(space*length),y+6,5,c_black,c_black);
draw_line_width_color(10+x+(space*length),y+5,18+x+(space*length),y-11,5,c_black,c_black)
draw_set_alpha(1);
draw_line_width_color(5+x+(space*length),y,10+x+(space*length),y+5,3,c_green,c_lime);
draw_line_width_color(10+x+(space*length),y+5,17+x+(space*length),y-10,3,c_green,c_lime)
}
ReleaseEnter
if (keyboard_string == password)
unlocked = true;
Místo
for (i = 0; i < length; i++)
musí být v GM
for (i = 0; i < length; i+=1)
jinak to ale máš hezké.
Těch způsobů je víc, možná bych raději preferoval
// snad to tak v GM funguje
var r=4; // poloměr
var space=11; // mezera mezi (čím?)
var length=string_length(keyboard_string);
Nemyslím si, že je vhodné dávat mezery do vzorců. Jsou pak zbytečně dlouhé, musí se zalamovat a k přehlednosti to nepřispívá. Naopak mezeru za čárkou v seznamu považuji za dobrý zvyk.
Hodilo by se použití několika konstant. Co třeba znamená číslo "5" v
seznamu parametrů funkce draw_line_width_color()
? Teď už vím,
že je to šířka, ale proč to tam není uvedeno?
Já jsem původně počítal s tím, že téměř všechno vykreslování
každý vymaže a přepíše podle svého.
V reálném použití bych použil sprity a samozřejmě je třeba ošetřit
ještě strašnou spoustu věcí.
Např. aby nešlo po napsání hesla psát dál - trapně zůstane zatrženo
heslo jako korektní. V zásadě by stačilo napsat, že to lze řešit přes
keyboard_string, ale bohužel by pak následovaly otázky: "Jo? A jak?"
Takhle jsem to považoval jen za názorné a návodné.
Nicméně píšu kódy jako prase a vím to. Už se toho snad ani neumím
zbavit. Takže díky za tu drobnou korekci.
Dokud nepoužíváš globální proměnné, skoky goto, flow-controll výjimkami a podobné nešvary, tak se to ještě dá.
Tomu se většinou vyhýbám - chci to občas přečíst i po sobě.
Jen nerozumím, proč tak horlivě všichni bojujete proti globálním
proměnným.
V GM jich je požehnaně takříkajíc od výroby. Např. score. Takže se
jim
vyhýbá celkem špatně a při jednoduchém použití a malém množství bych
řekl,
že zas tak neškodí. Jde jen o to udržet to na uzdě, ne?
Globální proměnné vývojářům "chutnají", protože jsou pohodlné. Jenže čím větší projekt, tím jsou hůř zvládnutelné. Pak se přistihneš při tom, že určitou funkci nemůžeš použít, protože používá nějakou globální proměnnou, ale ty tam potřebuješ jinou. A začneš předělávat.
Mnoho vývojářů si takové globální skladiště dělá v objektech. Výsledek bývá podobný, ale vydrží s tím o něco déle. Jen u toho mají pár getterů a setterů navíc, aby to nevypadalo, že jsou jelita.
Globální proměnné se používat dají, ale jen do určité velikosti aplikace. Pak se stanou brzdou. Je lepší si už od počátku jejího vývoje zvykat na lokální proměnné, parametry funkcí předávané hodnotou, návraty definovaného typu, chybové návraty jiným kanálem (výjimkami) apod.
Jde o to vytěsnit potřebu globálních proměnných, aby byly bloky kódu na sobě maximálně nezávislé, aby se program snadno udržoval a recykloval.
Jo, to zní logicky. Dík.
Obvykle to tu zaznívalo skoro jako kázání. "Nezglobálníš!"
Zajímavé přikázání
Používání globálních proměnných má velký vliv na uvažování programátora, brání myšlenkové dekompozici problému. Začne globalizovat i ty části kódu, které by měly být uzavřeny v nějaké funkci či metodě nějakého objektu.
Občas se v nějakém fóru dozvím o problému na 31255. řádku programu. Navíc se autor diví, proč je to pomalé. Pokud by provedl správnou dekompozici ...
Už rozumiem. Pri globálnych premenných si všetko pc musí ukladať, pričom lokálne premenné sú menej náročné na dočasnú pamäť. Tak je to?
Ale ja zatiaľ pracujem na malých projektoch. Ak budem chcieť mať väčšie projekty, radšej sa naučím iný jazyk.
Není to jen o úspoře paměti v PC, i když i ta může hrát roli, ale spíš je to o úspoře paměti v mozku vývojáře.
Jasné, ale v tomto prípade si myslím, že je to práve globálnou premenou jednoduchšie, pretože sa pomocou nej dajú pripojiť iné funkcie s inými objektami. Ale to už radšej nechajme. Ja totiž potrebujem odpoveď na moju predposlednú odpoveď (okrem tejto). Či a ako to (tie kódy) použijem v message?
V jednoduchých programech mohou být globální proměnné jednodušší, ale u tvého zdůvodnění mi vstávají vlasy na hlavě. Rozumný vývojář tohle nepoužívá. K tomu slouží parametry a návratové hodnoty funkcí.
Vlastne áno. Máš pravdu, sú tam aj iné možnosti ako prepojiť funkcie. Len ja som sa do takýchto zložitých aplikácií ešte nedostal a potrvá mi kým prídem na to ako použiť iné možnosti. Ale radšej sa vráťme k téme.
Ako to teda vložím do message?
No, nevložíš. Funkce skupiny message jsou dány Game Makerem a co v nich
není,
to tam nedáš. Kód, který jsme tady probírali funkci message
nepotřebuje.
Pokud bys z nějakého důvodu ( nenapadá mě jakého ) nutně potřeboval
použít
funkci message, musel bys zřejmě někde najít font, který má místo
písmen
samé puntíky. Pak bys asi dosáhl podobného efektu.
Objektové programování přináší náhled na aplikaci/hru jako na soustavu spolupracujících objektů. Každý objekt má nějaký stav tvořený hodnotami v jeho atributech (proměnných) a také umí vykonávat nějakou funkcionalitu (metody, v GM události a akce). Když chci zobrazit život, tak ten život někomu patří, je to něčí stav, něčí atribut. Takhle OOP (objektově orientované programování funguje) a GM ho velmi slušně podporuje a ctí, je v této oblasti překvapivě dobře navržený, umí dědičnost, přepisování metod a tak dále. Bohužel ačkoli Mark (autor) v tutoriálech uživatele k používání těchto věcí vybízí, moc lidí o nich ani neví. Ale zpátky k glob. proměnným, zde jsem chtěl jen dokázat, že GM je objektový nástroj.
Otázka nezní "Proč globální proměnné nepoužívat", zní: "Proč je používat?". Není k tomu žádný důvod a vyspělé programovací jazyky nic jako glob. proměnné ani nemají. Ten život prostě někomu patří, když ho dáš globální, protrhneš ten systém objektů a takové programování nedává smysl. To vůbec nemusíš hru do objektů rozdělovat, může být vše v jednom, všechny metody globální, všechny proměnné globální. Takto jazyky v minulosti opravdu vypadaly, naštěstí se došlo k tomu, že to vede do pekla.
Nebezpečí glob. proměnné je hlavně v tom, že když voláš nějakou funkci, tak ta funkce může měnit něco globálního a ty o tom ani nevíš. Když předáš funkci parametry a navrátí ti hodnotu, víš, kam hrabe a máš chování programu pod kontrolou. Chyb je najednou méně a jednoduše se hledají.
Dalším problémem glob. proměnných je jejich jméno, co když jich budeš mít hodně a zapomeneš, že global.c už máš a něco do ní uložíš, což rozbije úplně jiný objekt. Vše se navzájem ovlivňuje, je to ošklivé, nebezpečné, zastaralé a takhle bych mohl pokračovat.
Myslím, že jsem teď uvedl dost důvodů i příkladů, proč to nepoužívat. Nenapsal jsem jen, že to je špatně. Ještě k dotazu, proč je GM má. No protože v GM dělají hlavně neprogramátoři, spíše se v tom bastlí než programuje a globálnost patří do tohoto bastlení. Udělat životy objektově by bylo problémové v těch ikonkách, protože bys je musel nastavit nějaký objekt a to už ubírá potenciální zákazníky, co si GM koupí. Proto tam tyhle věci raději jsou, aby v tom mohlo dělat co nejvíce lidí. Obecně ale platí, že co v jazyce je není nutně správě.
V GM by se dalo dělat hezky, opravdu moc hezky. Problém je, že ti lidé ani nechtějí umět programovat a co vidím, to je bastl. Proto GM nemám rád.
Tak teraz tomu už konečne úplne rozumiem. Budem sa snažiť ich
nepoužívať, ale ešte ich nejakú dobu as budmem musieť používať,
pretože nemám na programovanie až toľko času. Čas je hlavný dôvod.
Ďakujem za vysvetlenie:)
Vytvoril som si font, tak ako si vravel, ale nefunguje to. Dočítal som sa, že message iné fonty nepodporuje.
Ale nevadí, nastavil som tam rovnakú farbu písma ako v poli, čiže text nevidno. Musel som improvizovať, pretože mám free verziu Game-makeru a nepodporuje časti kódu, ktoré ste mi poradili.
Už jsem to asi psal, ale možná to musím napsat znovu: Čas je hlavní důvod pro to, abys definitivně přestal používat globální proměnné. Čas, který ušetříš při vývoji s globálními proměnnými, mnohonásobně ztratíš při ladění a údržbě programu.
Ano, ve škole nás učili, že odstranit chybu u hotového projektu je asi 100x dražší, než jí předejít v počátečních fázích.
Nevím, co jsi kde četl, ale v mojí verzi 8.0 se v message změnit font
v pohodě nechá. Např:
message_input_font('Batang',12,c_yellow,0);
get_string('Heslo:','12345');
U free verze nevím. Je celkem přirozené, že tam něco nepojede,
ale těžko říct jestli právě toto.
Nevím, v čem šetří čas psát
global.zivot
místo
hrac.zivot
?
Možná jsi myslel čas ten projekt opravit, to chápu, pokud je od začátku takhle napsaný.
Navedl jsi mne na jednu myšlenku, která ve mně dřímala od doby
seznámení s globálními proměnnými Ruby: Kdyby se globální proměnné
nevolaly pouhým prefixem $promenna
, ale třeba klíčovým slovem
global_variables_for_dummies.promenna
, možná by tahle jednoduchá
pakárna odradila dostatek uživatelů od používání globálních
proměnných. Někdy stačí jen málo...
V Ruby ani nevím, že byly. Ale určitě to šlo udělat jako @@promenna, což je statika, šlo to použít i mimo třídu.
Pro message se používají fonty z Windows. Nejde použít resource font ze
hry.
To bude možná to, s čím je problém. Tzn. mělo by stačit ho nainstalovat
jako písmo.
Když ho GM uvidí ( bude ve všech nabídkách ), měl by fungovat.
Áno, možno. Ale v ostatných pc to asi fungovať nebude :/
Jediné, že sa to pridá všade mechanicky. Alebo použiť inštalačku.
JJ. To je trochu zbytečně velké harakiri.
Ono dost záleží, o čem to vlastně celé bude.
Ono by to samozřejmě šlo i v té FREE verzi, vše se dá nahradit. Pokud nefunguje cokoli z vykreslování, stačí vykreslit sprite místo té elipsy. Pokud nefunguje ten keyboard_string, stačí si v create udělat string a v události keypress do něj připisovat tu klávesu. I kdyby to měl naklikat po písmenkách.
Zobrazeno 50 zpráv z 52.