Monogame - Windows 8 RT (trable)

Chcete vytvářet hry a aplikace pro Windows 8.1 či Windows 10, a nevíte si s něčím rady? Zkuste to v této sekci
Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Monogame - Windows 8 RT (trable)

Příspěvek od Petrroll » pon črc 23, 2012 17:59

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ý

Uživatelský avatar
MartinKase
nováček
nováček
Příspěvky: 44
Registrován: čtv zář 22, 2011 18:00
Zařízení: Nokia lumia 800
Bydliště: Ústí nad Labem

Monogame - Windows 8 RT (trable)

Příspěvek od MartinKase » pon črc 23, 2012 18:08

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 ?

Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Monogame - Windows 8 RT (trable)

Příspěvek od Petrroll » pon črc 23, 2012 18:26

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?

Uživatelský avatar
MartinKase
nováček
nováček
Příspěvky: 44
Registrován: čtv zář 22, 2011 18:00
Zařízení: Nokia lumia 800
Bydliště: Ústí nad Labem

Monogame - Windows 8 RT (trable)

Příspěvek od MartinKase » pon črc 23, 2012 18:35

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.

Uživatelský avatar
Martin Suchan
smartmaniak
smartmaniak
Příspěvky: 1138
Registrován: pát bře 11, 2011 10:48
Zařízení: Nokia Lumia 925
Bydliště: Praha

Monogame - Windows 8 RT (trable)

Příspěvek od Martin Suchan » pon črc 23, 2012 19:15

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.

Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Monogame - Windows 8 RT (trable)

Příspěvek od Petrroll » pon črc 23, 2012 21:00

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é.

Sirall
nováček
nováček
Příspěvky: 6
Registrován: pon led 09, 2012 0:37
Zařízení: hTC HD7

Monogame - Windows 8 RT (trable)

Příspěvek od Sirall » úte črc 24, 2012 8:29

@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

Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Monogame - Windows 8 RT (trable)

Příspěvek od Petrroll » úte črc 24, 2012 9:37

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.

Uživatelský avatar
MartinKase
nováček
nováček
Příspěvky: 44
Registrován: čtv zář 22, 2011 18:00
Zařízení: Nokia lumia 800
Bydliště: Ústí nad Labem

Monogame - Windows 8 RT (trable)

Příspěvek od MartinKase » úte črc 24, 2012 10:01

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

Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Monogame - Windows 8 RT (trable)

Příspěvek od Petrroll » úte črc 24, 2012 10:03

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.

Uživatelský avatar
MartinKase
nováček
nováček
Příspěvky: 44
Registrován: čtv zář 22, 2011 18:00
Zařízení: Nokia lumia 800
Bydliště: Ústí nad Labem

Monogame - Windows 8 RT (trable)

Příspěvek od MartinKase » úte črc 24, 2012 10:17

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.

Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Monogame - Windows 8 RT (trable)

Příspěvek od Petrroll » úte črc 24, 2012 10:21

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)

Uživatelský avatar
MartinKase
nováček
nováček
Příspěvky: 44
Registrován: čtv zář 22, 2011 18:00
Zařízení: Nokia lumia 800
Bydliště: Ústí nad Labem

Monogame - Windows 8 RT (trable)

Příspěvek od MartinKase » úte črc 24, 2012 10:43

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ě :)

Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Monogame - Windows 8 RT (trable)

Příspěvek od Petrroll » úte črc 24, 2012 11:10

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í.

Sirall
nováček
nováček
Příspěvky: 6
Registrován: pon led 09, 2012 0:37
Zařízení: hTC HD7

Monogame - Windows 8 RT (trable)

Příspěvek od Sirall » úte črc 24, 2012 16:54

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.

Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Monogame - Windows 8 RT (trable)

Příspěvek od Petrroll » úte črc 24, 2012 21:18

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.

Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Monogame - Windows 8 RT (trable)

Příspěvek od Petrroll » stř črc 25, 2012 17:25

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;

Sirall
nováček
nováček
Příspěvky: 6
Registrován: pon led 09, 2012 0:37
Zařízení: hTC HD7

Monogame - Windows 8 RT (trable)

Příspěvek od Sirall » čtv črc 26, 2012 12:20

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.

Sirall
nováček
nováček
Příspěvky: 6
Registrován: pon led 09, 2012 0:37
Zařízení: hTC HD7

Monogame - Windows 8 RT (trable)

Příspěvek od Sirall » čtv črc 26, 2012 13:54

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.

Uživatelský avatar
MartinKase
nováček
nováček
Příspěvky: 44
Registrován: čtv zář 22, 2011 18:00
Zařízení: Nokia lumia 800
Bydliště: Ústí nad Labem

Monogame - Windows 8 RT (trable)

Příspěvek od MartinKase » čtv črc 26, 2012 14:51

WoW, moc děkuji perfektní funguje :) (jen this.Window.ClientSizeChanged += Window_ClientSizeChanged; my hází chybu že Window_ClientSizeChanged neexistuje)
Obrázek

Odpovědět

Zpět na „Programujeme pro Windows 8.1 & Windows 10“

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti