Diskuze: MonoGame - MessageBox
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 11 zpráv z 11.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Vím, že to není správné, ale už je to 3. vlákno co nikdo neodpovídá,
jelikož se vždy propadnu 
Našel jsem toto (http://roosterproduction.wordpress.com/…indows-only/)
Import určitého bordelu ze systému a tváří se to že to bude fungovat.
Každopádně to zobrazí klasický MessageBox, já bych chtěl vlastní.
Nastavit textury, font, barvy. Jak tedy prosím postupovat ?
Nevím jak udělat jakési sebevolání a sebezničení. Napadlo mě vytvoři druhé vlákno, což as itak běžně funguje a tím to aktualizovat a případně zavřít. A lze nějak uděla sebedestrukci ? Další věc, s vláky jsem nikdy nepracoval ale to se ihned rád doučím
Pokud máš ve své hře nějakou správu komponent, půjde to udělat velmi jednoduše. Messagebox ti zmrazí všechny běžící a přidá další co spravuje to okno, až klikneš, odebereš okno a spustíš zbytek.
Přemýšlím jak přizpůsobit návrh, tak abych prostě napsal čistě bud jenom metodu, která vytvoří nový MessageBox nebo udělat statickou třídu, která bude vědět o komponentách Game1 a jakmile se zavolá metoda Show, vypne komponenty. Komponenty zapne jakmile kliknu na tlačítko, ale ještě pořdně nevím jak dělat aktualizaci. Myslíš že to je takto půjde tvořit ? Správu obrazovek jsem prozatím obšlehl se zdejšího seriálu (Tetris v XNA), tj mám jej v Game1
No jasně, v Tetris to mám takhle udělané
Teď nevím kde je ta kolekce
obrazovek, ale asi bych tam vystavil statickou metodu Freez() a UnFreez(),
metoda na přidání komponenty tam myslím je.
Mám třídu GameScreen, ta obsahuje svoji kolekci komponent. V Game1 mám metodu ChangeScreen, která povypíná / zapne komponenty dané obrazovky. Udělat tedy v Game1 statické metody FreezeScreen() , která zmrazí update komponent, vykreslování nechám zaplé.
Jakým způsobem zajistit ale fungování MessageBoxu, statickou metodu Show(string text) s tím že, potřebuju vykreslovat a updatovat. Zachytit vstup od uživatele, kliknout na tlačítko a tím zavolat statickou metodu Game1 UnFreeze() která zapne Update komponent. Šlo by to nějak realizovat ? Mám ještě statickou třídu UserInput, kde uchovávám stisklé klávesy, myš,...
Hmm no jo
to by šlo.
Udělám si komponentu MessagePopUp, tu přidám při zavolání ShowMessage do
Components, komponenty aktuální obrazovky zmrazím a budu updatovat pouze
MessagePopUp, ještě přemýšlím, když budu chtít mít MessagePopUp
(MessageBox) s více tlačítky, jak efektivně vrátit výsledek na co kliknul.
Udělám si enum, který bude mít určité stavy.
Například v obrazovce Level zavolám při stisku mezeníku z game1
ShowMessage("Pokračovat?");
. Potřeboval bych aby mi vrátila výsledek. ShowMessage vypadá zatím takto
public void ShowMessage(string text)
{
popUp = new PopUpMessage(this, text, new Rectangle(10, 10, 80, 80));
this.Components.Add(popUp);
ChangeFreez();
}
Metoda ChangeFreez mění zmražení komponent aktuální obrazovky
public void ChangeFreez()
{
List<GameComponent> comp = currentScreen.GetComponents();
isFreez = !isFreez;
if (isFreez) // zmraženo
{
foreach (GameComponent p in Components)
{
bool state = comp.Contains(p);
p.Enabled = false;
}
}
else // odmražen
{
foreach (GameComponent p in Components)
{
bool state = comp.Contains(p);
p.Enabled = true;
}
}
}
Napadá mě jedině v Game1 mít událost MessageCanceled na kterou se budu muset v jednotlivých komponentách napojit, ale to je taky divný. Prostě nejlehší by bylo mít enum MessageStatus a při zavolání ShowMessage by to vrátilo i status co se stalo, tj použití
// byl jsem zabit, g =Game1
MessageResult = g.ShowMessage("Byl jsi zabit! Nová hra ?");
Už z toho blbnu 
Našel jsem toto http://msdn.microsoft.com/…ervices.aspx a toto http://zacharysnow.net/…ur-xna-game/ . Je to popsané pro Windows Phone ale vypadá to , že to lze použít i na klasickém Desktopu, zkusím to vůbec nejdřív v XNA, obávám se že MonoGame to nezvládne.
Nakonec jsem to vyřeši zatím jenom jako oznamovací MessageBox, tedy jediné tlačítko. Freeznu obrazovku a běží pouze komponenta, která představuje MessageBox, jenže přemýšlím jak efektivně vytvořit jakési vrácení stavu jak se zavřel - klikl na Ano nebo na Ne ?.
A nejlepší aby to vracela metoda , která volá ShowMessage, která ovšem zatím založí komponentu, přidá ji do compoennts a zmrazí. Poté vlastně z metody "odejdu" a běží update / draw komponent. Jakým způsobem vrátit stav ?
Napadlo mě jedině že bych si na místech kde dochází k volání MessageShow zaregistroval událost MessageBoxClosing, kde v argumentech by bylo napsané jakým zpsůboem to byl ozavřené, jenže všude kde bych měl použítý volání MessageBoxu bych musle zaregistrovat událost a jakmile by se vyvolala, zase ji odergistrovat, aby to nezachytávalo více míst najednou.
Nějaký nápad ? Nějak asynchronně ? já už fakt nevím, přemýšlím
opět moc složitě
....
asi budu pokračovat dál v tvorbě a tohle nechám na později.
Zobrazeno 11 zpráv z 11.