<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mach X Games Blog</title>
	<atom:link href="http://machxgames.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://machxgames.com/blog</link>
	<description>Adventures in Indie XNA Game Development</description>
	<lastBuildDate>Fri, 07 Jun 2013 01:14:27 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Thoughts on indies</title>
		<link>http://machxgames.com/blog/?p=152</link>
		<comments>http://machxgames.com/blog/?p=152#comments</comments>
		<pubDate>Fri, 07 Jun 2013 01:14:27 +0000</pubDate>
		<dc:creator>Mach X Games</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[game dev]]></category>
		<category><![CDATA[indie]]></category>

		<guid isPermaLink="false">http://machxgames.com/blog/?p=152</guid>
		<description><![CDATA[So the whole “Indies won’t be able to self-publish on the Xbox One” thing has gotten me thinking about exactly what is an indie. This has been done to death on tons of other sites by people much wiser in the game development industry than myself, but one more opinion isn’t going to hurt, is [...]]]></description>
				<content:encoded><![CDATA[<p>So the whole “Indies won’t be able to self-publish on the Xbox One” thing has gotten me thinking about exactly what is an indie. This has been done to death on tons of other sites by people much wiser in the game development industry than myself, but one more opinion isn’t going to hurt, is it? And I need to start posting more here anyway, so let’s give it a shot.</p>
<p>Let’s start with Wikipedia’s definition:</p>
<p>“…developers that are not owned by a publisher. Independent developers retain operational control over their companies, pipelines, and organizations and often may work with proprietary engines or other proprietary software. These teams may range in size from single individuals to major companies with hundreds of employees.</p>
<p>Independent developers may choose to work with one or more game publishers or to self-publish their titles.”</p>
<p>The only problem is have with this definition is the working with publishers part. Once a publisher is involved you normally have to give up control of the game in some way. The publisher may require you to make changes to the game that you don’t want to make and, since they’re the one with the money, you usually have to do what they say. That’s when you’re no longer an indie in my opinion. When someone else can tell you have to make your game, you’re not independent.</p>
<p>&#160;</p>
<p><u>Indies and money</u></p>
<p>I’ve seen posts by people in forums, Twitter, etc. that if you’re trying to make&#160; money as a game developer you’re not a true indie. This has to be the stupidest notion I’ve ever heard of. I guess this is the same kind of thinking about starving artists are the only real artists and every successful artist must be a sell-out. Any sane, rational, semi-intelligent person with the slightest bit of common sense knows this is nonsense. The two things are not mutually exclusive. The rise of many of the more successful game developers who are still doing their own thing and not relying on publishers proves that you can be indie and still make money. </p>
<p>&#160;</p>
<p><u>Indies and platforms</u></p>
<p>So the other day news went around about how some &lt; insert expletive here &gt; loser took it upon himself to make a PC version of Ska Studio’s game The Dishwasher: Vampire Smile simply because no PC version existed. He claimed it wasn’t piracy, but a “restoration of justice”. Given the quality of his written word in quotes I’ve seen, the guy either is not an English-as-a-first-language person is not all there mentally. Maybe it’s a bit of both. </p>
<p>In any case, this brings up the craziness surrounding those devs that are targeting platforms other than PC. A lot of small studios are cranking out mobile games because it’s cheap and easy. Making money from mobile is still a tricky business though because of the glut of games on various mobile platforms. PC game dev is still relatively simple is you’re making low-end, simple games because the majority of game PCs can handle them so you’re not limiting your target audience. I’ve not seen people question the indie-ness of devs targeting these platforms or even other less-popular ones such as the Ouya (I still think of the Kool-Aid Man when I hear this “Oh, yeah!” <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="http://machxgames.com/blog/wp-content/uploads/2013/06/wlEmoticon-smile.png" />. In the case of Ska Studios, they recently announced that they would, in fact, be porting D:VS to PC. All of the sudden, the cries of the un-washed masses were resounding with “You’re just doing it for the money!” and other insanity. What’s wrong with people?!? Why did it become about money in this case? Was it because people assumed that Ska was afraid of losing money from people who downloaded the illegal port rather than their port? Was it because Ska was targeting more than one platform with their games? Was it because a lot of people on the internet are insane? (I’m voting that one)</p>
<p>&#160;</p>
<p><u>The future of indies</u></p>
<p>Despite all the craziness around the PS4 and X1 reveals regarding indies being able to target them, I think indies are going to be the go-to point for the unique, original games as publishers get even more leery about backing new IP. I was happy to see that there would be at least one new IP on the X1 and hope other studios are able to bring something to the console other than &lt; IP &gt; &lt; some number greater than 1 &gt;. If MS does the smart thing and brings out a new version of XNA Game Studio (read: something that doesn’t require C++) and allows indies to get games onto it, and continues the Dream-Build-Play contest to bring those talented indies into the limelight, I think it’ll be a great time to be an indie. I’m still hoping to join the ranks of James Silva, James Petruzzi, and other great indie game devs named James. <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="http://machxgames.com/blog/wp-content/uploads/2013/06/wlEmoticon-smile.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://machxgames.com/blog/?feed=rss2&#038;p=152</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xbox One, XNA, the Future of Indie Game Development, and Bad &#8220;Journalism&#8221;</title>
		<link>http://machxgames.com/blog/?p=149</link>
		<comments>http://machxgames.com/blog/?p=149#comments</comments>
		<pubDate>Wed, 29 May 2013 23:11:25 +0000</pubDate>
		<dc:creator>Mach X Games</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Xbox]]></category>
		<category><![CDATA[game dev]]></category>
		<category><![CDATA[X1]]></category>
		<category><![CDATA[XBLIG]]></category>
		<category><![CDATA[Xbox One]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://machxgames.com/blog/?p=149</guid>
		<description><![CDATA[So Microsoft’s new console, ridiculously name the Xbox One, was unveiled last week to a less than overwhelmed audience. While there was plenty of applause during portions of the reveal, the aftermath of the presentation left the majority of gamer community like this: The reveal seemed to be about several things: the Xbox One is [...]]]></description>
				<content:encoded><![CDATA[<p>So Microsoft’s new console, ridiculously name the Xbox One, was unveiled last week to a less than overwhelmed audience. While there was plenty of applause during portions of the reveal, the aftermath of the presentation left the majority of gamer community like this:</p>
<p><a href="http://4.bp.blogspot.com/-E08WPgZhfWw/Td4UsaYGukI/AAAAAAAAAYk/Mpm_gZU-I_Y/s1600/1epic_facepalm_by_rjth_255b1_255d.jpg" target="_blank"><img style="float: none; margin-left: auto; display: block; margin-right: auto" src="http://ts1.mm.bing.net/th?id=H.4683336470823724&amp;pid=1.7&amp;w=250&amp;h=187&amp;c=7&amp;rs=1" /></a></p>
<p>The reveal seemed to be about several things:</p>
<ul>
<li>the Xbox One is your one stop entertainment device</li>
<li>it’ll play sports games, racing games, and the next Call of Duty</li>
<li>it’s all about the cloud</li>
<li>Kinect is your friend (or it better become your friend since it’s always going to be there even if you don’t want it around)</li>
</ul>
<p>The first bullet point seemed to be a huge turnoff to almost everyone, despite the fact that it’s something you can completely ignore if you don’t care about it. It was almost another facepalm moment reading and listening to everyone putting so much emphasis on a feature that they’ll probably never use. I might be able to understand if it were something that would be an impediment to using the console, but that doesn’t seem to be the case.</p>
<p>Having a Kinect bundled with every console was also mostly met with negativity. Partly I think this is because it’s going to increase the cost of the console and partly the fact that it was stated that it always has to be one (mainly to allow you to just say “Xbox on” to start the console it appears). I understand Microsoft trying to make the device more attractive to both gamers and developers, but with the recent backlash about Kinect snooping on people and gather all kinds of data that has the possibility of being obtained by other people (why this is a big deal I’ve yet to figure out since the data it gathers doesn’t appear to be of the kind that could be used against a person or be embarrassing, unless you’re the type of person to be doing stuff in front of it that you wouldn’t do in public) I think MS is making a mistake here. The crop of Kinect-enabled games this generation was mostly ignored. The only one I really got into more than a little bit was UFC Trainer and that lasted maybe two months.</p>
<p>Of these, only the 2nd bullet point would be something gamers care about and the two genres are not among the biggest and it seems CoD is not the big draw it used to be. In addition, the fact that it’s not backward compatible was a huge turnoff to many. Why this is the case, I’m not sure. I’d be willing to bet the majority of gamers won’t be playing Xbox 360 games for very long after they get the new console. </p>
<p>Additional confusion came about after a couple of statements were made that weren’t completely clear – the XBLA and XBLIG channels would be going away; all games would be lumped together (hopefully with better discoverability tools!) and indies would not be able to self-publish on the new console. This led many to believe that it’s not going to be possible for indies to get their games on the console at all, since there’s about .000000001% possibility for the average indie developer to get a publisher interested enough in their game to pick it up and publish it.</p>
<p>Granted, this seems to have been cleared up a bit since Don Matrick was quoted on Kotaku and other sites saying </p>
<p>“We’re going to have an independent creator program. We’re going to sponsor it. We’re going to give people tools. That is something we think—I think—is important. That’s how I started in the industry. There’s no way we’re going to build a box that doesn’t support that.”</p>
<p>Of course, many people are now saying that the left hand of Microsoft doesn’t know what the right is doing and that people within the company are contradicting themselves. Some days you just can’t win I guess.</p>
<p>It appears that indies are going to be ok on the Xbox One (I’m going to start shortening it to X1 I think since I think those who are using the derogatory &quot;Xbone” are showing themselves as haters or jumping on the anti-MS bandwagon. To those people, <a href="http://gamasutra.com/blogs/JamesSilva/20130523/192832/Were_Indie_we_like_Microsoft_Too_Controversial.php" target="_blank">this</a>.) Still, I’m not committing myself to the X1 until after E3 and Build. I really hope MS does the smart thing and brings back XNA Game Studio in some form. XBLIG has made them a good bit of money and brought indie game development to the level where people can make a decent living off of it.</p>
]]></content:encoded>
			<wfw:commentRss>http://machxgames.com/blog/?feed=rss2&#038;p=149</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>World Screen Screenshot</title>
		<link>http://machxgames.com/blog/?p=141</link>
		<comments>http://machxgames.com/blog/?p=141#comments</comments>
		<pubDate>Thu, 10 Jan 2013 03:20:54 +0000</pubDate>
		<dc:creator>Mach X Games</dc:creator>
				<category><![CDATA[Screenshots]]></category>
		<category><![CDATA[Status Update]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://machxgames.com/blog/?p=141</guid>
		<description><![CDATA[Well, it&#8217;s getting there:]]></description>
				<content:encoded><![CDATA[<p>Well, it&#8217;s getting there:</p>
<p><a href="http://machxgames.com/blog/?attachment_id=142" rel="attachment wp-att-142"><img class="alignnone size-medium wp-image-142" alt="WorldScreen" src="http://machxgames.com/blog/wp-content/uploads/2013/01/WorldScreen-300x175.png" width="300" height="175" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://machxgames.com/blog/?feed=rss2&#038;p=141</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Dungeon Editor Screenshot</title>
		<link>http://machxgames.com/blog/?p=136</link>
		<comments>http://machxgames.com/blog/?p=136#comments</comments>
		<pubDate>Wed, 09 Jan 2013 13:42:39 +0000</pubDate>
		<dc:creator>Mach X Games</dc:creator>
				<category><![CDATA[Screenshots]]></category>
		<category><![CDATA[Status Update]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://machxgames.com/blog/?p=136</guid>
		<description><![CDATA[Some progress: Added 2nd layer for regular and secret doors Triggers (X in screenshot) and traps (square in screenshot) now rendering Load and save working, using sharpSerializer since normalize XmlSerializer doesn&#8217;t like arrays, among other things. &#160;]]></description>
				<content:encoded><![CDATA[<p>Some progress:</p>
<ul>
<li><span style="line-height: 13px;" data-mce-mark="1">Added 2nd layer for regular and secret doors</span></li>
<li>Triggers (X in screenshot) and traps (square in screenshot) now rendering</li>
<li>Load and save working, using <a href="http://www.sharpserializer.com/en/index.html">sharpSerializer </a>since normalize XmlSerializer doesn&#8217;t like arrays, among other things.</li>
</ul>
<p>&nbsp;</p>
<p><a href="http://machxgames.com/blog/?attachment_id=137" rel="attachment wp-att-137"><img class="alignnone size-medium wp-image-137" alt="DungeonEditorScreenshot2" src="http://machxgames.com/blog/wp-content/uploads/2013/01/DungeonEditorScreenshot2-300x222.png" width="300" height="222" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://machxgames.com/blog/?feed=rss2&#038;p=136</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dungeon Editor, 1st Iteration</title>
		<link>http://machxgames.com/blog/?p=133</link>
		<comments>http://machxgames.com/blog/?p=133#comments</comments>
		<pubDate>Tue, 08 Jan 2013 02:59:28 +0000</pubDate>
		<dc:creator>Mach X Games</dc:creator>
				<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Screenshots]]></category>
		<category><![CDATA[Status Update]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://machxgames.com/blog/?p=133</guid>
		<description><![CDATA[Behold my awesome graphical skills! It&#8217;s got a long way to go, but it&#8217;ll do for now: &#160;]]></description>
				<content:encoded><![CDATA[<p>Behold my awesome graphical skills! <img src='http://machxgames.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  It&#8217;s got a long way to go, but it&#8217;ll do for now:</p>
<p>&nbsp;</p>
<p><a href="http://machxgames.com/blog/?attachment_id=134" rel="attachment wp-att-134"><img class="alignnone size-medium wp-image-134" alt="DungeonEditor" src="http://machxgames.com/blog/wp-content/uploads/2013/01/DungeonEditor-300x187.png" width="300" height="187" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://machxgames.com/blog/?feed=rss2&#038;p=133</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thoughts on Stat Types and Skills</title>
		<link>http://machxgames.com/blog/?p=127</link>
		<comments>http://machxgames.com/blog/?p=127#comments</comments>
		<pubDate>Mon, 07 Jan 2013 14:42:10 +0000</pubDate>
		<dc:creator>Mach X Games</dc:creator>
				<category><![CDATA[Game Design]]></category>

		<guid isPermaLink="false">http://machxgames.com/blog/?p=127</guid>
		<description><![CDATA[So I&#8217;m thinking of going with just a few types of stats for the dungeon crawler I&#8217;m prototyping: Strength &#8211; how much a character can carry and modifies the damage done with melee weapons Dexterity &#8211; helps determine if a character hits during combat and how well he performs skills like lockpicking Agility &#8211; how [...]]]></description>
				<content:encoded><![CDATA[<p>So I&#8217;m thinking of going with just a few types of stats for the dungeon crawler I&#8217;m prototyping:</p>
<p>Strength &#8211; how much a character can carry and modifies the damage done with melee weapons<br />
Dexterity &#8211; helps determine if a character hits during combat and how well he performs skills like lockpicking<br />
Agility &#8211; how well a character moves and dodges during combat and performs skills like climbing<br />
Constitution &#8211; helps determine a character ability to soak up damage, whether in combat or due to things like poison. Fairly standard.<br />
Intelligence &#8211; overall stat for character&#8217;s mental abilities, includes will power in resisting magical spells like illusions, ability to learn spells, etc. I can&#8217;t think of a better term for this.</p>
<p>I don&#8217;t want to overdo this, but I want some flexibility and &#8220;realism&#8221; (quoted because I mean realistic in the game world, not necessarily in this one <img src='http://machxgames.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ). Some RPG systems lump agility and dexterity together into one stat, which I think doesn&#8217;t fit. A character could be a great lockpicker but horrible at dodging blows in combat or a great swordsman but doesn&#8217;t climb very well, so one stat for both is kind of silly.</p>
<p>For skills, the usual dungeon crawler types of actions will need to be done by a character, besides combat. Lockpicking, the ability to find things that don&#8217;t want to be easily found (traps, secret door, etc.), climbing (maybe, for getting out of pits if I implement them), sneaking up on other entities. I&#8217;m not sure how deep I want to go here. Implementing skills means dealing with allowing a character to become better at them, and I&#8217;ve never really liked many skill progression systems. &#8220;Realistically&#8221;, a character would get better at things the more they do them, as in games like Dungeon Siege. That&#8217;s a good bit of work to handle. Less realistic is allowing a character to &#8220;train&#8221; at skills by spending skill points. Easier to implement, but just feels wrong.</p>
]]></content:encoded>
			<wfw:commentRss>http://machxgames.com/blog/?feed=rss2&#038;p=127</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>New game idea LFF (Looking For Feedback)</title>
		<link>http://machxgames.com/blog/?p=126</link>
		<comments>http://machxgames.com/blog/?p=126#comments</comments>
		<pubDate>Thu, 03 Jan 2013 18:31:05 +0000</pubDate>
		<dc:creator>Mach X Games</dc:creator>
				<category><![CDATA[Game Design]]></category>

		<guid isPermaLink="false">http://machxgames.com/blog/?p=126</guid>
		<description><![CDATA[So I&#8217;m a glutton for punishment. I&#8217;ve got a couple of games already started and decided to think about starting a new one. :\ Being an RPG/dungeon crawler fan, I wondered what a game that is completely about dungeon crawling could look like. I also thought about how cool it would be if the game [...]]]></description>
				<content:encoded><![CDATA[<p>So I&#8217;m a glutton for punishment. I&#8217;ve got a couple of games already started and decided to think about starting a new one. :\</p>
<p>Being an RPG/dungeon crawler fan, I wondered what a game that is completely about dungeon crawling could look like. I also thought about how cool it would be if the game could dynamically be expanded through user contributions.</p>
<p>The basic idea is a world map that shows, from the start, all the dungeons that are known to exist in the world. It shows dungeons you&#8217;ve completed and not completed differently. It could also show new dungeons that have been &#8220;discovered&#8221; (uploaded by community) since you last played. The &#8220;goal&#8221; of the game would be to complete every dungeon in the world.</p>
<p>Leaderboards would show stats such as most loot collected, most monsters killed, most experienced characters as well as non-in-game stats such as highest-rated dungeon (did I fail to mention that the community could vote of contributed dungeons? <img src='http://machxgames.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ), most crawled through dungeon, highest rated designer, etc.</p>
<p>One idea I&#8217;m kicking around is that a player can only have one character at a time. If a character dies, you start over. Stats will carry over, loot and such, but stats would also be displayed as an average &#8211; total loot/exp/etc. / number of characters.</p>
<p>Ideally, contributions uploaded by the community would be scanned and ranked based on content &#8211; total treasure, total monster exp, etc. in order to allow only characters in a certain range to go through them. Designers could just load down a dungeon will all treasure and no monsters. The loot-to-monster ratio would have to be within a certain percentage.</p>
<p>I need to figure out the specific RPG elements &#8211; character stats, classes, equipment, etc. as well as monster and dungeon designing tools, but that&#8217;s just a matter of time to ensure the tools are robust enough to enable designers to create good, fun content.. Figuring out if this would even work and be fun is something that I need to get some opinions on. I know it would be fun for me as both a player and a designer. I imagine the achievement/leaderboard junkies would play to get to the top of the boards.</p>
<p>I could see this expanding into areas like allowing players to trade and buy and sell loot, grouping and guilds (this would be single-player only at first), etc. Things like this would be wayyyyy down the road. <img src='http://machxgames.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I&#8217;m hoping I get some good feedback and see where this thing goes.</p>
]]></content:encoded>
			<wfw:commentRss>http://machxgames.com/blog/?feed=rss2&#038;p=126</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Once more into the breach!</title>
		<link>http://machxgames.com/blog/?p=124</link>
		<comments>http://machxgames.com/blog/?p=124#comments</comments>
		<pubDate>Tue, 01 Jan 2013 17:35:07 +0000</pubDate>
		<dc:creator>Mach X Games</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[MVP]]></category>
		<category><![CDATA[XBLIG]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://machxgames.com/blog/?p=124</guid>
		<description><![CDATA[So I got that email I was hoping I&#8217;d get this morning. I&#8217;m once more an XNA MVP. Seven years now. Now I have to figure out what to do this year to keep it. With XNA being the proverbial red-headed stepchild right now to MS, that&#8217;s going to be more difficult. I&#8217;ve been planning [...]]]></description>
				<content:encoded><![CDATA[<p>So I got that email I was hoping I&#8217;d get this morning. I&#8217;m once more an XNA MVP. Seven years now. Now I have to figure out what to do this year to keep it. With XNA being the proverbial red-headed stepchild right now to MS, that&#8217;s going to be more difficult.</p>
<p>I&#8217;ve been planning on looking into other technologies for doing games on Windows 8 so that they would be able to be featured in the Windows Store. That&#8217;s probably going to take away some time from doing anything XNA related to maintain my MVP status.</p>
<p>I&#8217;m still planning on, and currently taking a break from coding to write this, releasing at least one game on XBLIG. That won&#8217;t really help with with maintaining my MVP status, but it could be a step towards becoming a full-time indie game developer.</p>
<p>Note to self: I need to work on some other New Years resolutions besides getting a game on XBLIG.</p>
<p>In any case, I think it&#8217;s going to be an interesting year now that we&#8217;ve survived the non-existent Mayan apocalypse. <img src='http://machxgames.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://machxgames.com/blog/?feed=rss2&#038;p=124</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Picking up Microsoft’s slack</title>
		<link>http://machxgames.com/blog/?p=119</link>
		<comments>http://machxgames.com/blog/?p=119#comments</comments>
		<pubDate>Thu, 30 Aug 2012 22:21:50 +0000</pubDate>
		<dc:creator>Mach X Games</dc:creator>
				<category><![CDATA[XNA]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[XBLIG]]></category>

		<guid isPermaLink="false">http://machxgames.com/blog/?p=119</guid>
		<description><![CDATA[Seems like Quality Control is something MS (at least the Windows Phone/XNA/XBLIG/whoever is left these days) isn’t interested in. They broke a huge amount of content in the split between Windows Phone and XBLIG in the old App Hub site. One of the pieces of content was a Best Practices page for doing XNA games. [...]]]></description>
				<content:encoded><![CDATA[<p>Seems like Quality Control is something MS (at least the Windows Phone/XNA/XBLIG/whoever is left these days) isn’t interested in. They broke a huge amount of content in the split between Windows Phone and XBLIG in the old App Hub site. One of the pieces of content was a Best Practices page for doing XNA games. While it’s still findable using the Way Back Machine, all the links in it are broken, so I figured I’d recreate it here and also use it as an excuse to update this blog which I’ve slacked on.</p>
<p>&nbsp;</p>
<h6><span style="font-family: Verdana; font-size: medium;">Best Practices for Indie Games 3.1</span></h6>
<p>&nbsp;</p>
<p>If you are interested in creating an Xbox LIVE Indie Game, use this guide to understand the expectations of the millions of gamers who will be downloading and playing your game, and the actions you can take to make your game look, feel, and play its very best.</p>
<p><strong>This Guide references features in XNA Game Studio 3.1. A guide for XNA Game Studio 4.0 is being developed, but is not yet available.</strong></p>
<p>A few things to remember:</p>
<ul>
<li>The sections in this guide are ordered by priority, but everything in it is important! Please be sure to read it all and verify that your game take these issues into account.</li>
<li>While these best practices are suggestions and not requirements, in many cases your game will be unplayable if you do not follow them. While they are not necessary to pass peer review, and reviewers should not use these guidelines to pass or reject games, they may reject games that are unplayable!</li>
<li>Use the playtest support available in the submission process on the App Hub website to have other developers help validate and catch issues with your games, before millions of gamers do.</li>
</ul>
<p><strong><br />
Gamers Expect Games to &#8220;Just Work&#8221; on Any TV</strong></p>
<p><strong><br />
</strong></p>
<p><strong>Background:</strong> Xbox 360 consoles can be plugged into TV sets of all types, with many different resolutions, aspect ratios, and more. Overscan (edges of the TV screen which don’t draw the entire viewport), stretching of your game&#8217;s visuals, and even crashes can occur if resolutions are not handled properly.</p>
<p><strong><br />
</strong></p>
<p><strong>Actions:</strong></p>
<ul>
<li>Set your game&#8217;s resolution to 1280 x 720 (720p native resolution) to work on all TVs. This gives you a single resolution target for all of your art content.</li>
<li>Draw the entire scene to your Viewport size, but draw your critical gameplay features (HUD, main character, and so on) to the region inside</li>
<li><strong>Viewport.TitleSafeArea.</strong></li>
<li>If using text, use a 14-point or higher font to insure the font can be read on standard-definition TVs. Draw the <strong>SpriteFont</strong>s at full size.</li>
</ul>
<p><strong>For Reference, See:</strong></p>
<ul>
<li><a href="http://msdn.microsoft.com/library/bb203938.aspx">Xbox 360 Programming Considerations</a></li>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/safe_area">Safe Area</a></li>
<li><a href="http://msdn.microsoft.com/library/bb203889.aspx">Displays, Client Bounds, Viewports, and Back Buffers</a></li>
</ul>
<p><strong><br />
Gamers Expect a Good Trial Mode</strong></p>
<p><strong><br />
</strong></p>
<p><strong>Background:</strong> Many gamers want to try before they buy, and the Xbox LIVE Indie Games system allows players to try a timed trial of your game before they buy. Currently, the trial mode time is set at eight minutes. When the time runs out, the player is shown a screen where he or she can either purchase the full game, or exit. The only additional restriction in Trial Mode is that Xbox LIVE matchmaking is disabled. During the trial, you have the opportunity to show off the very best your game has to offer.</p>
<p><strong><br />
</strong></p>
<p><strong>Actions:</strong></p>
<ul>
<li>Check whether the game is in Trial Mode by checking if the <strong>Guide.IsTrialMode</strong> property is <strong>true</strong>. This will always start out as true, and can change shortly after game startup, or as part of a new player signing in, or in response to an in-game purchase. Be sure to check this once every frame, as opposed to just once at startup.</li>
<li>Consider ways to give the player the best experience in the limited amount of time available. This may mean you want avoid title screens or exposition on the story and get right to the gameplay as soon as possible. The time limit for trial mode time is currently set to eight minutes, although this may be changed in the future.</li>
<li>When the purchase screen opens, Xbox LIVE Indie Games will set <strong>Game.IsActive </strong>to <strong>false</strong>. If the player chooses to buy the game and a successful purchase is made, the game will resume and <strong>Guide.IsTrialMode </strong>will be set to <strong>false</strong>. You can manually activate the purchase screen before the time limit expires if you wish, by calling <strong>Guide.ShowMarketplace</strong>. Your game must be able to handle the IsTrialMode changing without re-starting. This may mean that you need to reload or re-initialize the menus, gameplay or other aspects of the game “on-the-fly” when the flag changes.</li>
<li>Consider displaying a scene as the gamer exits the game that gives the gamer the option of being taken to Marketplace to purchase the game using the <strong>Guide.ShowMarketplace </strong>API, if <strong>Guide.IsTrialMode </strong>property is <strong>true</strong>.</li>
<li>If your game has Xbox LIVE multiplayer support, disable it at the menu if the game is in Trial Mode &#8211; if the player selects the option, you can call <strong>Guide.ShowMarketplace</strong>. Remember to re-enable it if the <strong>Guide.IsTrialMode</strong> flag changes to <strong>false</strong> during the game!</li>
<li>Test out trial mode by setting <strong>Guide.SimulateTrialMode </strong>to <strong>true</strong>, or by using the “Play Trial Game” option to launch your game from the Xbox Dashboard. This forces the <strong>Guide.IsTrialMode</strong> flag to <strong>true</strong>. You can also test that the game handles the transition from Trial mode to being purchased by changing the <strong>Guide.SimulateTrialMode</strong> to <strong>false</strong> during game play using a button on the controller that game doesn’t ordinarily use. This way, you know that the game will work properly when they purchase the game without re-starting.</li>
</ul>
<p><strong>For Reference, See:</strong></p>
<ul>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/network_game_state_management">Network Game State Management</a></li>
</ul>
<p><strong><br />
Gamers Expect a Friendly Menu and Control System</strong></p>
<p><strong><br />
</strong></p>
<p><strong>Background:</strong> Games are essentially a cycle – from the Main Menu (and alternate menus such as Options and Help), gamers expect to enter a game session, play, and return to the main menu when they are done. Any deviation from this should be intuitive and easy to remember.</p>
<p>For menu navigation, gamers expect to use both the stick and the D-Pad, with <strong>A</strong> being the &#8220;accept&#8221; or &#8220;go forward&#8221; button, and <strong>B</strong> and <strong>Back </strong>being the &#8220;cancel&#8221; or &#8220;go back&#8221; buttons.</p>
<p>Both successful and unsuccessful menu operations should be reported in some way to the user, in both graphical and audio form. If there are errors, they should be provided to the user in simple, prescriptive language that tells the player what to do.</p>
<p><strong><br />
</strong></p>
<p><strong>Actions:<br />
</strong></p>
<ul>
<li>Use a Menu system, such as in the <a href="http://xbox.create.msdn.com/education/catalog/sample/game_state_management">Game State Management Sample</a>.</li>
<li>Use the stick and D-pad to move the menu selector, and use <strong>A</strong> and <strong>B/Back </strong>to choose menu items or cancel, respectively. When using the stick for menu movement, poll with a delay to keep the menu selector from moving too fast.</li>
<li>The active menu item should stand out clearly from other menu options – use patterns, animations, or other graphical items to account for color blind players.</li>
<li>Make sure confirmations and errors are clearly shown to the player, with guidance about what the player should do next.</li>
<li>Consider changing the <strong>Back</strong> button on the controller which by default exits the game with no warning. Provide either a confirmation dialog to insure that the player really wanted to leave the game, or provide an exit menu option from the main menu and remove the <strong>Back</strong> button exit functionality entirely.</li>
<li>The game should bring up a pause menu if the active controller becomes disconnected, or if the player presses the Start button.</li>
<li>In networked games, gameplay should continue behind the pause menu even though the local player is no longer engaged in the action.</li>
<li>Make sure the game respects <strong>Game.IsActive </strong>and pauses as appropriate when this is set to <strong>false</strong>, such as when the guide is being displayed over the game.</li>
<li>Games should not stop or pause without game-representative, on-screen graphics. When the pause time is greater than five seconds, the game must indicate the reason and provide on-screen feedback/explanation (aka Loading Screen)</li>
</ul>
<p><strong>For Reference, See:</strong></p>
<ul>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/game_state_management">Game State Management Sample</a></li>
<li><a href="http://msdn.microsoft.com/library/bb195026.aspx">How To: Pause a Game</a></li>
<li><a href="http://msdn.microsoft.com/library/bb203901.aspx">How To: Detect Whether a Controller Is Disconnected</a></li>
</ul>
<p><strong><br />
Gamers Use One Xbox 360 Controller</strong></p>
<p><strong><br />
</strong></p>
<p><strong>Background:</strong> This may seem obvious, but it is important. Not only do gamers expect to use an Xbox 360 Controller (not a plugged-in keyboard or Chatpad), but in a single-player game, they are going to expect whichever controller they pick up to be the one the game recognizes throughout their gaming session.</p>
<p><strong><br />
</strong></p>
<p><strong>Actions:</strong></p>
<ul>
<li>Be aware that the player may not be using the controller that is assigned to <strong>PlayerIndex.One</strong>. To detect which controller the player is using, create a splash screen or initial menu which prompts to the player to press A or Start. Detect which PlayerIndex pressed the button to start the game and use that as the active controller. Here is an example of code to do this:</li>
</ul>
<blockquote>
<blockquote><p>PlayerIndex controllingPlayer = PlayerIndex.One;<br />
for (PlayerIndex index = PlayerIndex.One; index &lt;= PlayerIndex.Four; index++)<br />
{<br />
if (GamePad.GetState(index).Buttons.Start == ButtonState.Pressed)<br />
{<br />
controllingPlayer = index;<br />
break;<br />
}<br />
}</p></blockquote>
</blockquote>
<ul>
<li>If your game requires a signed in player profile, you can then look up the profile details for the selected PlayerIndex, or if no profile is currently signed in at that index, call <strong>Guide.ShowSignIn</strong> to let the player select their profile:</li>
</ul>
<blockquote>
<blockquote><p>SignedInGamer gamer = Gamer.SignedInGamers[controllingPlayer];<br />
if (gamer != null)<br />
{<br />
playerName = gamer.Gamertag;<br />
}<br />
else<br />
{<br />
Guide.ShowSignIn(1, false);<br />
}</p></blockquote>
</blockquote>
<ul>
<li>Do not require the Keyboard for input.</li>
<li>Games should launch successfully and get to their menu and/or attract mode even if a controller is not active (For example: game is launched with an IR remote).</li>
<li>Use<strong> Guide.ShowSignIn </strong>to support the signing-in of multiple players to a local multiplayer game.</li>
</ul>
<p><strong>For Reference, See:</strong></p>
<ul>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/game_state_management">Game State Management Sample</a></li>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/network_game_state_management">Networked Game State Management Sample</a></li>
</ul>
<p><strong><br />
Be Kind With Audio</strong></p>
<p><strong><br />
</strong></p>
<p><strong>Background:</strong> Audio, at first glance, looks like a very easy technology to get right. Drop in sounds, and play them when asked. However, audio systems are as diverse as TVs. Volume, position, and frequency ranges may be different across the different systems.</p>
<p>Be sure you&#8217;re not playing sounds with wildly different volumes that force players to turn their TV&#8217;s volume up or down.</p>
<p>In addition, some gamers don&#8217;t like music in their games and will want to turn it off &#8211; or replace it with their own through the Xbox 360 Guide.</p>
<p><strong><br />
</strong></p>
<p><strong>Actions:</strong></p>
<ul>
<li>Be sure to test your game audio on as many audio configurations as possible (stereo, mono, 5.1, and headphones).</li>
<li>Identify and eliminate major volume changes between sounds that would force the player to change audio volume while playing your game. Do this by leveling your sounds to a standard sound. The Xbox 360 startup sound is a good reference. Adjust your speaker volume so that the Xbox 360 startup sound is loud, but not overly so, and adjust your game sounds to match that level.</li>
<li>If you have music in your game, you should tag it as such. If you are using XACT, drag the music sounds into the Music category in the tree. If you use the Sound Effects API, then be sure to load your background music files as Song objects, and play them with <strong>MediaPlayer.Play</strong>. These methods ensure that the player can replace the music through the Xbox 360 Guide.</li>
<li>Here&#8217;s a tip to lower your game binary size if you are using XACT: enable XMA compression on your wave banks. Add compression in your XACT project in the &#8220;Compression Presets&#8221; node, and choose the XMA format. Edit the properties of your wavebanks, setting their &#8220;Compression Preset&#8221; box to the new preset.</li>
<li>Be aware that <strong>MediaPlayer.Play</strong> on the Xbox 360 is asynchronous which means that the song doesn’t immediately start playing. Indeed, you can check the next frame and the song almost certainly won’t have started playing by then and the<strong>MediaPlayer.State</strong> will probably still be <strong>MediaState.Stopped</strong>! If you want to start a new song when the old finishes and you check every frame for the current song to be done, each frame you will change songs if you aren’t careful. Instead, add an eventhandler to the <strong>MediaPlayer.ActiveSongChanged</strong> event and when this event fires, you can begin checking for the current song to be done using <strong>MediaPlayer.State == MediaState.Stopped</strong>.</li>
<li>The content processor for the XNA Framework sound effect API defaults to high compression. Consider how compression affects the overall size and load times of your game, versus the quality of the audio.</li>
</ul>
<p><strong><br />
Gamer Profiles Matter</strong></p>
<p><strong><br />
</strong></p>
<p><strong>Background:</strong> Gamers spend a lot of time and effort on their Xbox 360 Profiles. Even if they are not connected to Xbox LIVE, profiles are used in-game to identify which player is which, to store saved games, to identify a gamer in a high score list, and, in some cases, store game defaults such as controller sensitivity. Use these profiles to identify with your gamer, and do things that personalize the experience.</p>
<p><strong><br />
</strong></p>
<p><strong>Actions:</strong></p>
<ul>
<li>The key to profiles is the <strong>GamerServicesComponent</strong>. Add it to your <strong>Game </strong>component list. Then you can track profiles in your game.</li>
<li>When you start your game, check <strong>Gamer.SignedInGamers </strong>to check your active controller for a profile. You can choose to ask the gamer to sign in if a profile is not returned, or you can allow the gamer to play anonymously. Unfortunately, anonymous play prevents you opening a storage container for saving game progress, or looking up the player name (eg. for a high score chart) without them having to enter their name manually.</li>
<li>Use the gamer&#8217;s name. Check <strong>SignedInGamer.Gamertag </strong>and use it in your game, such as in a status bar or in high score charts.</li>
<li>The <strong>SignedInGamer </strong>class holds a variety of information about your player, including a <strong>GameDefaults </strong>property that may be useful in automatically tuning your game&#8217;s control scheme or difficulty. The <strong>GameDefaults.InvertYAxis</strong> property is of special interest to 3D games.</li>
<li>There&#8217;s even more data inside <strong>SignedInGamer.GetProfile</strong>, such as their gamer picture. You can use this at your discretion.</li>
<li>Respond to <strong>SignedInGamer.SignedOut </strong>on the active controller <strong>PlayerIndex</strong>. If the player signs out, you can decide what to do. Most games return to the main menu.</li>
</ul>
<p><strong>For Reference, See:</strong></p>
<ul>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/network_game_state_management">Network Game State Management Sample</a></li>
<li><a href="http://msdn.microsoft.com/library/bb975583.aspx">Gamer Services Overview</a></li>
<li><a href="http://msdn.microsoft.com/library/microsoft.xna.framework.gamerservices.aspx">Microsoft.Xna.Framework.GamerServices Reference</a></li>
</ul>
<p><strong><br />
Represent Your Game</strong></p>
<p><strong><br />
</strong></p>
<p><strong>Background:</strong> After doing all the hard work to create your game, make sure you take the steps to represent your game in Xbox LIVE Marketplace. Also, you will want to know when people are playing it! Thumbnails, Box Art, Screenshots, Videos, and Rich Presence are key components to making sure your game shows well on Xbox 360.</p>
<p><strong><br />
</strong></p>
<p><strong>Actions:</strong></p>
<ul>
<li>Have a thumbnail. When you submit your game, you will be able to submit a 64&#215;64 jpg file that is your game icon.</li>
<li>When submitting your game to the Peer Review process, there are more ways to represent your game &#8211; be sure to give your very best! Four screenshots, a short video trailer, and box art. Take the time to create these assets. Your game&#8217;s assets are the means by which the Xbox LIVE Marketplace displays your game!</li>
<li>Rich Presence is a way for your game to display on Xbox LIVE while it&#8217;s being played. For each <strong>SignedInGamer </strong>playing your game, set <strong>Presence.PresenceMode</strong> and, if needed, <strong>PresenceValue</strong>, based on what a gamer is doing in your game at any particular moment. Xbox LIVE Indie Games adds your game title automatically, so everyone knows people are having fun in your game.</li>
</ul>
<p><strong><br />
Make Loading and Saving Seamless</strong></p>
<p><strong><br />
</strong></p>
<p><strong>Background:</strong> From the time the game starts to the time the gamer quits the game, there should be good interaction between players and the game &#8211; or at the very least, there should be something for gamers to look at.</p>
<p>Most games do a great deal of loading at start-up, so be sure to show something interesting during that time. When saving games, do not pause or freeze the gameplay &#8211; keep the action moving and the disk operations in the background.</p>
<p>Players might use Memory Units (MUs) and expect to save their game there. You must use the Storage APIs asynchronously to avoid locking up in the case that your users are using a Memory Unit. Be sure to test your game both with and without an MU connected.</p>
<p><strong><br />
</strong></p>
<p><strong>Actions:</strong></p>
<ul>
<li>Never start your game with a device selector screen. First, this is tacky and makes a poor first impression; second by requiring a player to hit start first you will know the active controller and can handle follow-up message boxes properly.</li>
<li>Use an animated loading screen when loading content in your game. This keeps the player from thinking the game has crashed or locked up.</li>
<li>Test that your game works when more than one memory device is present, such as having a hard drive AND a memory unit, or two memory units.</li>
<li>The first time a player&#8217;s game data must be saved or loaded, use <strong>Guide.BeginShowStorageDeviceSelector </strong>asynchronously to prevent locking up.</li>
<li>Do not ask for a storage device again after the first time &#8211; this may annoy the player.</li>
<li>If you are going to auto-save, notify the player of the auto-save, and tell them not to turn off their Xbox 360 Console while it is saving.</li>
<li>Make sure you associate saved games to a profile, but do not associate high scores to a profile. That way, everyone can see the high scores.</li>
<li>Saving and loading data in text formats can be problematic depending on the region the Xbox 360 is set to. If you convert a floating point number to a string during a save when the Xbox 360 is set to Germany, for example, you will get 1,234 when you might expect 1.234! To insure that that numeric conversions to and from strings generate the same values in all regions, be sure to store the numbers in a culturally invariant manner, or use a binary file format instead of text.</li>
</ul>
<p><strong>For Reference, See:</strong></p>
<ul>
<li><a href="http://msdn.microsoft.com/library/bb203920.aspx">How To: Get a StorageDevice Asynchronously</a></li>
<li><a href="http://msdn.microsoft.com/library/microsoft.xna.framework.gamerservices.guide.beginshowstoragedeviceselector.aspx">BeginShowStorageDeviceSelector Reference</a></li>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/network_game_state_management">Network Game State Management Sample</a> (for a multithreaded loading screen demo)</li>
</ul>
<p><strong><br />
Xbox LIVE Multiplayer: Make it Full Featured</strong></p>
<p><strong><br />
</strong></p>
<p><strong>Background:</strong> Multiplayer is a valuable feature to have in your game. It increases replay value and connects gamers all over the world. However, it can be frustrating for customers if the experience is not optimized and made user-friendly. If you are building multiplayer into your game, be sure to go the extra mile and provide the features that make Xbox LIVE gameplay great.</p>
<p><strong><br />
</strong></p>
<p><strong>Actions:</strong></p>
<ul>
<li>Take full advantage of the Xbox LIVE Party system to get likeminded players together in your game. Use the <strong>SignedInGamer.PartySize</strong> to determine if you should inform the player that with a simple button press they can open up the Party UI and quickly send out game invites! A size of zero means you aren’t in a party, one means you are all alone, and anything greater means you are ready to invite some friends. A simple call to <strong>Guide.ShowParty()</strong> will open the guide directly to the Party screen to streamline the invites to your fellow party members.</li>
<li>Support invites, it improves game visibility and ease of joining others for gameplay. To do so, respond to the <strong>NetworkSession.InviteAccepted </strong>event, quitting any session that the player is in, and joining the new session by calling<strong>NetworkSession.JoinInvited</strong>. Players can then send each other invites &#8211; the invited player will be given the option to purchase the game if necessary &#8211; and can join each other&#8217;s games in progress.</li>
<li>Have a Quick Match feature &#8211; don&#8217;t make your player hunt for games. Run the matching process in the background and join up with the best session available. Make quick match the default, to improve the odds of gamers finding other players via the Xbox LIVE service.</li>
<li>Have a Custom Match feature with a few parameters such as level and rule sets. Limit the number of sessions returned to make it easy for the player to pick.</li>
<li>If you have a pre-game lobby, ensure that you are displaying the match settings so that players entering the lobby know what they are getting into.</li>
<li>Optimize, optimize, optimize! The XNA Framework can simulate latency and packet loss &#8211; you should make sure to turn on both when testing. You should target 8Kb of bandwidth for your network game has this will cover 90% of Xbox 360s. You should also make sure your game can continue playing well with 500 ms of latency. For more details, see the link to Shawn’s talk below!</li>
<li>Hosting and/or joining a Multiplayer Game through Xbox LIVE is not available on Xbox LIVE Silver and some Xbox LIVE child accounts, even when the game is purchased. You can determine if a particular Gamer is allowed to participate in an Xbox LIVE session by checking that the <strong>SignedInGamer </strong>class’s <strong>Privileges.AllowOnlineSessions</strong> flag is set to true. For example:</li>
</ul>
<p>if (Gamer.SignedInGamers[activeController].Privileges.AllowOnlineSessions) &#8230;</p>
<ul>
<li>Be sure to use the rich presence to let other gamers know that your game is being played. You can also specify where a particular player is in the game using the rich presence strings. Rich presence will also require the <strong>SignedInGamer</strong>’s <strong>PlayerIndex</strong> which is another reason why you need to poll for it at startup and save it during game play. For example:</li>
</ul>
<p>Gamer.SignedInGamers[activeController].Presence.PresenceMode = GamerPresenceMode.AtMenu;</p>
<p><strong><br />
</strong></p>
<p><strong>For Reference, See:</strong></p>
<ul>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/network_p2p">Network Architecture: Peer to Peer</a></li>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/network_cs">Network Architecture: Client/Server</a></li>
<li><a href="http://xbox.create.msdn.com/education/catalog/utility/lobby_chat_icons">Network Lobby and Chat Icons</a></li>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/network_prediction">Network Prediction</a></li>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/network_game_state_management">Network Game State Management</a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=07BC861A-BB03-4D25-B93E-FAFB390B75FB">Shawn Hargreaves&#8217; Gamefest 2008: Network Game Optimization</a></li>
<li><a href="http://xbox.create.msdn.com/education/catalog/sample/invites">Network Player Invites</a></li>
</ul>
<p><strong><br />
Gamers May Have Special Controllers</strong></p>
<p><strong><br />
</strong></p>
<p><strong>Background:</strong> Many different types of controllers are supported by the XNA Framework. These controllers, which range from flight sticks to dance pads, all return values inside the <strong>GamePadState </strong>class. Gamers who have these controllers expect them to work in the types of games for which they are traditionally used.</p>
<p>Regardless of the special types used in your game, you should always support the default Xbox 360 Gamepad, and never require special controllers to be able to play.</p>
<p><strong><br />
</strong></p>
<p><strong>Actions:</strong></p>
<ul>
<li>Determine what kind of controllers your game would best be suited for: racing games should support the wheel, flying games should support flight sticks, and so on.</li>
<li>When the player starts the game and you know which controller they are using, call <strong>GamePad.GetCapabilities </strong>and check the <strong>GamePadCapabilities.GamePadType </strong>returned value to understand what type of controller the player is using.</li>
<li>Respond to a special controller type by changing your control scheme to best fit that type. The trigger on an Xbox 360 Controller may not be best suited to a flight stick, for instance. Use the Input Reporter (linked below) to test special controller types to understand their inputs.</li>
</ul>
<p><strong>For Reference, See:</strong></p>
<ul>
<li><a href="http://xbox.create.msdn.com/education/catalog/utility/input_reporter">Input Reporter Utility</a></li>
</ul>
<p><strong><br />
Avatars</strong></p>
<p><strong><br />
</strong></p>
<p><strong>Background:</strong>Starting with XNA Game Studio 3.1, developers have the opportunity to use Avatars when making their Xbox LIVE Indie Game.</p>
<p><strong><br />
</strong></p>
<p><strong>Actions:</strong></p>
<ul>
<li>Users may not have an Avatar so your game should handle this situation. After retrieving the <strong>AvatarDescription</strong> via the Avatar property on the <strong>SignedInGame</strong>r the developer should check the IsValid property. If the description is not valid then the player doesn’t have a valid avatar. The developer can replace the users avatar with a random avatar using the <strong>AvatarDesctipion.CreateRandom</strong> method or load a pre created<strong> AvatarDescription</strong>.</li>
<li>If avatars are used in your networked game users should be able to see the real avatars of the other player. When creating a networked game that uses avatars the developer should send each players <strong>AvatarDescription</strong> across the network so that each player can display all of the other players avatars. A player should see a players real avatar and not a random avatar.</li>
<li>Games should be tested with different size avatars. A players avatar can be a number of different heights and sizes. A game should consider this when developing the game. Collisions may look incorrect with some size avatars.</li>
<li>Games should not expect a player to have an avatar with a specific gender. If the game contains gender specific text such as “she”, he”, “her”, or “him” the game should determine if the players gender if female or male using the <strong>AvatarDescription.BodyType</strong>property.</li>
<li>Keep in mind the rules regarding Avatar Use at all times.</li>
</ul>
<p><strong>For Reference, See:</strong></p>
<ul>
<li><a href="http://xbox.create.msdn.com/education/catalog/article/avatar_use">Avatar Use</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://machxgames.com/blog/?feed=rss2&#038;p=119</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Speech Bubble Sample</title>
		<link>http://machxgames.com/blog/?p=118</link>
		<comments>http://machxgames.com/blog/?p=118#comments</comments>
		<pubDate>Tue, 28 Feb 2012 22:18:18 +0000</pubDate>
		<dc:creator>Mach X Games</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[conversation]]></category>
		<category><![CDATA[npc]]></category>
		<category><![CDATA[RPG]]></category>
		<category><![CDATA[speech]]></category>

		<guid isPermaLink="false">http://machxgames.com/blog/?p=118</guid>
		<description><![CDATA[So I allowed myself to get sidetracked to throw together a sample to answer a question in the App Hub forums. Since I love RPG games, both playing and developing, this will probably be useful to me sometime in the future so that’s how I’m justifying it. The sample, which you can get from here, [...]]]></description>
				<content:encoded><![CDATA[<p>So I allowed myself to get sidetracked to throw together a sample to answer <a href="http://forums.create.msdn.com/forums/t/100814.aspx">a question</a> in the App Hub forums. Since I love RPG games, both playing and developing, this will probably be useful to me sometime in the future so that’s how I’m justifying it.</p>
<p>The sample, which you can get from <a href="http://machxgames.com/files/downloads/samples/SpeechBubbleSample.zip">here</a>, shows a quick semi-dynamic speech bubble with a couple of options. The class is less than 150 lines, allows however many lines of text you want, shows a graphic to let the user know if there’s more text that the character has to provide, and shows a pointer to the character that can be placed on either the left or right side of the bottom of the bubble. It uses more of my fantastic programmer art, but should work with whatever graphics you replace it with, assuming you don’t deviate from how I’ve set up the graphics. I could have used just one corner graphic and rotated for the other 3 sides, but I was lazy. <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://machxgames.com/blog/wp-content/uploads/2012/02/wlEmoticon-smile1.png" /></p>
<p>Here’s the class in all its glory:</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">enum</span> PointerType
{
    None,
    Left,
    Right
}

<span class="kwrd">public</span> <span class="kwrd">class</span> SpeechBubble
{
    <span class="kwrd">private</span> <span class="kwrd">int</span> _width;

    <span class="kwrd">private</span> Vector2 _location;

    <span class="kwrd">private</span> <span class="kwrd">string</span>[] _text;

    <span class="kwrd">private</span> SpriteFont _font;

    <span class="rem">//bubble textures</span>
    <span class="kwrd">private</span> Texture2D _bottomBorder;
    <span class="kwrd">private</span> Texture2D _interior;
    <span class="kwrd">private</span> Texture2D _leftBorder;
    <span class="kwrd">private</span> Texture2D _leftBottomCorner;
    <span class="kwrd">private</span> Texture2D _leftTopCorner;
    <span class="kwrd">private</span> Texture2D _rightBorder;
    <span class="kwrd">private</span> Texture2D _rightBottomCorner;
    <span class="kwrd">private</span> Texture2D _rightTopCorner;
    <span class="kwrd">private</span> Texture2D _topBorder;

    <span class="kwrd">private</span> <span class="kwrd">bool</span> _more;
    <span class="kwrd">private</span> Texture2D _moreGraphic;

    <span class="kwrd">private</span> PointerType _pointerType;
    <span class="kwrd">private</span> Texture2D _pointer;

    <span class="kwrd">public</span> SpeechBubble(ContentManager content, <span class="kwrd">int</span> width, Vector2 location, <span class="kwrd">string</span>[] text, <span class="kwrd">bool</span> more = <span class="kwrd">false</span>, PointerType pointerType = PointerType.None)
    {
        _font = content.Load&lt;SpriteFont&gt;(<span class="str">&quot;font&quot;</span>);

        _bottomBorder = content.Load&lt;Texture2D&gt;(<span class="str">&quot;bottomBorder&quot;</span>);
        _interior = content.Load&lt;Texture2D&gt;(<span class="str">&quot;interior&quot;</span>);
        _leftBorder = content.Load&lt;Texture2D&gt;(<span class="str">&quot;leftBorder&quot;</span>);
        _leftBottomCorner = content.Load&lt;Texture2D&gt;(<span class="str">&quot;leftBottomCorner&quot;</span>);
        _leftTopCorner = content.Load&lt;Texture2D&gt;(<span class="str">&quot;leftTopCorner&quot;</span>);
        _rightBorder = content.Load&lt;Texture2D&gt;(<span class="str">&quot;rightBorder&quot;</span>);
        _rightBottomCorner = content.Load&lt;Texture2D&gt;(<span class="str">&quot;rightBottomCorner&quot;</span>);
        _rightTopCorner = content.Load&lt;Texture2D&gt;(<span class="str">&quot;rightTopCorner&quot;</span>);
        _topBorder = content.Load&lt;Texture2D&gt;(<span class="str">&quot;topBorder&quot;</span>);

        _moreGraphic = content.Load&lt;Texture2D&gt;(<span class="str">&quot;more&quot;</span>);

        _pointer = content.Load&lt;Texture2D&gt;(<span class="str">&quot;pointer&quot;</span>);

        _location = location;
        _width = width;

        _text = text;

        _more = more;

        _pointerType = pointerType;
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> Draw(SpriteBatch sb)
    {
        <span class="rem">//top</span>
        sb.Draw(_leftTopCorner, _location, Color.White);
        sb.Draw(_topBorder, <span class="kwrd">new</span> Rectangle((<span class="kwrd">int</span>)_location.X + _leftTopCorner.Width, (<span class="kwrd">int</span>)_location.Y, _width - _leftTopCorner.Width * 2, _leftTopCorner.Height), Color.White);
        sb.Draw(_rightTopCorner, _location + <span class="kwrd">new</span> Vector2(_width - _rightTopCorner.Width, 0), Color.White);

        <span class="rem">//lines</span>
        <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; _text.Length + (_more ? 1 : 0); i++)
        {
            sb.Draw(_leftBorder, <span class="kwrd">new</span> Vector2(_location.X, _location.Y + _leftTopCorner.Height + (i * _leftBorder.Height)), Color.White);
            sb.Draw(_interior, <span class="kwrd">new</span> Rectangle((<span class="kwrd">int</span>)_location.X + _leftBorder.Width,
                                    (<span class="kwrd">int</span>)_location.Y + _leftTopCorner.Height + (i * _leftBorder.Height),
                                    _width - _leftBorder.Width * 2,
                                    _leftBorder.Height),
                    Color.White);
            sb.Draw(_rightBorder, <span class="kwrd">new</span> Vector2(_location.X + _width - _rightBorder.Width, _location.Y + _leftTopCorner.Height + (i * _leftBorder.Height)), Color.White);

            <span class="rem">//leave space for more graphic if necessary</span>
            <span class="kwrd">if</span> (i &lt; _text.Length)
                sb.DrawString(_font, _text[i], <span class="kwrd">new</span> Vector2((<span class="kwrd">int</span>)_location.X + _leftBorder.Width, (<span class="kwrd">int</span>)_location.Y + _leftTopCorner.Height + (i * _leftBorder.Height)), Color.Black);
        }


        <span class="rem">//bottom</span>
        sb.Draw(_leftBottomCorner, _location + <span class="kwrd">new</span> Vector2(0, _leftTopCorner.Height + (_text.Length + (_more ? 1 : 0)) * _leftBorder.Height), Color.White);

        <span class="kwrd">switch</span>(_pointerType)
        {
            <span class="kwrd">case</span> PointerType.Left:
            {
                sb.Draw(_pointer, _location + <span class="kwrd">new</span> Vector2(_leftBottomCorner.Width, _leftTopCorner.Height + (_text.Length + (_more ? 1 : 0)) * _leftBorder.Height), Color.White);

                sb.Draw(_bottomBorder, <span class="kwrd">new</span> Rectangle((<span class="kwrd">int</span>)_location.X + _leftBorder.Width + _pointer.Width, 
                                                        (<span class="kwrd">int</span>)_location.Y + _leftTopCorner.Height + (_text.Length + (_more ? 1 : 0)) * _leftBorder.Height, 
                                                        _width - _leftBorder.Width - _pointer.Width - _rightBorder.Width, 
                                                        _bottomBorder.Height), 
                                        Color.White);

                <span class="kwrd">break</span>;
            }
            <span class="kwrd">case</span> PointerType.Right:
            {
                sb.Draw(_bottomBorder, <span class="kwrd">new</span> Rectangle((<span class="kwrd">int</span>)_location.X + _leftBorder.Width,
                                                    (<span class="kwrd">int</span>)_location.Y + _leftTopCorner.Height + (_text.Length + (_more ? 1 : 0)) * _leftBorder.Height, 
                                                    _width - _leftBorder.Width - _pointer.Width - _rightBorder.Width, 
                                                    _bottomBorder.Height), 
                                        Color.White);

                sb.Draw(_pointer, _location + <span class="kwrd">new</span> Vector2(_width - _pointer.Width - _rightBorder.Width, _leftTopCorner.Height + (_text.Length + (_more ? 1 : 0)) * _leftBorder.Height), Color.White);

                <span class="kwrd">break</span>;
            }
            <span class="kwrd">case</span> PointerType.None:
            {
                sb.Draw(_bottomBorder, <span class="kwrd">new</span> Rectangle((<span class="kwrd">int</span>)_location.X + _leftBorder.Width,
                                                    (<span class="kwrd">int</span>)_location.Y + _leftTopCorner.Height + (_text.Length + (_more ? 1 : 0)) * _leftBorder.Height,
                                                    _width - _leftBorder.Width - _rightBorder.Width, 
                                                    _bottomBorder.Height), 
                                        Color.White);

                <span class="kwrd">break</span>;
            }
        }

        sb.Draw(_rightBottomCorner, _location +  <span class="kwrd">new</span> Vector2(_width - _rightBottomCorner.Width, _leftTopCorner.Height + (_text.Length + (_more ? 1 : 0)) * _leftBorder.Height), Color.White);

        <span class="kwrd">if</span> (_more)
            sb.Draw(_moreGraphic, <span class="kwrd">new</span> Vector2(_location.X + _width - _rightBorder.Width - _moreGraphic.Width, _location.Y + _leftTopCorner.Height + (_text.Length * _leftBorder.Height)), Color.White);
    }
}</pre>
<p>&#160;</p>
<p>Creating an instance is fairly straightforward:</p>
<pre class="csharpcode">SpeechBubble _bubble1;
SpeechBubble _bubble2;
SpeechBubble _bubble3;

<span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> LoadContent()
{
      ...

      _bubble1 = <span class="kwrd">new</span> SpeechBubble(Content, 150, <span class="kwrd">new</span> Vector2(50, 50), <span class="kwrd">new</span> <span class="kwrd">string</span>[] { <span class="str">&quot;This is a test&quot;</span>, <span class="str">&quot;This is only a test&quot;</span>, <span class="str">&quot;More text follows...&quot;</span> }, <span class="kwrd">true</span>);
      _bubble2 = <span class="kwrd">new</span> SpeechBubble(Content, 150, <span class="kwrd">new</span> Vector2(250, 250), <span class="kwrd">new</span> <span class="kwrd">string</span>[] { <span class="str">&quot;This is a test&quot;</span>, <span class="str">&quot;This is only a test&quot;</span>, <span class="str">&quot;Nothing here&quot;</span> },<span class="kwrd">false</span>, PointerType.Left);
      _bubble3 = <span class="kwrd">new</span> SpeechBubble(Content, 150, <span class="kwrd">new</span> Vector2(150, 450), <span class="kwrd">new</span> <span class="kwrd">string</span>[] { <span class="str">&quot;Another test&quot;</span>, <span class="str">&quot;Still testing&quot;</span>, <span class="str">&quot;More follows...&quot;</span> }, <span class="kwrd">true</span>, PointerType.Right);
}</pre>
<p>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</p>
<p>Simply call the Draw method of the class in your own draw code:</p>
<pre class="csharpcode"><span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    spriteBatch.Begin();
    _bubble1.Draw(spriteBatch);
    _bubble2.Draw(spriteBatch);
    _bubble3.Draw(spriteBatch);
    spriteBatch.End();

    <span class="kwrd">base</span>.Draw(gameTime);
}</pre>
<p>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</p>
<p>Feel free to let me know if I missed something that would be useful in the class.</p>
]]></content:encoded>
			<wfw:commentRss>http://machxgames.com/blog/?feed=rss2&#038;p=118</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
	</channel>
</rss>
