Stránka 1 z 2

Monogame - Windows 8 RT (trable)

Napsal: pon črc 23, 2012 17:59
od Petrroll
Zdravím,
mám pár otázek k MonoGame pro Windows RT.

1) Jak normálně dostat aktuální rozlišení obrazovky / zaznamenat změnu (např. přechod do snapview). V 'GraphicsDevice.Viewport' se reálná šířka v pixelech objeví až po změně (např. při změně v emulátoru) od začátku je tam jinak rozlišení 800x600.
Tohle rozlišení nutně potřebuju získat, abych s jeho pomocí inicializoval graphics.PreferredBackBufferWidth & graphics.PreferredBackBufferHeigh

2) Jak pracovat s user input. Jsem schopnej odchytávat Mouse.GetState & TouchPanel.GetState, problém je, že obě metody vrací výsledek v souřadnicích relativních k základním rozlišením (který jsou 3). Problém je, že stejně systém neupravuje vykreloslované textury, takže udělat nějak funkčí kontrolu kolize dotyk - textura je takřka nemožné.

3) Jak vyřešit herní menu? Nejraději bych použil XAML, bohužel nevím jak MonoGame & XAML zkombinovat. Případně bych vše udělal v MonoGame, zde by se mi ale hodil nějaký tutorial jak spracovat vlastní oddělené obrazovky a nezamotat se v tom.

4) A nakonec, jen případně, neexistuje v klasickém WinRT C#/XAML nějaký Timer schopný tiknout alespoň 20/ sekundu? Kdyby ano, tak hru udělám v XAMLu a tohle neřeším.
//DispatcherTimer je bohužel nepoužitelný

Monogame - Windows 8 RT (trable)

Napsal: pon črc 23, 2012 18:08
od MartinKase
1, Mám totožnou chybu ale když jsem hru tvořil pro rozlišení 1366x768 tak se my vykreslovalo pole pouze 800x480 a musel jsem napevno stanovit rozlišení 1366x768 ale při této změně v jiném rozlišení hra sice běží a vypadá dobře ale zato se posunuly kolize dotyku. Při jaké změně se načtou správné hodnoty do GraphicsDevice.Viewport ?

Monogame - Windows 8 RT (trable)

Napsal: pon črc 23, 2012 18:26
od Petrroll
Když v emulátoru změníš rozlišení / velikost displeje.
Problém je, že u vyšších rozlišení se doteky (kolize) stejně přepočítávají na to základní 1366x768. Takže když máš na FullHD displeji např. texturu v levém horním rohu s velikostí 1000x1000, tak se zobrazuje cca na většině levé poloviny (vůči rozlišení obrazovky 1:1). Když ale klikneš na její pravý dolní roh, tak ti Mouse.State vrátí cca 860x600 (tj. proporciálně správně oproti 1366x768) a ne 1000x1000, což by bylo správně vůči reálnému rozlišení obrazovky.

A to ani nezmiňuji, že pro vyšší rozlišení tabletů & velkých displejů je základních rozlišení (tj. jako 1366x768 vice). Celkem jsem napočítal 3. Je to prostě hrůza hrůzoucí.

Nicméně, jak řešít menu a tyhle věci?

Monogame - Windows 8 RT (trable)

Napsal: pon črc 23, 2012 18:35
od MartinKase
Menu řeším stejně jak u wp7 jen jsem přidal tlačítko zpět. Při změně rozlišení mi ale mouse event bere kolize furt jako 1366x768 a ne jako jine rozliseni.

Monogame - Windows 8 RT (trable)

Napsal: pon črc 23, 2012 19:15
od Martin Suchan
na zjistovani snapped modu postupuj podle tohoto navodu>
http://blogs.msdn.com/b/davedev/archive ... cript.aspx" onclick="window.open(this.href);return false;
Jinak ti moc neporadim - na menu bych pouzil XAML, ale nevim, jak by si to rozumelo s MonoGame.

Monogame - Windows 8 RT (trable)

