Diskuze: Lekárnička

Ostatní jazyky GameMaker GameMaker Lekárnička

Avatar
MrOrisek
Člen
Avatar
MrOrisek:

Dobrý den a rovnou šťastný nový rok přeji, ale teď k věci
Udělal jsem si lékarničku úplně normálně funguje akorát mi to píše jeden error nevíte co mám špatně prosím ???

if global.zivot>50;
{
    global.zivot+=50
}

ERROR --

ERROR in
action number 1
of Collision Event with object o_medik
for object o_hrac:

Error in code at line 1:
   if global.zivot>50;
                    ^
at position 19: Statement expected.

Díky předem :)

 
Odpovědět 1.1.2013 13:16
Avatar
TomBen
Redaktor
Avatar
Odpovídá na MrOrisek
TomBen:

Nemá tam být ten středník u podmínky.

Nahoru Odpovědět 1.1.2013 13:22
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
MrOrisek
Člen
Avatar
Odpovídá na TomBen
MrOrisek:

Když tam není středník tak ta lékarnička nejde sebrat a nepřičte to životy :(

 
Nahoru Odpovědět 1.1.2013 13:27
Avatar
Kit
Redaktor
Avatar
Odpovídá na MrOrisek
Kit:

Protože tu podmínku máš obráceně.

Nahoru Odpovědět 1.1.2013 13:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
MrOrisek
Člen
Avatar
Odpovídá na Kit
MrOrisek:

Jak jako obráceně ? :-D

 
Nahoru Odpovědět 1.1.2013 13:32
Avatar
Kit
Redaktor
Avatar
Odpovídá na MrOrisek
Kit:

Protože potřebuješ oživit jen pokud máš méně než 50.

Nahoru Odpovědět 1.1.2013 13:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na MrOrisek
matesax:

Vtip?

Aktuálně máš:

pokud je hodnota proměnné global.zivot větší než 50, pak k ní přičti 50...

Je to ale blbost - protože se to vždy řeší tak, že lákarnička přičítá podle velikosti - malá, velká - každopádně nějakou konstatní hodniotu - a pokud je situace, že neumíráš, ale jsi zraněn - a lékárnička by ti přesáhla limit maximálních životů, doplníš je jen na max - ne o konstantu - takže buď použiješ něco jako Math.Min, nebo to uděláš takto:

global.zivot += 50

if (global.zivot > max)
    global.zivot = max;
Editováno 1.1.2013 13:42
 
Nahoru Odpovědět 1.1.2013 13:38
Avatar
MrOrisek
Člen
Avatar
MrOrisek:

Aha .... Problem byl v něčem jiném. Měl sem to v kolyzi z hračem a lékarničkou místo Lekárnička z hráčem. I tak děkuji za váš čas a nápomoc :)

 
Nahoru Odpovědět 1.1.2013 13:42
Avatar
Kit
Redaktor
Avatar
Odpovídá na MrOrisek
Kit:

Myslím si, že původní požadavek je doplnit životy do 100, nejvýše však o 50.

global.zivot = min(global.zivot + 50, 100);
Nahoru Odpovědět  +2 1.1.2013 13:43
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Jen pro zajímavost - pod min je podmínka - co? :) Jakože - to je ale velká zkratka... :)

 
Nahoru Odpovědět 1.1.2013 13:45
Avatar
MrOrisek
Člen
Avatar
MrOrisek:

Děkuju vám moc :)

 
Nahoru Odpovědět 1.1.2013 13:47
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Neznám syntaxi GM ani jeho knihovny, nikdy jsem v něm nedělal. Jestli je to min() nebo Math.min() je mi vcelku jedno, napsal jsem jen princip.

Operátor +=, /= jsou v objektovém programování dost nebezpečné, protože občas dělají i to, co nechceme. Zvykl jsem si i na jazyk, ve kterém se obsah proměnných nedá modifikovat.

Nahoru Odpovědět 1.1.2013 14:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
MrOrisek
Člen
Avatar
MrOrisek:

