Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petr Nymsa
Tvůrce
Avatar
Petr Nymsa:6.5.2013 21:54

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
Tvůrce
Avatar
Odpovídá na Petr Nymsa
Petr Nymsa:6.5.2013 22:15

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 Hartinger
Vlastník
Avatar
Odpovídá na Petr Nymsa
David Hartinger:7.5.2013 9:44

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
You are the greatest project you will ever work on.
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na David Hartinger
Petr Nymsa:7.5.2013 10:35

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
Tvůrce
Avatar
Odpovídá na David Hartinger
Petr Nymsa:7.5.2013 12:11

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 Hartinger
Vlastník
Avatar
Odpovídá na Petr Nymsa
David Hartinger:7.5.2013 12:19

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
You are the greatest project you will ever work on.
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na David Hartinger
Petr Nymsa:7.5.2013 12:27

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 Hartinger
Vlastník
Avatar
Odpovídá na Petr Nymsa
David Hartinger:7.5.2013 12:44

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

Nahoru Odpovědět
7.5.2013 12:44
You are the greatest project you will ever work on.
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na David Hartinger
Petr Nymsa:7.5.2013 13:11

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
Tvůrce
Avatar
Petr Nymsa:7.5.2013 13:30

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
Tvůrce
Avatar
Odpovídá na David Hartinger
Petr Nymsa:7.5.2013 20:46

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.