Napsal: pon črc 23, 2012 21:00
od Petrroll
A nezkoušel tu někdo hry v XAML? Nepotřebuju toho moc, jen Timer, kterej dokáže tikat s přesností na desetinu (nejlépe setinu) vteřiny.

Konkrétně předělávám hru Dotty, kde jde o časovou přesnost docela dost (chyby v desetinách vteřiny jsou už moc). DispatcherTimer se na to tedy nehodí.

Neexistuje nějaký jiný, lepší Timer? Klidně se ponořím do druhého vlákna.

Ke změně rozlišení, ano MouseEvent bere stále špatné - snížené rozlišení, ale v GraphicsDevice.Viewport se už nachází rozlišení správné.

Monogame - Windows 8 RT (trable)

Napsal: úte črc 24, 2012 8:29
od Sirall
@Petrroll

Zdravím
Petrroll píše:1) Jak normálně dostat aktuální rozlišení obrazovky / zaznamenat změnu (např. přechod do snapview). V 'GraphicsDevice.Viewport' se reálná šířka v pixelech objeví až po změně (např. při změně v emulátoru) od začátku je tam jinak rozlišení 800x600.
Tohle rozlišení nutně potřebuju získat, abych s jeho pomocí inicializoval graphics.PreferredBackBufferWidth & graphics.PreferredBackBufferHeigh
Je důležití v který okamžik k údajům přistupuješ. Pokud v konstruktoru tvé poděděné třídy Game, tak tam budeš mít ještě 800x600, pokud v přetížené metodě Initialize, tak budeš mít už "virtuální" rozlišení, které potřebuješ. Je důležité si uvědomit, že rozlišení s kterým pracuješ nemusí odpovídat fyzickému rozlišení tvého monitoru, protože systém ještě zohledňuje DPI a ty pracuješ s rozlišením, které ti až přidělí systém. Ono fyzické rozlišení ani nepotřebuješ, tím by jsi přišel o úžasnou vlastnost Windows 8 zachovat čitelnost všech aplikací na všech monitorech. V metodě Initialize si pak získej rozlišení z this.Window.ClientBounds.Width resp. this.Window.ClientBounds.Height.
+ Určitě si zaregistruj callback pro změnu rozlišení.

Petrroll píše:2) Jak pracovat s user input. Jsem schopnej odchytávat Mouse.GetState & TouchPanel.GetState, problém je, že obě metody vrací výsledek v souřadnicích relativních k základním rozlišením (který jsou 3). Problém je, že stejně systém neupravuje vykreloslované textury, takže udělat nějak funkčí kontrolu kolize dotyk - textura je takřka nemožné.

Co myslíš tím, že systém neupravuje vykreslované textury?
Petrroll píše:3) Jak vyřešit herní menu? Nejraději bych použil XAML, bohužel nevím jak MonoGame & XAML zkombinovat. Případně bych vše udělal v MonoGame, zde by se mi ale hodil nějaký tutorial jak spracovat vlastní oddělené obrazovky a nezamotat se v tom.

Tady moc nepomůžu, vím že zkombinovat MonoGame a XAML jde, používá to například hra Armed!, ale víc nevím. Já si vždy menu a veškeré GUI komponenty řeším sám přímo v XNA. Každopádně pro XNA existuje celá řada managerů herních obrazovek, tak bych nějaký vyzkoušel v MonoGame. API je stejné, takže by to mělo fungovat.
Petrroll píše:4) A nakonec, jen případně, neexistuje v klasickém WinRT C#/XAML nějaký Timer schopný tiknout alespoň 20/ sekundu? Kdyby ano, tak hru udělám v XAMLu a tohle neřeším.
//DispatcherTimer je bohužel nepoužitelný
XAML na tohle není určený, to možná lepší řešení je pro tebe HTML5 + JavaScript. Minimálně v XAMLu a Silverlightu pro web ale možnost takového Timeru bývala viz. http://www.silverlight.net/archives/vid ... xaml-timer" onclick="window.open(this.href);return false;
Víc bohužel asi nepomůžu.