Mohl bych se ještě zeptat jak mám nahrát do pozadí menu hudbu ?

 
Nahoru Odpovědět 1.1.2013 14:09
Avatar
vodacek
Redaktor
Avatar
Odpovídá na Kit
vodacek:

eh v čem je += nebezpečné? možná leda tím že je nebezpečně krátké nic jiného mě nenapadá

 
Nahoru Odpovědět 1.1.2013 14:13
Avatar
Kit
Redaktor
Avatar
Odpovídá na vodacek
Kit:

Viz včerejší převod do izometrického zobrazování. David Čápka tam před převodem vydělil původní souřadnice. Pokud by ty původní souřadnice potřeboval i někde jinde, třeba v jiné metodě, asi by se divil. Zásadou je, aby metoda měla co nejméně postranních efektů.

Netýká se to tohoto případu. Je však chybou, pokud obsah proměnné modifikuješ dvakrát místo jednou.

Nahoru Odpovědět 1.1.2013 14:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Napadlo mě vzít tvůj zápis

global.zivot += 50;

if (global.zivot > max)
    global.zivot = max;

a trochu mu upravit okolní podmínky. Řekněme, že programátor bude chtít ušetřit místo a tak dekladuje global.zivot typu byte, který je použitelný pro interval -128..127. Proč ne? Životy budou přece v rozsahu 0..100, tak to stačí. Hráč bude mít při hře 80 životů a dotkne se lékárny. Hodnota se navýší o 50, tedy na 130. Jenže to už dojde k přetečení a do proměnné se uloží hodnota -126. Následující podmínka nebude splněna a korekce se neprovede. Zdravý hráč při kontaktu s lékárnou chcípne.

Nahoru Odpovědět 1.1.2013 14:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Kit
TomBen:

Což by se ovšem nestalo, kdyby byla nejprv podmínka a pak změna.
Samotný zápis += s tím zas tak moc nemá do činění, ne?

Editováno 1.1.2013 15:08
Nahoru Odpovědět 1.1.2013 15:07
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Kit
Redaktor
Avatar
Odpovídá na TomBen
Kit:

V daném případě ne. Jsou situace, kdy je naopak použití += žádoucí. Například pokud je += přetíženo na příkaz ADD do objektu nebo databáze. V tom případě by příklad musel vypadat takto:

global.zivot += 50;

Samotné omezení by bylo v setteru. Podle mne by to bylo nejlepší řešení i v této situaci, ale určitě bych tyto dva přístupy nekombinoval.

Nahoru Odpovědět 1.1.2013 15:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Jak to s tím souvisí? To se podělá tak jako tak - když to bude byte:

global.zivot = min(-126, 100);

Tak proč to vůbec napadáš? Přeci nebudu debil, a když si dám ten typ byte, tak zvolím jiný postup...

Vysvětli mi, proč používat byte na životy... To rovnou můžeš psát v 0 a 1... :)

Editováno 1.1.2013 15:28
 
Nahoru Odpovědět 1.1.2013 15:25
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Já to nenapadám. Jen jsem na tvůj algoritmus nasadil jiné (trochu extrémní) okolní podmínky. Ty jsi funkci min() nepoužil.

Pokud nedeklaruješ proměnné uvnitř metody, musíš s podobnými zhovadilostmi počítat. Proto je lepší to dát přímo do setteru a přetížit +=, viz výše.

Editováno 1.1.2013 15:31
Nahoru Odpovědět 1.1.2013 15:28
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Ukázal jsem, že selhala - vyšlo by z ní záporné číslo - takže jsi napadl mé i tvé řešení... Osobně bych vůbec nedělal v GM - a osobně bych se nezabýval hrami - ale také to sem nepíši... A osobně bych nepoužíval globální proměnné... Kdybych se tu zabýval všemi možnostmi, tak bych se...

Editováno 1.1.2013 15:35
 
Nahoru Odpovědět 1.1.2013 15:34
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Jak jsem napadl své řešení?

