Diskuze: MonoGame - MessageBox
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.