Sirall

Monogame - Windows 8 RT (trable)

Napsal: úte črc 24, 2012 9:37
od Petrroll
Předně díky moc, konečně už to funguje jak má!

2) Tahle otázka vzešla jen ze zmatenosti, když jsem totiž předával fyzické rozlišení displeje, tak nesouhlasili reálné souřadnice a souřadnice, které vracel TouchPanel.State a Mouse.State. Už to ale chápu a vím, jak vyřešit.

Monogame - Windows 8 RT (trable)

Napsal: úte črc 24, 2012 10:01
od MartinKase
Perfektní, už my to také ukazuje správné rozlišení když dám breakpoint a podívám se na proměnné this.Window.ClientBounds.Height, ale hra se mi vykresluje na 800*480...

Monogame - Windows 8 RT (trable)

Napsal: úte črc 24, 2012 10:03
od Petrroll
Přesně tak, když v Initu nastavím rozlišení pomocí:

graphics.PreferredBackBufferWidth = this.Window.ClientBounds.Width;
graphics.PreferredBackBufferHeight = this.Window.ClientBounds.Height;
graphics.ApplyChanges();

Tak se stále vše vykresluje v 800x480, proč? To je záhada.

Monogame - Windows 8 RT (trable)

Napsal: úte črc 24, 2012 10:17
od MartinKase
Vyřešil jsem to tak že jsem si dal v game natvrdo rozlišení ve kterém jsem hru tvořil:
graphics.PreferredBackBufferWidth = 1366;
graphics.PreferredBackBufferHeight = 768;
pak si v initializaci zjistím rozlišení, a ukáže my rozlišení displeje. I když mám totiž natvrdo rozlišení hry tak se zobrazí pravé rozlišení displeje. A hra se vždy přizpůsobí displeji.

Monogame - Windows 8 RT (trable)

Napsal: úte črc 24, 2012 10:21
od Petrroll
Moh' bys to trochu rozvést? Moc to nechápu.
Když totiž hru hodíš natvrdo do 1366x768, tak například v 1280x800 bude šišatě rozplácnutá a nebude ti fungovat zjišťování souřadnice prstu. (poměrně logicky, protože vykreslovat se bude v 1366x768, zatímco souřadnice logický bude brát podle 1280x800)

Monogame - Windows 8 RT (trable)

Napsal: úte črc 24, 2012 10:43
od MartinKase
Pokud děláš přes mouse API musíš vše převádět na procenta. A jo trošku se to roztáhne nebo smrskne. Ale pokud budeš dělat v procentech bude to fungovat:
Ukázka:
if (mouseStateCurrent.X >= sirkaobrazu / 100 * 42.02049 && mouseStateCurrent.X <= sirkaobrazu / 100 * 42.02049 + submit3.Width && mouseStateCurrent.Y >= vyskaobrazu / 100 * 35.026041 && mouseStateCurrent.Y <= vyskaobrazu / 100 * 35.026041 + submit3.Height && mouseStateCurrent.LeftButton == ButtonState.Pressed && mouseStatePrevious.LeftButton == ButtonState.Released)
Procenta si počítám ručně na kalkulačce.
Návod:
Já hru tvoří pro rozlišení 1366*768 takže počítám s ním.
Máš například pozici 584*246 v rozlišení 1366*768 a chceš zjistit procenta která dosadíš: sirkaobrazu / 100 * (sem).
Takže 1366 vydělíš 100 = 13,66 a 584 vydělíš 13,66 což jen 42,752 a to jsou tvá procenta která dodáš : sirkaobrazu / 100 * (sem). To semé s druhou pozicí: Takže 768 vydělíš 100 = 7,68 a 246 vydělíš 7,68 což jen 33,333 a to jsou tvá procenta která dodáš : vyskaobrazu / 100 * (sem). Doufám že jsem to vysvětlil správně :)

Monogame - Windows 8 RT (trable)