Nahoru Odpovědět 1.1.2013 15:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:
Myslím si, že původní požadavek je doplnit životy do 100, nejvýše však o 50.

global.zivot = min(global.zivot + 50, 100);

V případě byte vyjde záporné číslo...

Napadlo mě vzít tvůj zápis

global.zivot += 50;

if (global.zivot > max)
    global.zivot = max;

a trochu mu upravit okolní podmínky. Řekněme, že programátor bude chtít ušetřit místo a tak dekladuje global.zivot typu byte, který je použitelný pro interval -128..127. Proč ne? Životy budou přece v rozsahu 0..100, tak to stačí. Hráč bude mít při hře 80 životů a dotkne se lékárny. Hodnota se navýší o 50, tedy na 130. Jenže to už dojde k přetečení a do proměnné se uloží hodnota -126. Následující podmínka nebude splněna a korekce se neprovede. Zdravý hráč při kontaktu s lékárnou chcípne.

Takže k čemu jsi to psal??

 
Nahoru Odpovědět 1.1.2013 15:38
Avatar
TomBen
Redaktor
Avatar
TomBen:

Asi už se to posunulo hodně mimo rámec původního dotazu.
GM neumí byte, proměnná global.zivot je sporná sama o sobě
a přetěžování v GM nelze nijak určovat.

Autor dotazu poděkoval a s tím bych to zabalil.

Nahoru Odpovědět 1.1.2013 15:38
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
matesax
Redaktor
Avatar
Odpovídá na TomBen
matesax:

Však na to jsem reagoval i já...

 
Nahoru Odpovědět 1.1.2013 15:40
Avatar
TomBen
Redaktor
Avatar
Odpovídá na matesax
TomBen:

Co psal Kit mi přišlo zajímavé, ale dohadovat se tu skrz to nemusíme.

Nahoru Odpovědět 1.1.2013 15:44
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Kit
Redaktor
Avatar
Odpovídá na TomBen
Kit:

Ber to trochu s rezervou, protože v C# se operátor += přetížit nedá a zřejmě ani v GM ne.

Nahoru Odpovědět 1.1.2013 16:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Kit
TomBen:

V GM se toho vůbec moc nedá. :)

Nahoru Odpovědět 1.1.2013 16:37
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Já stejně nikdy nepochopil potřebu přetěžovat - nebyl jsem v situaci, kdy by nestačilo vytvořit si metodu a tu volat...

 
Nahoru Odpovědět 1.1.2013 16:50
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

V PHP se přetěžování občas hodí:

$a1 = array('jablka' => 8, 'hrusky' => 5);
$a2 = array('jablka' => 6, 'svestky' => 2);

var_dump($a1 + $a2); // array('jablka' => 8, 'hrusky' => 5, 'svestky' => 2)

V C# a Javě se zase běžně přetěžuje "+" u řetězců nebo metoda toString() u objektů.

Nahoru Odpovědět 1.1.2013 17:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Ještě, že já v PHP neprogramuji... :) Vlastně jednou v začátcích mé kariéry :), jsem studoval přetížení výpisu z pole - ale nikdy bych to již nevyměnil za LINQ... A LINQ je vlastně dobrý nástroj pro obdobu ToString - ovšem s vlastním nastavením logiky...

Editováno 1.1.2013 19:52
 
Nahoru Odpovědět 1.1.2013 19:51
Avatar
hondre
Člen
Avatar
hondre:

Vím, že se to nevstahuje k této debatě, ale chtěl bych se zeptat, když chci do té soutěže poslat hru, co mám udělat ?

 
Nahoru Odpovědět 2.1.2013 12:57
Avatar
Vašek
Člen
Avatar
Odpovídá na hondre
Vašek:

Musíš si zažádat o redaktorská práva a dáš jí do kategorie devbookátor jako ukázkovou hru.

 
Nahoru Odpovědět 3.1.2013 9:57
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 33 zpráv z 33.