NetworkStateManagement.htm 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041
  1. <html xmlns:MSHelp="http://msdn.microsoft.com/mshelp" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xanx="http://schemas.microsoft.com/developer/xanx/2005"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="save" content="history" /><title>Network State Management Sample</title>
  2. <style><!--
  3. /***********************************************************
  4. * SCRIPT-SUPPORTING STYLES
  5. ***********************************************************/
  6. /* Defines the userData cache persistence mechanism. */
  7. .userDataStyle
  8. {
  9. behavior: url(#default#userData);
  10. }
  11. /* Used to save the scroll bar position when navigating away from a page. */
  12. div.saveHistory
  13. {
  14. behavior: url(#default#saveHistory);
  15. }
  16. /* Formats the expand/collapse images for all collapsible regions. */
  17. img.toggle
  18. {
  19. border: 0;
  20. margin-right: 5;
  21. }
  22. /* Formats the Language filter drop-down image. */
  23. img#languageFilterImage
  24. {
  25. border: 0;
  26. margin-left: 0;
  27. vertical-align: middle;
  28. }
  29. /* Formats the Members Options filter drop-down image. */
  30. img#membersOptionsFilterImage
  31. {
  32. border: 0;
  33. margin-left: 0;
  34. vertical-align: middle;
  35. }
  36. /* Formats the Collapse All/Expand All images. */
  37. img#toggleAllImage
  38. {
  39. margin-left: 0;
  40. vertical-align: middle;
  41. }
  42. /* Supports XLinks */
  43. MSHelp\:link
  44. {
  45. text-decoration: underline;
  46. color: #0000ff;
  47. hoverColor: #3366ff;
  48. filterString: ;
  49. }
  50. body
  51. {
  52. background: #FFFFFF;
  53. color: #000000;
  54. font-family: Verdana;
  55. font-size: medium;
  56. font-style: normal;
  57. font-weight: normal;
  58. margin-top: 0;
  59. margin-bottom: 0;
  60. margin-left: 0;
  61. margin-right: 0;
  62. width: 100%;
  63. /*font-size: 110%;*/
  64. }
  65. div.section
  66. {
  67. margin-left: 15px;
  68. }
  69. div.hxnx5
  70. {
  71. margin-left: 1.5em;
  72. }
  73. /* Font for all headings */
  74. h1, h2, h3, h4, h5, h6
  75. {
  76. font-family: Verdana, Arial, Helvetica, sans-serif;
  77. margin-top: 18;
  78. margin-bottom: 8;
  79. font-weight: bold;
  80. }
  81. h1
  82. {
  83. font-size: 130%;
  84. color: #003399;
  85. }
  86. div#scrollyes h1 /* Changes font size for full-scrolling topic */
  87. {
  88. font-size: 150%;
  89. }
  90. h2
  91. {
  92. font-size: 122%;
  93. }
  94. h3
  95. {
  96. font-size: 115%;
  97. margin-top: 9;
  98. margin-bottom: 4;
  99. }
  100. h4
  101. {
  102. font-size: 115%;
  103. margin-top: 9;
  104. margin-bottom: 4;
  105. }
  106. h5
  107. {
  108. font-size: 100%;
  109. margin-top: 9;
  110. margin-bottom: 4;
  111. }
  112. h6
  113. {
  114. font-size: 100%;
  115. margin-top: 9;
  116. margin-bottom: 4;
  117. }
  118. ul p, ol p, dl p
  119. {
  120. margin-left: 0em;
  121. }
  122. p
  123. {
  124. margin-top: .6em;
  125. margin-bottom: .6em;
  126. }
  127. td p
  128. {
  129. margin-top: 0.0em;
  130. margin-bottom: 0.6em;
  131. }
  132. dd p
  133. {
  134. margin-top: 0.0em;
  135. margin-bottom: 0.6em;
  136. }
  137. .image
  138. {
  139. text-align: center;
  140. }
  141. dl
  142. {
  143. margin-top: 0em;
  144. margin-bottom: 1.3em;
  145. }
  146. dd
  147. {
  148. margin-bottom: 0em;
  149. margin-left: 1.5em;
  150. }
  151. dl.glossary dd
  152. {
  153. margin-bottom: 0em;
  154. margin-left: 1.5em;
  155. }
  156. dt
  157. {
  158. margin-top: .6em;
  159. margin-bottom: 1;
  160. }
  161. ul, ol
  162. {
  163. margin-top: 0.6em;
  164. margin-bottom: 0.6em;
  165. }
  166. ol
  167. {
  168. margin-left: 2.5em;
  169. }
  170. ul
  171. {
  172. list-style-type: disc;
  173. margin-left: 1.9em;
  174. }
  175. li
  176. {
  177. margin-bottom: 0.4em;
  178. }
  179. ul ol, ol ol
  180. {
  181. list-style-type: lower-alpha;
  182. }
  183. pre
  184. {
  185. margin-top: .6em;
  186. margin-bottom: .6em;
  187. font: 105% Lucida, mono;
  188. color: #000066;
  189. }
  190. code
  191. {
  192. font-family: Monospace, Courier New, Courier;
  193. font-size: 105%;
  194. color: #000066;
  195. }
  196. table.userdata td
  197. {
  198. background: #ffffff;
  199. background-color: #F5F5F5;
  200. border-color: #ffffff;
  201. border: none;
  202. }
  203. table.clsWarning
  204. {
  205. background: #ffffff;
  206. padding: 0px;
  207. margin: 0px;
  208. border: none;
  209. }
  210. table.clsWarning td
  211. {
  212. padding: 0px;
  213. margin: 0px;
  214. background: #ffffff;
  215. vertical-align: middle;
  216. font-size: 70%;
  217. }
  218. div#mainSection table
  219. {
  220. width: 95%;
  221. background: #ffffff;
  222. margin-top: 5px;
  223. margin-bottom: 5px;
  224. }
  225. div#mainSection table th
  226. {
  227. padding: 5px 6px;
  228. background: #EFEFF7;
  229. text-align: left;
  230. font-size: 70%;
  231. vertical-align: bottom;
  232. border-bottom: 1px solid #C8CDDE;
  233. }
  234. div#mainSection table td
  235. {
  236. padding: 5px 5px;
  237. background: #F7F7FF;
  238. vertical-align: top;
  239. font-size: 70%;
  240. border-bottom: 1px solid #D5D5D3;
  241. }
  242. div#syntaxCodeBlocks table th
  243. {
  244. padding: 1px 6px;
  245. color: #000066;
  246. }
  247. div#syntaxCodeBlocks table td
  248. {
  249. padding: 1px 5px;
  250. }
  251. /* Applies to the running header text in the first row of the upper table in the
  252. non-scrolling header region. */
  253. span#runningHeaderText
  254. {
  255. color: #003399;
  256. font-size: 90%;
  257. padding-left: 13;
  258. }
  259. /* Applies to the topic title in the second row of the upper table in the
  260. non-scrolling header region. */
  261. span#nsrTitle
  262. {
  263. color: #003399;
  264. font-size: 120%;
  265. font-weight: 600;
  266. padding-left: 13;
  267. }
  268. /* Applies to everything below the non-scrolling header region. */
  269. div#mainSection
  270. {
  271. font-size: 70%;
  272. width: 100%;
  273. }
  274. /* Applies to everything below the non-scrolling header region, minus the footer. */
  275. div#mainBody
  276. {
  277. font-size: 90%;
  278. margin-left: 15;
  279. margin-top: 10;
  280. padding-bottom: 20;
  281. }
  282. /* Adds right padding for all blocks in mainBody */
  283. div#mainBody p, div#mainBody ol, div#mainBody ul, div#mainBody dl
  284. {
  285. padding-right: 5;
  286. }
  287. div#mainBody div.alert, div#mainBody div.code, div#mainBody div.tableSection
  288. {
  289. width:98.9%;
  290. }
  291. div.alert p, div.code p
  292. {
  293. margin-top:5;
  294. margin-bottom:8;
  295. }
  296. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Begin Note Styles - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  297. div#mainSection div.alert table
  298. {
  299. border: 0;
  300. }
  301. div#mainSection div.alert table th
  302. {
  303. padding-top: 0;
  304. padding-bottom: 0;
  305. padding-left: 5;
  306. padding-right: 5;
  307. }
  308. div#mainSection div.alert table td
  309. {
  310. padding-left: 5;
  311. padding-right: 5;
  312. }
  313. img.note
  314. {
  315. border: 0;
  316. margin-left: 0;
  317. margin-right: 3;
  318. }
  319. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - End Note Styles - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  320. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Begin Non-scrolling Header Region Styles - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  321. /* Applies to the entire non-scrolling header region. */
  322. div#header
  323. {
  324. background-color: #D4DFFF;
  325. padding-top: 0;
  326. padding-bottom: 0;
  327. padding-left: 0;
  328. padding-right: 0;
  329. width: 100%;
  330. }
  331. /* Applies to both tables in the non-scrolling header region. */
  332. div#header table
  333. {
  334. margin-top: 0;
  335. margin-bottom: 0;
  336. border-bottom-color: #C8CDDE;
  337. border-bottom-style: solid;
  338. border-bottom-width: 1;
  339. background: #D4DFFF;
  340. width: 100%;
  341. }
  342. /* Applies to cells in both tables in the non-scrolling header region. */
  343. div#header table td
  344. {
  345. color: #0000FF;
  346. font-size: 70%;
  347. padding-right: 20;
  348. padding-top: 1;
  349. padding-bottom: 1;
  350. border: none;
  351. background: #D4DFFF;
  352. }
  353. /* Applies to the last row in the upper table of the non-scrolling header region. Text
  354. in this row includes See Also, Constructors, Methods, and Properties. */
  355. div#header table tr#headerTableRow3 td
  356. {
  357. padding-bottom: 2;
  358. padding-top: 5;
  359. padding-left: 15;
  360. }
  361. /* Applies to the lower table in the non-scrolling header region. Text in this table
  362. includes Collapse All/Expand All, Language Filter, and Members Options. */
  363. div#header table#bottomTable
  364. {
  365. border-top-color: #FFFFFF;
  366. border-top-style: solid;
  367. border-top-width: 1;
  368. text-align: left;
  369. padding-left: 15;
  370. }
  371. blockquote
  372. {
  373. margin-left: 3.8em;
  374. margin-right: 3.8em;
  375. margin-top: .6em;
  376. margin-bottom: .6em;
  377. }
  378. sup
  379. {
  380. text-decoration: none;
  381. font-size: smaller;
  382. }
  383. a:link
  384. {
  385. color: #0000FF;
  386. /* font-weight: bold */
  387. }
  388. a:visited
  389. {
  390. color: #0000AA;
  391. /* font-weight: bold */
  392. }
  393. a:hover
  394. {
  395. color: #3366FF;
  396. /* font-weight: bold */
  397. }
  398. .label
  399. {
  400. font-weight: bold;
  401. margin-top: 1em;
  402. margin-left: -26px;
  403. }
  404. .tl
  405. {
  406. margin-bottom: .75em;
  407. }
  408. .atl
  409. {
  410. padding-left: 1.5em;
  411. padding-bottom: .75em;
  412. }
  413. .cfe
  414. {
  415. font-weight: bold;
  416. }
  417. .mini
  418. {
  419. font-size: smaller;
  420. }
  421. .dt
  422. {
  423. margin-bottom: -.6em;
  424. }
  425. .indent
  426. {
  427. margin-left: 1.9em;
  428. margin-right: 1.9em;
  429. }
  430. .product
  431. {
  432. text-align: right;
  433. color: #333333;
  434. font-size: smaller;
  435. font-style: italic;
  436. }
  437. .buttonbarshade
  438. {
  439. position: relative;
  440. margin: 0;
  441. left: 0px;
  442. top: 2;
  443. width: 50%;
  444. height: 40px;
  445. }
  446. .buttonbartable
  447. {
  448. position: absolute;
  449. margin: 0;
  450. padding:0;
  451. border:0;
  452. left:0px;
  453. top: 2;
  454. width: 100%;
  455. height: 40px;
  456. }
  457. /* background color, font for header */
  458. table.buttonbartable td, table.buttonbarshade td
  459. {
  460. background: #ffffff; /*#5177B8; #80C615;*/
  461. border-left: 0px solid #80C615;
  462. margin: 0;
  463. padding: 0px 0px 0px 0px;
  464. font-family: Impact, sans-serif;
  465. font-size: 14pt;
  466. }
  467. table.buttonbartable td.button1
  468. {
  469. background: #5177B8; /*#80C615;*/;
  470. padding: 0;
  471. font-weight: bold;
  472. text-align: center;
  473. cursor: hand;
  474. }
  475. table.buttonbartable td.button2
  476. {
  477. background: #5177B8; /*#80C615;*/;
  478. font-weight: bold;
  479. text-align: center;
  480. }
  481. table.buttonbartable td.button3
  482. {
  483. background: #5177B8; /*#80C615;*/;
  484. font-weight: bold;
  485. text-align: center;
  486. }
  487. table.buttonbartable td.runninghead
  488. {
  489. padding-left: 0px;
  490. font-style: italic;
  491. text-align: left;
  492. }
  493. .version
  494. {
  495. text-align: left;
  496. color: #000000;
  497. margin-top: 3em;
  498. margin-left: -26px;
  499. font-size: smaller;
  500. font-style: italic;
  501. }
  502. .lang, .ilang
  503. {
  504. color: #0000ff;
  505. font: normal 7pt Arial, Helvetica, sans-serif;
  506. }
  507. div.langMenu
  508. {
  509. position: absolute;
  510. z-index: 1;
  511. width: 96pt;
  512. padding: 8pt;
  513. visibility: hidden;
  514. border: 1px solid #000000;
  515. background: #ffffd0;
  516. }
  517. div.langMenu ul
  518. {
  519. padding-left: 2em;
  520. margin-left: 0;
  521. }
  522. div.filtered
  523. {
  524. margin: 4pt 0 8pt -26px;
  525. padding: 4px 4px 8px 26px;
  526. width: 100%;
  527. border: 2px solid #aaaacc;
  528. background: #ffffff;
  529. }
  530. div.filtered2
  531. {
  532. margin: 4pt 0 8pt -26px;
  533. padding: 4px 4px 8px 26px;
  534. width: 100%;
  535. border: none;
  536. background: #ffffff;
  537. }
  538. div.filtered h1, div.filtered h2, div.filtered h3, div.filtered h4
  539. {
  540. margin-left: -22px;
  541. }
  542. div.filtered span.lang
  543. {
  544. position: relative;
  545. left: -22px;
  546. }
  547. div.reftip
  548. {
  549. position: absolute;
  550. z-index: 1;
  551. padding: 8pt;
  552. visibility: hidden;
  553. border: 1px solid #000000;
  554. background: #ffffd0;
  555. }
  556. a.synParam
  557. {
  558. color: #0000FF;
  559. /*color: #3F7800;*/
  560. /*color: #8DC54F;*/
  561. text-decoration: none;
  562. font-weight: normal;
  563. }
  564. a.synParam:hover
  565. {
  566. text-decoration: underline;
  567. font-weight: normal;
  568. }
  569. div.sapop
  570. {
  571. position: absolute;
  572. z-index: 1;
  573. left: 26px;
  574. width: 100%;
  575. padding: 10px 10px 10px 36px;
  576. visibility: hidden;
  577. border: 1px solid #000000;
  578. background: #ffffd0;
  579. }
  580. div.footer
  581. {
  582. width: 100%;
  583. border: none;
  584. background: #ffffff;
  585. margin-top: 18pt;
  586. padding-bottom: 12pt;
  587. color: #0000FF;
  588. /*color: #228B22; */
  589. text-align: center;
  590. font-size: 76%;
  591. }
  592. div.preliminary
  593. {
  594. margin-top: 8pt;
  595. padding-bottom: 12pt;
  596. color: #A0A0A0;
  597. }
  598. /* A procedure section. eg. 'To create a file', 'To add a value' */
  599. div.proc
  600. {
  601. margin-left: 0.5em;
  602. }
  603. /* The title of a 'procedure' section. */
  604. div.proc h3
  605. {
  606. font-family: Verdana, Arial, Helvetica, sans-serif;
  607. font-weight: bold;
  608. font-size: 115%;
  609. margin-top: 1em;
  610. margin-bottom: 0.4em;
  611. margin-left: -0.5em;
  612. color: #003399;
  613. }
  614. div.proc ul
  615. {
  616. margin-left: 1.5em;
  617. }
  618. div.proc ol
  619. {
  620. margin-left: 2.0em;
  621. }
  622. .note
  623. {
  624. margin-left: 14pt;
  625. margin-right: 12pt;
  626. }
  627. .indent1
  628. {
  629. margin-left: 12pt;
  630. }
  631. .indent2
  632. {
  633. margin-left: 24pt;
  634. }
  635. .indent3
  636. {
  637. margin-left: 36pt;
  638. }
  639. p.proch
  640. {
  641. padding-left: 16px;
  642. }
  643. p.proch img
  644. {
  645. position: relative;
  646. vertical-align: top;
  647. left: -18px;
  648. margin-right: -14px;
  649. margin-bottom: -18px;
  650. }
  651. div.clsPlatSpec
  652. {
  653. background-color:#FFF8DC;
  654. border-style:solid;
  655. border-width:1pt 0pt 0pt 1pt;
  656. border-color:#ffE4C4;
  657. margin-top:0.6em;
  658. width:100%;
  659. }
  660. /* Applies to the language labels in the Language Filter drop-down list. */
  661. .languageFilter
  662. {
  663. color: #0000FF;
  664. cursor:hand;
  665. text-decoration:underline;
  666. padding-bottom:4;
  667. }
  668. /* Dropdown areas */
  669. #languageSpan {
  670. position: absolute;
  671. visibility: hidden;
  672. border-style: solid;
  673. border-width: 1px;
  674. border-color: #C8CDDE;
  675. background: #d4dfff;
  676. padding: 4px;
  677. font-size: 70%;
  678. }
  679. #membersOptionsSpan {
  680. position: absolute;
  681. visibility: hidden;
  682. border-style: solid;
  683. border-width: 1px;
  684. border-color: #C8CDDE;
  685. background: #d4dfff;
  686. padding: 4px;
  687. font-size: 70%;
  688. }
  689. --></style>
  690. <xml>
  691. <MSHelp:TOCTitle Title="Network State Management Sample" />
  692. <MSHelp:RLTitle Title="Network State Management Sample" />
  693. <MSHelp:Keyword Index="A" Term="O:Microsoft.Xna.NetworkStateManagement" />
  694. <MSHelp:Keyword Index="A" Term="f877b1db-9698-5106-49da-767bfdaa2de8" />
  695. <MSHelp:Keyword Index="K" Term="Network State Management Sample" />
  696. <MSHelp:Attr Name="AssetID" Value="f877b1db-9698-5106-49da-767bfdaa2de8" />
  697. <MSHelp:Attr Name="Locale" Value="en-us" />
  698. <MSHelp:Attr Name="CommunityContent" Value="1" />
  699. <MSHelp:Attr Name="TopicType" Value="kbOrient" />
  700. </xml>
  701. </head><body><div id="mainSection"><div id="mainBody">
  702. <h1>Network State Management Sample</h1>
  703. This sample shows you how to implement the user interface for a multiplayer networked game. It provides menus for creating, finding, and joining sessions, a lobby screen, and robust network error handling.
  704. <a id="ID2EK" name="ID2EK"> </a><h1 class="heading">Sample Overview</h1><div id="ID2EK" class="hxnx1">
  705. <p>
  706. This sample builds on top of the Game State Management sample. It adds the user interface screens needed by a multiplayer networked game. If you are not familiar with the underlying concepts of the <b>ScreenManager</b> and <b>GameScreen</b> classes, you should read the documentation for the Game State Management sample.
  707. </p>
  708. <p>At the main menu, players can choose between Single Player, LIVE, or System Link game modes. If they choose a networked mode, they will be prompted to sign in a suitable player profile (if one is not already signed in), and then asked to create a new session or to search for existing sessions. The sample displays an animated busy indicator whenever a network operation is in progress, and robustly handles errors by catching network exceptions and turning them into message box popups. Once in the lobby, a list of gamers is displayed along with icons indicating who is currently talking and who has marked themselves as ready. When all the gamers are ready, the sample loads the gameplay screen, at which point the rest is up to you: there is no actual game code included here!</p>
  709. <a id="ID2EX" name="ID2EX"> </a><h2 class="subHeading">Sample Controls</h2><div id="ID2EX" class="hxnx2">
  710. <p>This sample uses the following keyboard and gamepad controls.</p>
  711. <table>
  712. <tr>
  713. <th>Action</th>
  714. <th>Keyboard control</th>
  715. <th>Gamepad control</th>
  716. </tr>
  717. <tr>
  718. <td>Select a menu entry</td>
  719. <td>UP ARROW, DOWN ARROW</td>
  720. <td>Left thumb stick, D-pad up and down</td>
  721. </tr>
  722. <tr>
  723. <td>Accept the menu selection</td>
  724. <td>SPACEBAR, ENTER</td>
  725. <td>
  726. <b>A</b>, <b>START</b>
  727. </td>
  728. </tr>
  729. <tr>
  730. <td>Mark players ready in the lobby</td>
  731. <td>SPACEBAR, ENTER</td>
  732. <td>
  733. <b>A</b>, <b>START</b>
  734. </td>
  735. </tr>
  736. <tr>
  737. <td>Cancel the menu</td>
  738. <td>ESC</td>
  739. <td>
  740. <b>B</b>, <b>BACK</b>
  741. </td>
  742. </tr>
  743. <tr>
  744. <td>Exit from the lobby</td>
  745. <td>ESC</td>
  746. <td>
  747. <b>B</b>, <b>BACK</b>
  748. </td>
  749. </tr>
  750. <tr>
  751. <td>Move a game entity.</td>
  752. <td>UP ARROW, DOWN ARROW, LEFT ARROW, and RIGHT ARROW</td>
  753. <td>Left thumb stick</td>
  754. </tr>
  755. <tr>
  756. <td>Pause the game.</td>
  757. <td>ESC</td>
  758. <td>
  759. <b>START</b>, <b>BACK</b>
  760. </td>
  761. </tr>
  762. </table>
  763. </div>
  764. </div>
  765. <a id="ID2EDE" name="ID2EDE"> </a><h1 class="heading">How the Sample Works</h1><div id="ID2EDE" class="hxnx1">
  766. <p>The sample code is organized into three folders:</p>
  767. <ul>
  768. <li>
  769. The ScreenManager folder contains the underlying <b>ScreenManager</b> component and <b>GameScreen</b> base class, which will be needed by all games that want to use this screen infrastructure, and usually will not need to be altered from one game to another.
  770. </li>
  771. <li>
  772. The Screens folder contains screen implementations such as the <b>MenuScreen</b>, <b>GameplayScreen</b>, and <b>BackgroundScreen</b>, which you will probably want to customize for your specific game.
  773. </li>
  774. <li>
  775. The Networking folder contains multiplayer networking functionality such as the <b>LobbyScreen</b> and <b>NetworkSessionComponent</b>.
  776. </li>
  777. </ul>
  778. <p>All the text strings used by this sample are stored in a resource file, Resources.resx. This provides a convenient way to gather all the text in one place without cluttering up the program code.</p>
  779. <a id="ID2EFF" name="ID2EFF"> </a><h2 class="subHeading">Managing the NetworkSession</h2><div id="ID2EFF" class="hxnx2">
  780. <p>
  781. One of the challenges in hooking up networking to a generalized user interface is deciding who should own the <b>NetworkSession</b> object. Many different pieces of code need to access the session, but only one should be responsible for updating it, handling errors, and resetting the user interface if it ends unexpectedly. To manage the session instance, this sample creates the <b>NetworkSessionComponent</b> class. This is a game component wrapped around a <b>NetworkSession</b>. The component updates the network session from its update method, gracefully handling any exceptions that may result. It also hooks the <b>NetworkSession.SessionEnded</b> event, which will trigger the <b>LeaveSession</b> method to reset the user interface and display a message box telling the user why the session has ended.
  782. </p>
  783. <p>
  784. <b>NetworkSessionComponent</b> also registers the <b>NetworkSession</b> as a game service. This provides two different ways for other pieces of code to access the session:
  785. </p>
  786. <ul>
  787. <li>
  788. Some, for instance the <b>LobbyScreen</b>, take the <b>NetworkSession</b> as a parameter to their constructor, and store it for future use.
  789. </li>
  790. <li>
  791. Others, for instance the <b>LoadingScreen</b>, look up the <b>NetworkSession</b> from <b>Game.Services</b>. This provides a highly decoupled way for other classes to access the session object:
  792. </li>
  793. </ul>
  794. <div class="code"><span codeLanguage="CSharp"><table><tr><th>C# </th></tr><tr><td><pre><pre>
  795. NetworkSession session = (NetworkSession)Game.Services.GetService(typeof(NetworkSession));
  796. </pre></pre></td></tr></table></span></div>
  797. </div>
  798. <a id="ID2EUG" name="ID2EUG"> </a><h2 class="subHeading">From Lobby to Gameplay</h2><div id="ID2EUG" class="hxnx2">
  799. <p>
  800. The <b>LobbyScreen</b> displays a list of all the gamers in the session, along with some icons to indicate their status. The gamers can mark themselves as ready by setting the <b>LocalNetworkGamer.IsReady</b> property to <b>true</b>. The <b>IsReady</b> status is synchronized automatically over the network. The host examines this inside the <b>LobbyScreen.Update</b> method to decide when to start the game:
  801. </p>
  802. <div class="code"><span codeLanguage="CSharp"><table><tr><th>C# </th></tr><tr><td><pre><pre>
  803. if (networkSession.IsHost &amp;&amp; networkSession.IsEveryoneReady)
  804. {
  805. networkSession.StartGame();
  806. }
  807. </pre></pre></td></tr></table></span></div>
  808. <p>
  809. When the host starts the game, this status change is sent automatically over the network. Using the <b>LobbyScreen.Update</b> method, each client can examine the session state to decide when to load the gameplay screen:
  810. </p>
  811. <div class="code"><span codeLanguage="CSharp"><table><tr><th>C# </th></tr><tr><td><pre><pre>
  812. if (networkSession.SessionState == NetworkSessionState.Playing)
  813. {
  814. LoadingScreen.Load(ScreenManager, true, new GameplayScreen(networkSession));
  815. }
  816. </pre></pre></td></tr></table></span></div>
  817. <p>
  818. The process for returning from gameplay to the lobby works in a similar way. The host decides when to return to the lobby, using the "Return to Lobby" option in the <b>PauseMenuScreen</b>, and calls <b>NetworkSession.EndGame</b> whenever this is selected (a real game might want to end the game after a fixed amount of time, or when all the cars reach the end of their third lap, or some other game-specific critera). This status change is sent automatically over the network. Each client can examine the session state inside its <b>GameplayScreen.Update</b> method to decide when to reload the lobby screen:
  819. </p>
  820. <div class="code"><span codeLanguage="CSharp"><table><tr><th>C# </th></tr><tr><td><pre><pre>
  821. if (networkSession.SessionState == NetworkSessionState.Lobby)
  822. {
  823. LoadingScreen.Load(ScreenManager, true, new BackgroundScreen(), new LobbyScreen(networkSession));
  824. }
  825. </pre></pre></td></tr></table></span></div>
  826. <p>Although only the host is responsible for deciding when to start or end the game, all the clients will move between the lobby and gameplay screens at the same time.</p>
  827. <p>
  828. Note that the code that checks when to return from gameplay to the lobby is in the <b>GameplayScreen.Update</b> method. This seems like it might be a problem because the gameplay screen might have transitioned off to make room for some other screen such as the pause menu. However, we still want to return to the lobby regardless of what screen currently is active. This is acceptable because the screen update method is still called even when a screen has transitioned off as the result of being covered by something else. The update method usually does nothing in this case because it checks the <b>IsActive</b> property before taking any actions. This will be <b>false</b> if the screen is covered up. Our return to lobby logic only checks <b>!IsExiting</b>, rather than <b>IsActive</b>, so it will still run even when some other screen has temporarily covered up the gameplay.
  829. </p>
  830. </div>
  831. <a id="ID2ERAAC" name="ID2ERAAC"> </a><h2 class="subHeading">Displaying Notification Messages</h2><div id="ID2ERAAC" class="hxnx2">
  832. <p>
  833. In a networked game, it is nice if players can be notified whenever other gamers join or leave the session. This sample provides a generalized <b>IMessageDisplay</b> service, which can be used by any code that wants to display this kind of notification message:
  834. </p>
  835. <div class="code"><span codeLanguage="CSharp"><table><tr><th>C# </th></tr><tr><td><pre><pre>
  836. IMessageDisplay messageDisplay = (IMessageDisplay)Game.Services.GetService(typeof(IMessageDisplay));
  837. if (messageDisplay != null)
  838. {
  839. messageDisplay.ShowMessage("Hello, World!");
  840. }
  841. </pre></pre></td></tr></table></span></div>
  842. <p>
  843. The <b>NetworkSessionComponent</b> uses <b>IMessageDisplay</b> to display messages in response to the <b>NetworkSession.GamerJoined</b> and <b>NetworkSession.GamerLeft</b> events.
  844. </p>
  845. <p>
  846. In this sample, the <b>IMessageDisplay</b> interface is implemented by the <b>MessageDisplayComponent</b> class. If you want to change the appearance of the messages, you can either alter the draw code in this component, or replace it with an entirely different implementation of <b>IMessageDisplay</b>.
  847. </p>
  848. </div>
  849. <a id="ID2ESBAC" name="ID2ESBAC"> </a><h2 class="subHeading">Multithreaded Loading</h2><div id="ID2ESBAC" class="hxnx2">
  850. <p>
  851. The original Game State Management Sample had a very simple <b>LoadingScreen</b> implementation:
  852. </p>
  853. <ul>
  854. <li>
  855. Activate the <b>LoadingScreen</b>.
  856. </li>
  857. <li>Tell all other screens to transition off.</li>
  858. <li>Wait until the previous screens are gone.</li>
  859. <li>Perform the load.</li>
  860. </ul>
  861. <p>
  862. This presents a problem for networked games. What if the loading takes a long time? Nothing else is happening while the load occurs, and, in particular, when the <b>NetworkSession.Update</b> method is not being called. If loading takes too long, you might be accidentally disconnected from the session. To keep the connection alive, we must take care to call <b>NetworkSession.Update</b> regularly, even during our load operation.
  863. </p>
  864. <p>
  865. This is accomplished through the use of multithreading. Immediately before it performs the (potentially slow) load operation, the loading screen starts up a background worker thread, executing the <b>BackgroundWorkerThread</b> method. At regular intervals (30 times per second) this background thread updates the network session, and also redraws the loading screen so we can keep the display animating smoothly while we load. Once the load operation has completed, the main thread signals the <b>backgroundThreadExit</b> event, which causes the background thread to exit.
  866. </p>
  867. </div>
  868. </div>
  869. <a id="ID2EZCAC" name="ID2EZCAC"> </a><h1 class="heading">Extending the Sample</h1><div id="ID2EZCAC" class="hxnx1">
  870. <p>
  871. This sample does not actually contain any gameplay! It would be good to replace the <b>GameplayScreen</b> with something more interesting.
  872. </p>
  873. <p>
  874. Once it reaches the <b>GameplayScreen</b>, this sample does not do any real game networking, either. After you add some fun gameplay, you will also want to synchronize this over the network. See the Peer-to-Peer and Client/Server samples for examples.
  875. </p>
  876. <p>
  877. You will probably want to re-skin the user interface to give your game a unique look. The <b>MenuScreen</b> and <b>MenuItem</b> drawing code, and the image used by the <b>BackgroundScreen</b>, would be good places to start.
  878. </p>
  879. <p>
  880. You could use the <b>IMessageDisplay</b> service for more than just displaying gamer joined and left notifications. Perhaps you could show a message whenever someone is killed, or when a new record score is set.
  881. </p>
  882. </div>
  883. </div><div class="footer" id="footer"><p>© 2010 Microsoft Corporation. All rights reserved.<br />Send feedback to <a href="mailto:[email protected]?subject=Documentation Feedback: Network State Management Sample">[email protected]</a>.</p></div></div></body></html>