Napsal: úte črc 24, 2012 11:10
od Petrroll
Jasně, to je docela slušné obcházení. Nicméně raději bych to vyřešil jinak (věřím, že to jde).
Pro ty co čtou jen poslední příspěvek tedy:

Když v Initu nastavím rozlišení pomocí:

graphics.PreferredBackBufferWidth = this.Window.ClientBounds.Width;
graphics.PreferredBackBufferHeight = this.Window.ClientBounds.Height;
graphics.ApplyChanges();

Tak se stále vše vykresluje v 800x480, proč? To je záhada.

Navíc v Initu this.Window.ClientBounds.Height hází reálné rozlišení a ne virtuální, které potřebuji kvůli škálování.

Monogame - Windows 8 RT (trable)

Napsal: úte črc 24, 2012 16:54
od Sirall
No, pokud vím, tak výchozí nastavení MonoGame je na 800x600, takže to, že se aplikace/hra vykresluje v 800x480 bude něčím jiným. Předpokládám, že se jedná o port nějaké hry z Windows Phone na Metro? Problém bych hledal teď v aplikaci samotné.

MonoGame trochu mění rozlišení podle DPI také, tak je možné, že vnitřně jej vrací na to reálné. Až někdy zítra nabootuju do osmiček, tak se na to podívám.

Monogame - Windows 8 RT (trable)

Napsal: úte črc 24, 2012 21:18
od Petrroll
V samotné hře nikde jinde rozlišení nenastavuju. Co jsem teď zkoušel, tak this.Window.ClientBounds.Width navíc obsahuje reálné rozlišení.

Bylo mi řečeno, že by údajně mělo fungovat ' CoreWindow.Bounds', problém je, že se mi v Monu nedaří najít, kde vzít CoreWindow objekt.

Monogame - Windows 8 RT (trable)

Napsal: stř črc 25, 2012 17:25
od Petrroll
Už to řeším přímo na MonoGame foru a vypadá to, že je problém přímo u nich. Nicmeně velké díky všem, kteří se pokusili pomoci.
http://monogame.codeplex.com/discussions/387932" onclick="window.open(this.href);return false;

Monogame - Windows 8 RT (trable)

Napsal: čtv črc 26, 2012 12:20
od Sirall
No tak jsem se na to koukal s poslední verzí MonoGame a opravdu to vypadá že je to u nich. Po nastavení bufferů a všeho stejně je viewport nastaven na 800x480.

Já používáme verzi MonoGame z května a mám ji docela dost upravenou, tak jsem tam tuhle chybu neměl.

Monogame - Windows 8 RT (trable)

Napsal: čtv črc 26, 2012 13:54
od Sirall
Tak jsem si s tím trochu hrál a povedlo se mi naší hru Rune Legend rozběhat na aktuální verzi MonoGame. Beru zpět že by se mělo rozlišení nastavovat v Initu, musí se to udělat už v konstruktoru.:

this.m_pGraphics = new GraphicsDeviceManager(this);
this.Window.ClientSizeChanged += Window_ClientSizeChanged;

this.m_pGraphics.PreferMultiSampling = true;
this.m_pGraphics.PreferredBackBufferFormat = SurfaceFormat.Color;
this.m_pGraphics.PreferredBackBufferWidth = this.Window.ClientBounds.Width;
this.m_pGraphics.PreferredBackBufferHeight = this.Window.ClientBounds.Height;
this.m_pGraphics.ApplyChanges();

Windows.Graphics.Display.DisplayProperties.AutoRotationPreferences = Windows.Graphics.Display.DisplayOrientations.Landscape;

Pak už se viewport a vše nastavuje v pořádku.

Monogame - Windows 8 RT (trable)

Napsal: čtv črc 26, 2012 14:51
od MartinKase
WoW, moc děkuji perfektní funguje :) (jen this.Window.ClientSizeChanged += Window_ClientSizeChanged; my hází chybu že Window_ClientSizeChanged neexistuje)
Obrázek