RectangleCollision.htm 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140
  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>2D Collision Tutorial 1: Rectangle</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="2D Collision Tutorial 1: Rectangle" />
  692. <MSHelp:RLTitle Title="2D Collision Tutorial 1: Rectangle" />
  693. <MSHelp:Keyword Index="A" Term="O:Microsoft.Xna.RectangleCollision" />
  694. <MSHelp:Keyword Index="A" Term="bbeb996e-2cb9-0e00-fc65-de4085e95cc0" />
  695. <MSHelp:Keyword Index="K" Term="2D Collision Tutorial 1: Rectangle" />
  696. <MSHelp:Attr Name="AssetID" Value="bbeb996e-2cb9-0e00-fc65-de4085e95cc0" />
  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>2D Collision Tutorial 1: Rectangle</h1>
  703. This article explains several simple techniques for constraining motion and collision detection in 2D.
  704. <a id="ID2EJ" name="ID2EJ"> </a><h1 class="heading">Introduction</h1><div id="ID2EJ" class="hxnx1">
  705. <p>Games do not need to be complex to be fun and interesting. Obstacle-avoidance games consist of a character and some objects that are on a crash course toward each other. The player must avoid the oncoming objects.</p>
  706. <p>
  707. Here is the player character successfully dodging falling blocks:</p>
  708. <img src="FallingBlocks.png" />
  709. <p>
  710. And here the player is not-so-successfully dodging falling blocks:</p>
  711. <img src="Blocked.png" />
  712. <p>When you complete this tutorial, you will have everything you need to create a complete obstacle avoidance game.</p>
  713. </div>
  714. <a id="ID2E3" name="ID2E3"> </a><h1 class="heading">Step 1: Create a New Project and Include Artwork</h1><div id="ID2E3" class="hxnx1">
  715. <p>Before you start coding you need textures for the player character and falling blocks. These textures can be of any size and should use magenta (100 percent red, 0 percent green, and 100 percent blue) for anything that should be transparent. Save your textures as .bmp or .png files and not as .gif or .jpg in order to avoid artifacts caused by poor image compression.</p>
  716. <p>Here are the textures used in the sample:</p>
  717. <img src="texture1.png" /> <img src="texture2.png" />
  718. <div class="alert"><table cellspacing="0" cellpadding="0"><tr><th>Note </th></tr><tr><td>Magenta is used because the default texture processor will perform color keying logic, which converts magenta to be completely transparent.</td></tr></table></div>
  719. <p>Next, you need to create a new Windows Game project and add the textures.</p>
  720. <div class="proc"><h3 class="subHeading">To create a new project</h3><div class="subSection">
  721. <ol>
  722. <li>Open <b>XNA Game Studio 4.0</b>.</li>
  723. <li>On the <b>File</b> menu, click <b>New Project</b> to create a new project.</li>
  724. <li>From the list of templates that appears, select either <b>Windows Game (4.0)</b> or <b>Xbox 360 Game (4.0)</b>.</li>
  725. <li>Type a <i>name</i> for your game into the <b>Name</b> field, and indicate a <i>path</i> where files are to be stored in the <b>Location</b> field. </li>
  726. <li>Click <b>OK</b>.</li>
  727. </ol>
  728. </div></div>
  729. <p>The code for your new game will be displayed. The project already contains many of the methods that are needed to start and run a game. Right now, however, you need to make sure your art assets are being loaded. Follow these steps to get some art into your project.</p>
  730. <div class="proc"><h3 class="subHeading">To add art to your project</h3><div class="subSection">
  731. <ol>
  732. <li>Ensure you can see the Solution Explorer for your project. If you cannot see it, on the <b>View</b> menu, click <b>Solution Explorer</b>. When it appears, you will see files associated with your project in a tree structure.</li>
  733. <li>
  734. In <b>Solution Explorer</b>, right-click the <b>Content project</b> icon, click <b>Add</b>, and then click <b>Existing Item</b>.</li>
  735. <li>
  736. In the <b>Existing Item</b> dialog box, select the path where your artwork is stored, and then select your two textures. If you do not find the textures, ensure you changed the <b>Files of type</b> selection box to <b>Content Pipeline Files</b>.
  737. </li>
  738. <li>Click <b>OK</b>.</li>
  739. </ol></div></div>
  740. <p>Your project structure should look similar to this:</p>
  741. <img src="rectanglecollisions.png" />
  742. <p>At this point, you're ready to code!</p>
  743. </div>
  744. <a id="ID2EJE" name="ID2EJE"> </a><h1 class="heading">Step 2: Initialization and Drawing</h1><div id="ID2EJE" class="hxnx1">
  745. <p>Take a look at the code for Game1.cs; it should still be on your screen from opening up your project. The first thing you want to do is set up your drawing code. For this, you need to load and store the textures, as well as establish data structures for your player character and falling blocks. You will also declare a <b>SpriteBatch</b>, which you will use to draw these objects.</p>
  746. <ol>
  747. <li>In <b>Solution Explorer</b>, double-click <b>Game1.cs</b> to view the code for your game.</li>
  748. <li><p>Add the following declarations inside the game class.</p>
  749. <div class="code"><span codeLanguage=""><table><tr><th> </th></tr><tr><td><pre><pre>// The images to draw
  750. Texture2D personTexture;
  751. Texture2D blockTexture;
  752. // The images will be drawn with this SpriteBatch
  753. SpriteBatch spriteBatch;
  754. // Person
  755. Vector2 personPosition;
  756. // Blocks
  757. List&lt;Vector2&gt; blockPositions = new List&lt;Vector2&gt;(); </pre></pre></td></tr></table></span></div>
  758. </li>
  759. <li>
  760. <p>You must properly initialize these variables. The textures should be loaded in the <b>LoadContent</b> method and the rest of the initialization logic should be performed in the <b>Initialize</b> method. Make the following additions to those methods:</p>
  761. <div class="code"><span codeLanguage=""><table><tr><th> </th></tr><tr><td><pre><pre>protected override void Initialize()
  762. {
  763. base.Initialize();
  764. // Start the player in the center along the bottom of the screen
  765. personPosition.X = (Window.ClientBounds.Width - personTexture.Width) / 2;
  766. personPosition.Y = Window.ClientBounds.Height - personTexture.Height;
  767. }
  768. protected override void LoadContent()
  769. {
  770. // Load textures
  771. blockTexture = Content.Load&lt;Texture2D&gt;("Block");
  772. personTexture = Content.Load&lt;Texture2D&gt;("Person");
  773. // Create a sprite batch to draw those textures
  774. spriteBatch = new SpriteBatch(graphics.GraphicsDevice);
  775. } </pre></pre></td></tr></table></span></div>
  776. <div class="alert"><table cellspacing="0" cellpadding="0"><tr><th>Note </th></tr><tr><td>In this sample, all positions represent the upper-left corner of where the objects will appear on screen. Due to this, the width of the texture must be accounted for when positioning objects.</td></tr></table></div>
  777. </li>
  778. <li>
  779. <p>Now that you have your textures and other sprite data, you need to draw them. Modify the <b>Draw</b> method to look like this:</p>
  780. <div class="code"><span codeLanguage=""><table><tr><th> </th></tr><tr><td><pre><pre>protected override void Draw(GameTime gameTime)
  781. {
  782. graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
  783. spriteBatch.Begin();
  784. // Draw person
  785. spriteBatch.Draw(personTexture, personPosition, Color.White);
  786. // Draw blocks
  787. foreach (Vector2 blockPosition in blockPositions)
  788. spriteBatch.Draw(blockTexture, blockPosition, Color.White);
  789. spriteBatch.End();
  790. base.Draw(gameTime);
  791. }</pre></pre></td></tr></table></span></div>
  792. </li>
  793. <li>
  794. <p>At this point, you should be able to compile and run your project by pressing F5 or clicking the <b>Debug</b> menu, and then clicking <b>Start Debugging</b>. Your player character will be there, but where are the blocks?
  795. </p>
  796. </li>
  797. </ol>
  798. <div class="alert"><table cellspacing="0" cellpadding="0"><tr><th>Note </th></tr><tr><td>If you have created an Xbox 360 Game and you can't see the player character, it is possible the player character is being drawn outside your TV's safe region. For simplicity, you can manually decrease the value of <i>personPosition.Y</i> until the character is visible. See the usage of the <b>safeBounds</b> field in the accompanying source code for a more robust solution.</td></tr></table></div>
  799. </div>
  800. <a id="ID2E5G" name="ID2E5G"> </a><h1 class="heading">Step 3: Making it all Move</h1><div id="ID2E5G" class="hxnx1">
  801. <p>There are no blocks being drawn because the blocks list is empty. You'll need to add logic to create and animate the falling blocks. While you're at it, why not add the ability to move the player character?</p>
  802. <ol>
  803. <li>
  804. <p>For simplicity, the blocks and player character will move at fixed rates. The number and position of falling blocks will be determined randomly. To represent these behaviors, you need to append the declarations at the top of the <b>Game</b> class:</p>
  805. <div class="code"><span codeLanguage=""><table><tr><th> </th></tr><tr><td><pre><pre>// Person
  806. Vector2 personPosition;
  807. const int PersonMoveSpeed = 5;
  808. // Blocks
  809. List&lt;Vector2&gt; blockPositions = new List&lt;Vector2&gt;();
  810. float BlockSpawnProbability = 0.01f;
  811. const int BlockFallSpeed = 2;
  812. Random random = new Random(); </pre></pre></td></tr></table></span></div>
  813. <p>These values are arbitrary; feel free to adjust them as you like.</p>
  814. </li>
  815. <li>
  816. <p>Now, modify the <b>Update</b> method to match the following code:</p>
  817. <div class="code"><span codeLanguage=""><table><tr><th> </th></tr><tr><td><pre><pre>protected override void Update(GameTime gameTime)
  818. {
  819. // Get input
  820. KeyboardState keyboard = Keyboard.GetState();
  821. GamePadState gamePad = GamePad.GetState(PlayerIndex.One);
  822. // Allows the game to exit
  823. if (gamePad.Buttons.Back == ButtonState.Pressed)
  824. this.Exit();
  825. // Move the player left and right with arrow keys or d-pad
  826. if (keyboard.IsKeyDown(Keys.Left) ||
  827. gamePad.DPad.Left == ButtonState.Pressed)
  828. {
  829. personPosition.X -= PersonMoveSpeed;
  830. }
  831. if (keyboard.IsKeyDown(Keys.Right) ||
  832. gamePad.DPad.Right == ButtonState.Pressed)
  833. {
  834. personPosition.X += PersonMoveSpeed;
  835. }
  836. // Spawn new falling blocks
  837. if (random.NextDouble() &lt; BlockSpawnProbability)
  838. {
  839. float x = (float)random.NextDouble() *
  840. (Window.ClientBounds.Width - blockTexture.Width);
  841. blockPositions.Add(new Vector2(x, -blockTexture.Height));
  842. }
  843. // Update each block
  844. for (int i = 0; i &lt; blockPositions.Count; i++)
  845. {
  846. // Animate this block falling
  847. blockPositions[i] =
  848. new Vector2(blockPositions[i].X,
  849. blockPositions[i].Y + BlockFallSpeed);
  850. }
  851. base.Update(gameTime);
  852. } </pre></pre></td></tr></table></span></div>
  853. </li>
  854. <li>
  855. <p>Before continuing, carefully read the preceding code, which performs the following actions:</p>
  856. <ol>
  857. <li>Collects user input.</li>
  858. <li>Adjusts the position of the player character accordingly.</li>
  859. <li>Creates new blocks some percentage of the time.</li>
  860. <li>Creates new blocks at random positions along the top of the screen.</li>
  861. <li>Animates each block falling down.</li>
  862. </ol>
  863. <p>Compile and run your project by pressing F5 or clicking the <b>Debug</b> menu, and then clicking <b>Start Debugging</b>. You should see your falling blocks and be able to move the player character!</p>
  864. </li>
  865. </ol>
  866. </div>
  867. <a id="ID2EGBAC" name="ID2EGBAC"> </a><h1 class="heading">Step 4: Boundary Collision</h1><div id="ID2EGBAC" class="hxnx1">
  868. <p>You may have noticed that you can move your character off screen and simply hide from all the following blocks (not that you would need to because the blocks can't hurt you yet). What might not be immediately visible is the fact that your falling blocks are not being deleted from the game. If you leave your game running for a long time, it will consume all of the memory available on your system!</p>
  869. <p>To remedy these two problems, you need to constrain the player character to the window's boundaries and delete blocks that fall off the bottom.</p>
  870. <ol>
  871. <li>
  872. <p>Modify the <b>Update</b> method by adding the lines in bold from the following code:</p>
  873. <div class="code"><span codeLanguage=""><table><tr><th> </th></tr><tr><td><pre><pre>protected override void Update(GameTime gameTime)
  874. {
  875. // Get input
  876. KeyboardState keyboard = Keyboard.GetState();
  877. GamePadState gamePad = GamePad.GetState(PlayerIndex.One);
  878. // Allows the game to exit
  879. if (gamePad.Buttons.Back == ButtonState.Pressed)
  880. this.Exit();
  881. // Move the player left and right with arrow keys or d-pad
  882. if (keyboard.IsKeyDown(Keys.Left) ||
  883. gamePad.DPad.Left == ButtonState.Pressed)
  884. {
  885. personPosition.X -= PersonMoveSpeed;
  886. }
  887. if (keyboard.IsKeyDown(Keys.Right) ||
  888. gamePad.DPad.Right == ButtonState.Pressed)
  889. {
  890. personPosition.X += PersonMoveSpeed;
  891. }
  892. <b>// Prevent the person from moving off of the screen
  893. personPosition.X = MathHelper.Clamp(personPosition.X,
  894. 0, Window.ClientBounds.Width - personTexture.Width);</b>
  895. // Spawn new falling blocks
  896. if (random.NextDouble() &lt; BlockSpawnProbability)
  897. {
  898. float x = (float)random.NextDouble() *
  899. (Window.ClientBounds.Width - blockTexture.Width);
  900. blockPositions.Add(new Vector2(x, -blockTexture.Height));
  901. }
  902. // Update each block
  903. for (int i = 0; i &lt; blockPositions.Count; i++)
  904. {
  905. // Animate this block falling
  906. blockPositions[i] =
  907. new Vector2(blockPositions[i].X,
  908. blockPositions[i].Y + BlockFallSpeed);
  909. <b>// Remove this block if it have fallen off the screen
  910. if (blockPositions[i].Y &gt; Window.ClientBounds.Height)
  911. {
  912. blockPositions.RemoveAt(i);
  913. // When removing a block, the next block will have the same index
  914. // as the current block. Decrement i to prevent skipping a block.
  915. i--;
  916. }</b>
  917. }
  918. base.Update(gameTime);
  919. } </pre></pre></td></tr></table></span></div>
  920. <p>The first set of code in bold simply prevents <i>personPosition.X</i> from ever becoming a value that places the player character outside the window's boundaries. The second set of code in bold identifies falling blocks that have left the bottom of the screen. When a block has left the bottom of the screen, it is removed from the blocks collection. </p>
  921. <p>Both sets of code in bold are extremely simple collision detection and response mechanisms. They rely on knowledge of the specific rules of the obstacle avoidance game.</p>
  922. </li>
  923. <li>
  924. <p>Compile and run your project by pressing F5 or clicking the <b>Debug</b> menu, and then clicking <b>Start Debugging</b>. You should be unable to move your player character outside the screen, and the game won't slowly fill up your computer's memory.</p>
  925. </li>
  926. </ol>
  927. </div>
  928. <a id="ID2EZCAC" name="ID2EZCAC"> </a><h1 class="heading">Step 5: Rectangle Collision</h1><div id="ID2EZCAC" class="hxnx1">
  929. <p>If you have made it this far, you are just one piece of the puzzle away from something that resembles a game: your character needs to be able to get hit.</p>
  930. <p>For the scope of this tutorial, the game will simply change the background color to red when the player character is hit with a falling block.</p>
  931. <ol>
  932. <li>
  933. <p>Add the following declaration to the top of the <b>Game</b> class.</p>
  934. <div class="code"><span codeLanguage=""><table><tr><th> </th></tr><tr><td><pre><pre>// For when a collision is detected
  935. bool personHit = false; </pre></pre></td></tr></table></span></div></li>
  936. <li>
  937. <p>Modify the <b>Draw</b> method to begin like this:</p>
  938. <div class="code"><span codeLanguage=""><table><tr><th> </th></tr><tr><td><pre><pre>protected override void Draw(GameTime gameTime)
  939. {
  940. GraphicsDevice device = graphics.GraphicsDevice;
  941. // Change the background to red when the person was hit by a block
  942. if (personHit)
  943. device.Clear(Color.Red);
  944. else
  945. device.Clear(Color.CornflowerBlue); </pre></pre></td></tr></table></span></div>
  946. </li>
  947. <li>
  948. <p>Now, you need to determine whether any of the falling blocks collide with the player. One simple way to do this is to determine whether the bounding rectangles of their sprites intersect. The XNA Framework provides a simple <b>Rectangle.Intersects</b> method for just this purpose.</p>
  949. <p>Modify the block update loop in the <b>Update</b> method to look like this (new lines are in bold):</p>
  950. <div class="code"><span codeLanguage=""><table><tr><th> </th></tr><tr><td><pre><pre><b>// Get the bounding rectangle of the person
  951. Rectangle personRectangle =
  952. new Rectangle((int)personPosition.X, (int)personPosition.Y,
  953. personTexture.Width, personTexture.Height);</b>
  954. // Update each block
  955. <b>personHit = false;</b>
  956. for (int i = 0; i &lt; blockPositions.Count; i++)
  957. {
  958. // Animate this block falling
  959. blockPositions[i] =
  960. new Vector2(blockPositions[i].X,
  961. blockPositions[i].Y + BlockFallSpeed);
  962. <b>// Get the bounding rectangle of this block
  963. Rectangle blockRectangle =
  964. new Rectangle((int)blockPositions[i].X, (int)blockPositions[i].Y,
  965. blockTexture.Width, blockTexture.Height);
  966. // Check collision with person
  967. if (personRectangle.Intersects(blockRectangle))
  968. personHit = true;</b>
  969. // Remove this block if it have fallen off the screen
  970. if (blockPositions[i].Y &gt; Window.ClientBounds.Height)
  971. blockPositions.RemoveAt(i);
  972. } </pre></pre></td></tr></table></span></div>
  973. <p>This code determines the bounding rectangles for the player character and for each sprite. Each block's bounding rectangle is tested for intersection with the player character's bounding rectangle.</p></li>
  974. <li>
  975. <p>And that's it. Compile and run your project by pressing F5 or clicking the <b>Debug</b> menu, and then clicking <b>Start Debugging</b>.</p></li>
  976. </ol>
  977. </div>
  978. <a id="ID2E2EAC" name="ID2E2EAC"> </a><h1 class="heading">Congratulations!</h1><div id="ID2E2EAC" class="hxnx1">
  979. <p>You did it. There's a lot to making games, but you've accomplished a lot for just one short tutorial. An interactive experience with an objective thanks to simple collision detection. From here, there's no limit to where you can go!</p>
  980. <p>Go to 2D Collision Tutorial 2: Per Pixel to continue. </p>
  981. <a id="ID2ECFAC" name="ID2ECFAC"> </a><h2 class="subHeading">Ideas to Expand</h2><div id="ID2ECFAC" class="hxnx2">
  982. <p>Got the urge to tinker with the project a bit? Try these ideas.</p>
  983. <ul>
  984. <li>Add a counter for number of blocks successfully dodged.</li>
  985. <li>As the game progresses, make more blocks fall, and at a faster rate.</li>
  986. <li>Add a five-second invincibility power up. The character should have to collide with the power up to activate.</li>
  987. </ul>
  988. </div>
  989. </div>
  990. </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: 2D Collision Tutorial 1: Rectangle">[email protected]</a>.</p></div></div></body></html>