Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Zdravím, dělám si různé kontrolky do hry - Button, TextBox a potřebuju udělat MessageBox, prostě zobrazím zprávu a uživatel ji bud jenom zavře nebo dá ano / ne. Jakým způsobem to realizovat ? Určitě by bylo dobrý to mít statické a zavolat jenom MessagePop.Show("A­hoj",MessageBut­tons.Ok);

Jenže. Jakým způsobem zajistit, že se bude vykreslovat, updatovat tak dlouho dokud uživatel nezareaguje a zároveň sám sebe "zničí" tedy přestane se updatovat / vykreslovat ? Díky moc za jakékoliv pošťouchnutí :)

Odpovědět 6.5.2013 21:54
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Petr Nymsa
Petr Nymsa:

Vím, že to není správné, ale už je to 3. vlákno co nikdo neodpovídá, jelikož se vždy propadnu :P

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

Nahoru Odpovědět 6.5.2013 22:15
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
David Čápka:

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.

Nahoru Odpovědět 7.5.2013 9:44
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:

Hmm to mě nenapadlo. Jo díky, zkusím :)

Nahoru Odpovědět 7.5.2013 10:35
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:

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

Nahoru Odpovědět 7.5.2013 12:11
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
David Čápka:

No jasně, v Tetris to mám takhle udělané :D 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.

Nahoru Odpovědět 7.5.2013 12:19
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:

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š,...

Nahoru Odpovědět 7.5.2013 12:27
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
David Čápka:

A co udělat ShowMessage na Game1? ;-)

Nahoru Odpovědět 7.5.2013 12:44
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:

Hmm no jo :D 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 :D

Nahoru Odpovědět 7.5.2013 13:11
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

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.

Nahoru Odpovědět 7.5.2013 13:30
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:

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ě :D .... asi budu pokračovat dál v tvorbě a tohle nechám na později.

Editováno 7.5.2013 20:46
Nahoru Odpovědět 7.5.2013 20:46
Pokrok nezastavíš, neusni a jdi s ním vpřed
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 11 zpráv z 11.