Vyvíjíme hry v XNA pro Windows Phone – Seminář 2

1,670 views

Published on

Prezentace z hands-on-labu o vývoji her v XNA, 20.3.2012 v Praze, viz http://vbnet.cz/blog-clanek--428-prezentace_a_materialy_z_hands_on_labu.aspx

  • Be the first to comment

  • Be the first to like this

Vyvíjíme hry v XNA pro Windows Phone – Seminář 2

  1. 1. Vývoj her v XNApro Windows Phone 7.5Tomáš Slavíčekmail@tomasslavicek.cz Twitter: @tomasslavicek
  2. 2. Agenda přesné pozicování (otáčení) animace, tiled grafika, pohyb pokročilejší kolize ve 2D načítání z XML „multitasking“ na WP, tombstoning zvuky a hudba, „Tango“ telefony propojení Silverlight + XNA
  3. 3. Windows Phone motivace
  4. 4. Windows Phone klíčová slova: Mango, Tango, Nokia
  5. 5. Budoucnost Windows 8 WP Apollo
  6. 6. Marketplace CZ přes 300 českých aplikací, 40 her
  7. 7. Podpora vývojářů soutěž o Lumia 800 msdn.cz/nokia soutěž s Mercedes-Benz hackathony
  8. 8. Další akce Nokia roadshow (dnes na Flóře) přednáška o Silverlightu zítra 28. března 2012, 17:30
  9. 9. Webové zdroje SmartMania.cz články rozcestník – můj blog tomasslavicek.cz
  10. 10. Hry na Windows Phone
  11. 11. Hry na Windows Phone ukázka…
  12. 12. Opakování XNA kdo ještě nezná?  vývoj pro PC, mobil, Xbox 360 herní smyčka, Content Pipeline, SpriteBatch…
  13. 13. Opakování XNA herní smyčka
  14. 14. Co budeme dělat? začátek nové hry obrázky:  bit.ly/xna_s2
  15. 15. Co budeme dělat? začátek nové hry obrázky:  bit.ly/xna_s2
  16. 16. Bylo minule… orientace displeje gesta na displeji akcelerometr pohyb objektů základní kolize text, Isolated Storage
  17. 17. Vykreslení obrázku objekt Sprite  Vector2 Position  Vector2 Size  Texture2D Texture  LoadContent()  Draw()
  18. 18. Obrázek i s rotací objekt Sprite  RotatedSprite  Vector2 Position  Vector2 Position  Vector2 Size  Vector2 AnchorPoint  Texture2D Texture  float Rotation  float Scale  LoadContent()  Texture2D Texture  Draw()  Color Color  Draw() x
  19. 19. Obrázek i s rotací parametry SpriteBatch.Draw() x
  20. 20. Animovaný obrázek několik měnících se obrázků objekt AnimatedSprite  poděděný od RotatedSprite  navíc: pole Textures  upravené LoadContent() Draw()
  21. 21. „Tiled“ grafika jeden obrázek hra se skládá z jeho výřezů  optimalizace výkonu
  22. 22. „Tiled“ grafika Tiled map editor mapeditor.com
  23. 23. Pohyb míčku úhel a rychlost  vektor přírustku odrážení od stěn ElapsedGameTime.TotalMilliseconds
  24. 24. Kolize bod vs. obdélník  rect1.Contains( point1 ) obdélník vs. obdélník  rect1.Intersects( rect2 )
  25. 25. Kolize kruh vs. kruh ?
  26. 26. Kolize kruh vs. kruh  vzdálenost středů < součet poloměrů  Vector2.Distance( center1, center2 ) < r1 + r2
  27. 27. Kolize kruh vs. obdélník ?
  28. 28. Kolize kruh vs. obdélník  najdu nejbližší bod od středu k obdélníku  nesmí být menší, než poloměr  Vector2.Clamp( v, min, max )
  29. 29. Kolize orientované obdélníky ?
  30. 30. Kolize orientované obdélníky  Separating Axis Theorem  za některou stranou 1. obdélníku se musí nacházet všechny body 2.
  31. 31. Separating axis theorem orientované obdélníky  nutné testovat oba vzájemně
  32. 32. Pozice bodu vůči přímce skalární součin  Vector2.Dot( … )  pro 2 normalizované vektory… v1.Normalize()  >0 …úhel >90° <0 … <90° =1 … rovnoběžné  pozor na přehozenou osu Y
  33. 33. Kolize kruh vs. orientovaný obdélník ?
  34. 34. Kolize kruh vs. orientovaný obdélník  pootočit souřadnice, aby byl obdélník osově srovnaný  angle = Math.Atan2( point1.Y - point2.Y, point2.X - point1.X )  Vector2.Transform( point, Matrix.CreateRotationZ( angle ))
  35. 35. Ukázka v praxi kruh vs. orientovaný obdélník  obdélník máme už reprezentovaný správně = osově srovnaný  posuneme/otočíme k němu střed kruhu
  36. 36. Ukázka v praxi dokončení kolizí  odrážení míčku podle úhlu dopadu
  37. 37. Načítání levelu podle XML data v XML tagách  <SpriteInfo X="20" Y="50„ AssetName="obrazek" /> streamové čtení  XmlReader reader = XmlReader.Create(path)  while (reader.Read())  if (reader.NodeType == XmlNodeType.Element && reader.Name == "SpriteInfo")
  38. 38. „Multitasking“ na WP koncept Fast App Switching agenti na pozadí + push notifikace
  39. 39. S čím přišlo Mango pro vývojáře:  „multitasking“  Fast App Switching, background agents / audio / file transfers, push notifikace…  Motion API… sockety…  Silverlight + XNA
  40. 40. Operace „na pozadí“ background audio / file transfer Alarm, Reminder PeriodicTask ResourceIntesiveTask  nejsou u 256 MB telefonů push notifikace
  41. 41. PeriodicTask volána každých 30 až 40 min max. 15 sekund max. paměť: 6 MB nefunguje v Battery Save módu max. 10 služeb / zařízení
  42. 42. Životní cyklus aplikace
  43. 43. Odpovídající události v XNAherní smyčka:InitializeLoadContentUnloadContentUpdateDraw
  44. 44. Odpovídající události v XNAherní smyčka: metody XNA:Initialize OnActivatedLoadContentUnloadContent OnDeactivatedUpdate OnExitingDraw
  45. 45. Odpovídající události v XNAherní smyčka: metody XNA: PhoneApplicationService:Initialize OnActivated LaunchingLoadContent OnDeactivatedUnloadContent Activated OnExitingUpdate DeactivatedDraw Closing
  46. 46. Životní cyklus aplikace
  47. 47. Životní cyklus hry
  48. 48. Tombstoning v XNA nevyužívat události = pouze zobrazení / skrytí okna, ne WP chování this.Activated += … this.Deactivated += … řešení: PhoneApplicationService class  reference na System.Windows + Microsoft.Phone  using Microsoft.Phone.Shell;  události appService.Launching, Activated, Deactivated, Closing...
  49. 49. Uložení dat při tombstoningu Isolated Storage = uložení nastavení hry,  IsolatedStorageSettings skóre, odehraných levelů...  IsolatedStorageFile State  PhoneApplicationService.Current.State = uložení dočasného stavu rozehrané hry, otevřených obrazovek... = stav se využije při obnově z tombstoningu
  50. 50. Doporučení: Isolated Storage  ulož vždy, když se změní hodnoty  příp. v metodách Deactivated, Closing  hodnoty zůstanou v paměti i po vypnutí aplikace
  51. 51. Doporučení: State Deactivated ulož stav Activated pokud z dormant:  nic nedělej pokud z tombstoned:  načti stav zpátky
  52. 52. Opakování hra může být ukončena buď v Closing nebo Deactivated (umře v tombstoned stavu) Activated se volá při návratu z dormant i z tombstoned stavu uvažujeme události z PhoneApplicationService, NE ty z XNA
  53. 53. IsolatedStorageSettings použití jako Dictionary  v namespace System.Windows
  54. 54. Serializace dat uložení celého objektu reference System.Runtime.Serialisation serializace do souboru pomocí DataContractSerializer
  55. 55. Zvuky a hudba SoundEffect a SoundEffectInstance MediaPlayer  hudba na pozadí  nutné kontrolovat, zda už nehraje jiná!  v Launching i v Activated  if (MediaPlayer.GameHasControl)
  56. 56. Co přinese Tango? nové telefony (Lumia 610, ZTE Orbit / Mimosa…) snížené minimální požadavky HW
  57. 57. Minimální požadavky 256 MB RAM < 8 GB paměti ROM slabší procesory (800 MHz) volitelný fotoaparát NE PeriodicTask a ResourceIntensiveTask displej stejný (800x480 pix)
  58. 58. Aplikace v Tango 5% by prý zatím nefungovalo  vývojáři už byli kontaktováni nové Windows Phone SDK 7.1.1  nový emulátor
  59. 59. Aplikace v Tango NE PeriodicTask a ResourceIntensiveTask paměť: 90 MB na aplikaci (jako v Mango)  ale jen 60 MB v paměti! (ostatní stránkováno)
  60. 60. Aplikace v Tango ověření, kolik má telefon RAM místo PeriodicTask můžeme použít Push notifikace
  61. 61. Optimalizace kvalita obrázků  snížit rozlišení  DXT komprese  XNA: obejít Content Pipeline zvuky alokovat jen jednou nepoužívat „Page transitions“ mapy/web otevírat mimo aplikace, nevykreslovat přímo uvnitř
  62. 62. Aplikace v Tango Memory profiler – dobré používat! aktuální vytížení paměti lze zjistit i přímo z aplikace
  63. 63. Mogade.com sdílení skóre, achievementy, online statistiky jednoduché API, přímo pro WP návod pro XNA mají na fóru pozor na speciální znaky ve jménu hráče
  64. 64. Silverlight + XNA možnost propojení   i kombinace na 1 obrazovce Silverlight = menu, XNA = herní část
  65. 65. Silverlight + XNA vlastnosti:  navigační model ze Silverlightu  nejsou GameComponent, DrawableG.C.  SharedGraphicsDeviceManager  jiné předpisy metod Update(), Draw()…  nepoužívat Mouse API, ale TouchCollection
  66. 66. Navigační model navigace přes QueryString  objekt NavigationService  NavigationService.Navigate(...)  NavigationContext.QueryString.TryGetValue(...)  nutné občas řešit „back stack“
  67. 67. Ukázka v praxi hybridní projekt  obrazovka menu + hra  implementace Initialize a LoadContent  předání parametru  další obrazovka – výhra  oprava „back stacku“  implementace pauzy ve hře  + ukončení hry z XNA
  68. 68. Webové zdroje SmartMania.cz články rozcestník – můj blog tomasslavicek.czTomáš Slavíčekmail@tomasslavicek.cz Twitter: @tomasslavicek

×