<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Wellhustled</title>
	
	<link>http://www.goodhustle.com/blog</link>
	<description>The Goodhustle Studios Blog</description>
	<lastBuildDate>Mon, 16 Aug 2010 18:00:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ThinkingAboutGames" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="thinkingaboutgames" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">ThinkingAboutGames</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Beast Boxing has a story!?!</title>
		<link>http://www.goodhustle.com/blog/2010/08/beast-boxing-has-a-story/</link>
		<comments>http://www.goodhustle.com/blog/2010/08/beast-boxing-has-a-story/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 18:00:30 +0000</pubDate>
		<dc:creator>Gordon</dc:creator>
				<category><![CDATA[Beast Boxing]]></category>
		<category><![CDATA[Dev Diary]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Shared on Facebook]]></category>

		<guid isPermaLink="false">http://www.goodhustle.com/blog/?p=89</guid>
		<description><![CDATA[Yep, it&#8217;s true! Even though Beast Boxing 3D is chock-full of arcade-reminiscent touch action, we&#8217;ve got a story mode in the game that lets you play through three daunting boxing leagues of opponents! You start out as a poor boxer from the slums who spent their last coins to enter the Amateur Leagues, so you&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>Yep, it&#8217;s true! Even though Beast Boxing 3D is chock-full of arcade-reminiscent touch action, we&#8217;ve got a story mode in the game that lets you play through three daunting boxing leagues of opponents! You start out as a poor boxer from the slums who spent their last coins to enter the Amateur Leagues, so you&#8217;ve got nothing to lose as you try to make your way to champion status. </p>
<p>It&#8217;s still a work in progress, but you can take a look at an example dialogue screen of the character Treimann talking some trash:</p>
<p><a href="http://www.goodhustle.com/blog/wp-content/uploads/2010/08/screenshot_treimann_dialogu.jpg"><img src="http://www.goodhustle.com/blog/wp-content/uploads/2010/08/screenshot_treimann_dialogu.jpg" alt="Treimann&#039;s Trash Talk" title="Treimann&#039;s Trash Talk" width="480" height="320" class="alignnone size-full wp-image-90" /></a></p>
<p>So yeah, you&#8217;re gonna get trash talked by a tree. </p>
<blockquote><p>In the Kingdom of Beasthalla, the strongest monsters fight in grand boxing leagues to prove their strength. This is called&#8230;.</p>
<p>BEAST BOXING!</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.goodhustle.com/blog/2010/08/beast-boxing-has-a-story/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kamander! The Champ of the Pro Leagues</title>
		<link>http://www.goodhustle.com/blog/2010/08/kamander-the-champ-of-the-pro-leagues/</link>
		<comments>http://www.goodhustle.com/blog/2010/08/kamander-the-champ-of-the-pro-leagues/#comments</comments>
		<pubDate>Sat, 14 Aug 2010 03:29:17 +0000</pubDate>
		<dc:creator>Gordon</dc:creator>
				<category><![CDATA[Beast Boxing]]></category>
		<category><![CDATA[Dev Diary]]></category>
		<category><![CDATA[Shared on Facebook]]></category>

		<guid isPermaLink="false">http://www.goodhustle.com/blog/?p=75</guid>
		<description><![CDATA[The character designs we&#8217;re working on are probably the best part of Beast Boxing! This is Kamander, a cyclops snake with a bad attitude and a strong Internet fan base in the fantasy land of Beasthalla. Here&#8217;s a quick quote from my story document to feast on: Kamander rose through the ranks of beast boxers, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.goodhustle.com/blog/wp-content/uploads/2010/08/KamanderProfile.jpg"><img class="size-full wp-image-76 alignleft" title="Kamander Profile" src="http://www.goodhustle.com/blog/wp-content/uploads/2010/08/KamanderProfile.jpg" alt="Kamander, Pro Champ" width="150" height="161" /></a>The character designs we&#8217;re working on are probably the best part of Beast Boxing! This is Kamander, a cyclops snake with a bad attitude and a strong Internet fan base in the fantasy land of Beasthalla. Here&#8217;s a quick quote from my story document to feast on:</p>
<blockquote><p>Kamander rose through the ranks of beast boxers, defeating all comers in the Pro  League even though suffers from no depth perception. His strong defense and  devastating hook combos have very few weaknesses, and his fan club is  rabid and devoted.</p></blockquote>
<p>Kamander was a really fun character to set up. He&#8217;s the second time in the game you encounter a snake-style character, and he&#8217;s set up to be very quick and powerful, requiring a good base of upgrades to take him on successfully. Since the last time I intro&#8217;ed a character, some people wanted to see more gameplay, I&#8217;m happy to show off this new video highlighting a full, if lopsided, round fighting Kamander.</p>
<div class="gameplayvideo">
    <object width="393" height="320"><param name="movie" value="http://www.youtube.com/v/5zygSRZoaUc?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/5zygSRZoaUc?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="393" height="320"></embed></object>
    </div>
<p>This promo shows off some of the polish we&#8217;ve been adding into the game over the last month and a half since the last video. The most fun addition was definitely adding in a powerup that activates when you land 5 consecutive hits &#8211; you&#8217;re on fire! We&#8217;ve been psyched about the new NBA Jam trailers coming out and it reminded us that our game feels a lot like the NBA Jam of iPhone boxing games! </p>
<p>We certainly know and admire about all the ultra-realistic, simulation-oriented fighting games that have come out, but we&#8217;re more interested in providing a quick-paced, super fun and awesome-looking fighting game instead. Hope you enjoy the video, and sign up for our mailing list on <a href="http://www.beastboxing.com" onclick="pageTracker._trackPageview('/outgoing/www.beastboxing.com?referer=');">http://www.beastboxing.com</a> to get notified when it&#8217;s ready!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goodhustle.com/blog/2010/08/kamander-the-champ-of-the-pro-leagues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beast Boxing 3D, Coming Soon!</title>
		<link>http://www.goodhustle.com/blog/2010/06/beast-boxing-3d-coming-soon/</link>
		<comments>http://www.goodhustle.com/blog/2010/06/beast-boxing-3d-coming-soon/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 00:19:00 +0000</pubDate>
		<dc:creator>Gordon</dc:creator>
				<category><![CDATA[Beast Boxing]]></category>
		<category><![CDATA[Dev Diary]]></category>
		<category><![CDATA[Shared on Facebook]]></category>

		<guid isPermaLink="false">http://www.goodhustle.com/blog/?p=69</guid>
		<description><![CDATA[Announcing the new promo site at http://www.beastboxing.com with a few goodies! We&#8217;re in production mode on the prototype formerly known as Monster Boxing, and it&#8217;s shaping up to be a really fun game! As we get through more and more polish, we&#8217;ll be posting all sorts of stuff to the new promo site, and talking [...]]]></description>
			<content:encoded><![CDATA[<p>Announcing the new promo site at <a href="http://www.beastboxing.com" onclick="pageTracker._trackPageview('/outgoing/www.beastboxing.com?referer=');">http://www.beastboxing.com</a> with a few goodies!</p>
<p>We&#8217;re in production mode on the prototype formerly known as Monster Boxing, and it&#8217;s shaping up to be a really fun game! As we get through more and more polish, we&#8217;ll be posting all sorts of stuff to the new promo site, and talking about our development process.</p>
<p>The first character up for this treatment is Piglas Porkopoulous. In Beast Boxing, he&#8217;s your first opponent and also doubles as your training coach once you beat him. If you visit the <a href="http://www.beastboxing.com" onclick="pageTracker._trackPageview('/outgoing/www.beastboxing.com?referer=');">promo site</a>, you can check out a short gameplay teaser with him, sign up for updates about the game, and see a couple new screenshots of the game in its work in progress state. </p>
<p>As you can see in the video, the game offers easy to learn and straightforward boxing controls with quick jabs, heavy hooks and uppercuts, as well as dodging left and right across the stage and blocking, all implemented with the iPhone&#8217;s multitouch and accelerometer controls. We&#8217;re seeing solid 30+ fps on the iPhone 3GS right now, and expect it to get better as we get closer to launch and do more optimization work. There&#8217;s also a unique mechanic of picking up coins that the crowd throws at you when you&#8217;re fighting with gusto. Pick as many of them up as you can, and spend them later on training and special powers! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.goodhustle.com/blog/2010/06/beast-boxing-3d-coming-soon/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>One way to fetch a random row from a CoreData entity</title>
		<link>http://www.goodhustle.com/blog/2010/04/one-way-to-fetch-a-random-row-from-a-coredata-entity/</link>
		<comments>http://www.goodhustle.com/blog/2010/04/one-way-to-fetch-a-random-row-from-a-coredata-entity/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 02:15:00 +0000</pubDate>
		<dc:creator>Gordon</dc:creator>
				<category><![CDATA[Dev Diary]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[coredata]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://www.goodhustle.com/blog/?p=62</guid>
		<description><![CDATA[I spent a little time looking around for a way to get a random row out of a CoreData entity, and I didn&#8217;t find too much, so I&#8217;ll post about it here. In my entity (let&#8217;s call it &#8220;Items&#8221;), there are 198 objects stored. I have a non-alphabetical Decimal &#8220;siteOrder&#8221; attribute that helps me sort [...]]]></description>
			<content:encoded><![CDATA[<p>I spent a little time looking around for a way to get a random row out of a CoreData entity, and I didn&#8217;t find too much, so I&#8217;ll post about it here. In my entity (let&#8217;s call it &#8220;Items&#8221;), there are 198 objects stored. I have a non-alphabetical Decimal &#8220;siteOrder&#8221; attribute that helps me sort by a canonical order dependent on its original source. Because I have this decimal attribute already, I can take advantage of it by using arc4random() (don&#8217;t forget to</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#import stdlib.h</div></td></tr></tbody></table></div>
<p>for it) to just pick out an appropriate random index, and then set that in an NSPredicate like this:</p>
<div class="codecolorer-container objc default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/?referer=');"><span style="color: #400080;">NSFetchRequest</span></a> <span style="color: #002200;">*</span>request <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/?referer=');"><span style="color: #400080;">NSFetchRequest</span></a> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSEntityDescription_Class/" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSEntityDescription_Class/?referer=');"><span style="color: #400080;">NSEntityDescription</span></a> <span style="color: #002200;">*</span>entity <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSEntityDescription_Class/" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSEntityDescription_Class/?referer=');"><span style="color: #400080;">NSEntityDescription</span></a> entityForName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Item&quot;</span> inManagedObjectContext<span style="color: #002200;">:</span>managedObjectContext<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>request setEntity<span style="color: #002200;">:</span>entity<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// Assumes that you know the number of objects per entity, and that your order starts at zero.</span><br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/?referer=');"><span style="color: #400080;">NSPredicate</span></a> <span style="color: #002200;">*</span>predicate <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/?referer=');"><span style="color: #400080;">NSPredicate</span></a> predicateWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;siteOrder = %d&quot;</span>, arc4random<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">%</span> kNumItems<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>request setPredicate<span style="color: #002200;">:</span>predicate<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>request setFetchLimit<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/?referer=');"><span style="color: #400080;">NSError</span></a> <span style="color: #002200;">*</span>error <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;<br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/?referer=');"><span style="color: #400080;">NSArray</span></a> <span style="color: #002200;">*</span>results <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>managedObjectContext executeFetchRequest<span style="color: #002200;">:</span>request error<span style="color: #002200;">:&amp;</span>error<span style="color: #002200;">&#93;</span>;</div></td></tr></tbody></table></div>
<p>Easy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goodhustle.com/blog/2010/04/one-way-to-fetch-a-random-row-from-a-coredata-entity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UIScrollView and Memory Allocations</title>
		<link>http://www.goodhustle.com/blog/2010/04/uiscrollview-and-memory-allocations/</link>
		<comments>http://www.goodhustle.com/blog/2010/04/uiscrollview-and-memory-allocations/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 08:41:32 +0000</pubDate>
		<dc:creator>Gordon</dc:creator>
				<category><![CDATA[Dev Diary]]></category>

		<guid isPermaLink="false">http://www.goodhustle.com/blog/?p=44</guid>
		<description><![CDATA[I ran into a curious problem while using nib-based UIView hierarchies as part of a horizontally scrolling UIScrollView. I followed the Apple PageControl example of progressively loading the next and last page&#8217;s viewcontrollers and adding them as subviews, and I also took the step of progressively unloading the viewcontrollers (see below) outside those bounds. Still, [...]]]></description>
			<content:encoded><![CDATA[<p>I ran into a curious problem while using nib-based UIView hierarchies as part of a horizontally scrolling UIScrollView. I followed the Apple <a href="http://developer.apple.com/iphone/library/samplecode/PageControl/Introduction/Intro.html" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/iphone/library/samplecode/PageControl/Introduction/Intro.html?referer=');">PageControl</a> example of progressively loading the next and last page&#8217;s viewcontrollers and adding them as subviews, and I also took the step of progressively <b>un</b>loading the viewcontrollers (see below) outside those bounds. Still, every time I was paging back and forth, my real memory allocations would increase by a few MB for every page! </p>
<p>This became a problem pretty quickly, as you can imagine. I ended up finding a solution when I saw <a href="http://discussions.apple.com/thread.jspa?threadID=1743970" onclick="pageTracker._trackPageview('/outgoing/discussions.apple.com/thread.jspa?threadID=1743970&amp;referer=');">this post about the reverse issue</a>. </p>
<p>It turns out that if you assign a viewcontroller&#8217;s view as a subview of a UIScrollView, you must both send a removeFromSuperview message to the subview, <b>and also</b> replace the viewcontroller&#8217;s spot in the NSArray container in order to get it released.</p>
<div class="codecolorer-container objc default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>unloadPage<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>page <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>page &lt; <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #a61390;">return</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>page &gt;<span style="color: #002200;">=</span> kNumItems<span style="color: #002200;">&#41;</span> <span style="color: #a61390;">return</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNull_Class/" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNull_Class/?referer=');"><span style="color: #400080;">NSNull</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>viewControllers objectAtIndex<span style="color: #002200;">:</span>page<span style="color: #002200;">&#93;</span> <span style="color: #002200;">!=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNull_Class/" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNull_Class/?referer=');"><span style="color: #400080;">NSNull</span></a> null<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; ItemViewController <span style="color: #002200;">*</span>controllerToDelete <span style="color: #002200;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>viewControllers objectAtIndex<span style="color: #002200;">:</span>page<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #11740a; font-style: italic;">// Release the view from the scrollview view&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>controllerToDelete.view removeFromSuperview<span style="color: #002200;">&#93;</span>; <br />
<span style="color: #11740a; font-style: italic;">// release the viewcontroller from the collection</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>viewControllers replaceObjectAtIndex<span style="color: #002200;">:</span>page <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; withObject<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNull_Class/" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNull_Class/?referer=');"><span style="color: #400080;">NSNull</span></a> null<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>This ended up making my memory allocations steady, but it didn&#8217;t totally get rid of the hitching that was present. I believe that because my UIViews held in the UIScrollView load images from the Documents folder, I/O was getting triggered every time a pagination boundary was crossed, which in the PageControl example is unfortunately right in the middle of the transition. However, a smarter way to do the loading is to make most loads occur within the scrollViewDidEndDecelerating: event handler, like so:</p>
<div class="codecolorer-container objc default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> loadSurroundingPagesForPage<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>page <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self unloadPage<span style="color: #002200;">:</span>page <span style="color: #002200;">+</span> kSurroundingPagesToLoad <span style="color: #002200;">+</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self unloadPage<span style="color: #002200;">:</span>page <span style="color: #002200;">-</span> kSurroundingPagesToLoad <span style="color: #002200;">-</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> i<span style="color: #002200;">=</span><span style="color: #2400d9;">1</span>; i &lt; kSurroundingPagesToLoad; i<span style="color: #002200;">++</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self loadPage<span style="color: #002200;">:</span>page <span style="color: #002200;">+</span> i<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self loadPage<span style="color: #002200;">:</span>page <span style="color: #002200;">-</span> i<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self loadPage<span style="color: #002200;">:</span>page<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; lastPageLoaded <span style="color: #002200;">=</span> page;<br />
&nbsp; &nbsp; <br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>scrollViewDidEndDecelerating<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIScrollView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>scrollView <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; pageControlUsed <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self loadSurroundingPagesForPage<span style="color: #002200;">:</span>pageControl.currentPage<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>That way, in normal use, a user flipping slowly through the scrolled items won&#8217;t notice the hitch because the subview will be still while it happens! Unfortunately, this means that a user who is continuously scrolling might scroll completely past the loaded content, leading to a &#8220;blank&#8221; &#8211; so, if you&#8217;re willing to take a hitch, you can force a load in those conditions.</p>
<p></code></p>
<div class="codecolorer-container objc default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>scrollViewDidScroll<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIScrollView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>sender <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>pageControlUsed<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">return</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; CGFloat pageWidth <span style="color: #002200;">=</span> scrollView.frame.size.width;<br />
&nbsp; &nbsp; <span style="color: #a61390;">int</span> page <span style="color: #002200;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/floor.html" onclick="pageTracker._trackPageview('/outgoing/www.opengroup.org/onlinepubs/009695399/functions/floor.html?referer=');"><span style="color: #a61390;">floor</span></a><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>scrollView.contentOffset.x <span style="color: #002200;">-</span> pageWidth<span style="color: #002200;">/</span><span style="color: #2400d9;">2</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">/</span> pageWidth<span style="color: #002200;">&#41;</span> <span style="color: #002200;">+</span> <span style="color: #2400d9;">1</span>;<br />
&nbsp; &nbsp; pageControl.currentPage <span style="color: #002200;">=</span> page;<br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// Change of tactics - do lazy load in between pages IFF the new page requested is near our bounds</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/abs.html" onclick="pageTracker._trackPageview('/outgoing/www.opengroup.org/onlinepubs/009695399/functions/abs.html?referer=');"><span style="color: #a61390;">abs</span></a><span style="color: #002200;">&#40;</span>lastPageLoaded <span style="color: #002200;">-</span> page<span style="color: #002200;">&#41;</span> &gt;<span style="color: #002200;">=</span> kSurroundingPagesToLoad<span style="color: #002200;">-</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Reached bounds without decelerating - must do a lazy load&quot;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self loadSurroundingPagesForPage<span style="color: #002200;">:</span>pageControl.currentPage<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>This last bit takes the hitch in the middle of the page transition if we run out of our buffer zone of UIScrollView subviews. A couple possible optimizations come to mind - well, first, you could up the value of the kSurroundingPagesToLoad constant. Also, you could take account of the <b>direction</b> of the scrolling, and load more pages in the forward scroll direction than in the reverse. It would sort of be like a dual-clutch transmission at that point, only unable to cope when shifting unexpectedly or too many times in a row. </p>
<p>Anyway, this approach seems to work well for my project, and it uses the fetchedresultcontroller as well to cache and lazily load the coredata objects which populate the child views, so all of the scrollview stuff only takes up 4-5 MB of data while running. Pretty nice if you ask me!</p>
<p>I hope that helps anyone who was in the same boat as me. As always, use any of the code you find here at your own risk! Good luck! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goodhustle.com/blog/2010/04/uiscrollview-and-memory-allocations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Space Miner’s Credit Sequence</title>
		<link>http://www.goodhustle.com/blog/2010/02/space-miners-credit-sequence/</link>
		<comments>http://www.goodhustle.com/blog/2010/02/space-miners-credit-sequence/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 23:58:15 +0000</pubDate>
		<dc:creator>Gordon</dc:creator>
				<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://www.goodhustle.com/blog/2010/02/space-miners-credit-sequence/</guid>
		<description><![CDATA[&#8230; is ingenious! Instead of rolling credits, you take the pea-shooter ship out for a run, and pick up each of the developers with your tractor beam. As they get beamed aboard, you see their title too. Of course, it&#8217;s skippable, but then you wouldn&#8217;t get the achievement for saving all the devs!]]></description>
			<content:encoded><![CDATA[<p>&#8230; is ingenious! Instead of rolling credits, you take the pea-shooter ship out for a run, and pick up each of the developers with your tractor beam. As they get beamed aboard, you see their title too. Of course, it&#8217;s skippable, but then you wouldn&#8217;t get the achievement for saving all the devs!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goodhustle.com/blog/2010/02/space-miners-credit-sequence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thank You, Space Miner.</title>
		<link>http://www.goodhustle.com/blog/2010/02/thank-you-space-miner/</link>
		<comments>http://www.goodhustle.com/blog/2010/02/thank-you-space-miner/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 00:43:20 +0000</pubDate>
		<dc:creator>Gordon</dc:creator>
				<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://www.goodhustle.com/blog/?p=39</guid>
		<description><![CDATA[Boy, do I love Space Miner. If you haven&#8217;t bought it yet, you can read reviews and a blog post by their team to try to help you make up your mind on whether you should buy it. Or, instead, you could just spend two bucks on it, and download what will no doubt be [...]]]></description>
			<content:encoded><![CDATA[<p>Boy, do I love <a href="http://itunes.apple.com/us/app/space-miner-space-ore-bust/id353853276?mt=8" onclick="pageTracker._trackPageview('/outgoing/itunes.apple.com/us/app/space-miner-space-ore-bust/id353853276?mt=8&amp;referer=');">Space Miner</a>. If you haven&#8217;t bought it yet, you can read <a href="http://toucharcade.com/2010/02/06/space-miner-space-ore-bust-rpg-shooter-excellence/" onclick="pageTracker._trackPageview('/outgoing/toucharcade.com/2010/02/06/space-miner-space-ore-bust-rpg-shooter-excellence/?referer=');">reviews</a> and a <a href="http://blog.venan.com/2010/01/from-asteroids-to-space-miner.html" onclick="pageTracker._trackPageview('/outgoing/blog.venan.com/2010/01/from-asteroids-to-space-miner.html?referer=');">blog post by their team</a> to try to help you make up your mind on whether you should buy it. </p>
<p>Or, instead, you could just spend two bucks on it, and download what will no doubt be remembered as one of the best games ever for the iPhone.</p>
<p>Then you can see what I see: that this provides a blueprint for future developers to take advantage of. This isn&#8217;t just a refresh of Asteroids. It&#8217;s basically taking Asteroids and transforming it into Star Control II &#8220;Lite&#8221; before your very eyes.</p>
<p>You start the game with a clunker ship, a tiny gun, and limited engines. For all intents and purposes, this is the original Asteroids with refreshed graphics that people are used to. This is where a lot of current developers might stop &#8211; give an old game a new look, and toss it on the store. Instead, upgrades to the original concept hit you in a series of well-placed attacks on your jaded gamer shell, until it&#8217;s all been torn away and you&#8217;re forced to admit that this is way, way cooler than even your nostalgic bygone-day memories of Asteroids.</p>
<p>Yes, my friends, this is how you polish a merely fun game concept into something magnificent. The core mechanic is still there, but aided by decades of processing power improvements, the game goes from asteroid hunting with a pea shooter into something more akin to Rambo&#8217;s giant machine gun yelling sprees, except you&#8217;re fighting giant asteroids and evil robot miners with uber-powerful weapons and turrets. The way that each element is layered on as you progress further feels natural, too. There&#8217;s so much there that the leveling-up makes the game feel fresh even hours into it, a characteristic usually reserved for pure RPGs or MMOs.</p>
<p>The addition of the Uncle Jeb storyline fits perfectly, and allows them to frame the game as something with an end. There&#8217;s also a finite amount of asteroids in the universe, giving the grind an end point to which you can aspire. Since there&#8217;s a story arc, it makes the grinding easier to get through, because even though the grinding&#8217;s fun, I can&#8217;t imagine going through so much senseless destruction of asteroids without the end of the story to look forward to.</p>
<p>All that story is aided by well-rendered characters and a fantastic soundtrack. You&#8217;d be hard pressed to find an area where this game cuts corners. Perhaps it&#8217;s only possible to make a game like this because of the simplicity at the core. Although I&#8217;m sure it cost a lot more than most iPhone games to make, it does seem like this kind of approach reaps huge dividends, and I&#8217;d be surprised if we didn&#8217;t see more small studios take this approach to spice up casual games into something more.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goodhustle.com/blog/2010/02/thank-you-space-miner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Monster Boxing Preview Screenshots</title>
		<link>http://www.goodhustle.com/blog/2010/02/monster-boxing-preview-screenshots/</link>
		<comments>http://www.goodhustle.com/blog/2010/02/monster-boxing-preview-screenshots/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 22:49:42 +0000</pubDate>
		<dc:creator>Gordon</dc:creator>
				<category><![CDATA[Beast Boxing]]></category>
		<category><![CDATA[Dev Diary]]></category>
		<category><![CDATA[Shared on Facebook]]></category>

		<guid isPermaLink="false">http://www.goodhustle.com/blog/?p=32</guid>
		<description><![CDATA[These are a couple of teaser screenshots I&#8217;m posting online for our work in progress tentatively called Monster Boxing. Enjoy!]]></description>
			<content:encoded><![CDATA[<p>These are a couple of teaser screenshots I&#8217;m posting online for our work in progress tentatively called Monster Boxing. Enjoy!</p>
<p><a href="http://www.goodhustle.com/blog/wp-content/uploads/2010/02/screenshot_1.jpg"><img src="http://www.goodhustle.com/blog/wp-content/uploads/2010/02/screenshot_1.jpg" alt="" title="Monster Boxing Screenshot 1" width="300" height="200" class="alignnone size-full wp-image-34" /></a></p>
<p><a href="http://www.goodhustle.com/blog/wp-content/uploads/2010/02/screenshot_2.jpg"><img src="http://www.goodhustle.com/blog/wp-content/uploads/2010/02/screenshot_2.jpg" alt="" title="Monster Boxing Screenshot 2" width="300" height="200" class="alignnone size-full wp-image-35" /></a></p>
<p><a href="http://www.goodhustle.com/blog/wp-content/uploads/2010/02/screenshot_3.jpg"><img src="http://www.goodhustle.com/blog/wp-content/uploads/2010/02/screenshot_3.jpg" alt="" title="Monster Boxing Screenshot 3" width="300" height="200" class="alignnone size-full wp-image-36" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.goodhustle.com/blog/2010/02/monster-boxing-preview-screenshots/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>From Webdev to Gamedev, Part 3</title>
		<link>http://www.goodhustle.com/blog/2010/02/from-webdev-to-gamedev-part-3/</link>
		<comments>http://www.goodhustle.com/blog/2010/02/from-webdev-to-gamedev-part-3/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 20:13:04 +0000</pubDate>
		<dc:creator>Gordon</dc:creator>
				<category><![CDATA[Biographical]]></category>

		<guid isPermaLink="false">http://www.goodhustle.com/blog/?p=12</guid>
		<description><![CDATA[This is a continuation of my first and second posts detailing my journeys as a programmer. This final post will be about returning to the land of Gamedev, and once it&#8217;s done, I hope to write more about games that I love, and what makes me love them. In my last post, I explained how [...]]]></description>
			<content:encoded><![CDATA[<p>This is a continuation of my <a href="http://www.goodhustle.com/blog/2010/02/post-first-jumping-from-webdev-to-gamedev/">first</a> and <a href="http://www.goodhustle.com/blog/2010/02/from-webdev-to-gamedev-part-2/">second</a> posts detailing my journeys as a programmer. This final post will be about returning to the land of Gamedev, and once it&#8217;s done, I hope to write more about games that I love, and what makes me love them.</p>
<p>In my last post, I explained how I went from a junior sysadmin to a Sr. Technical Yahoo working on one of the most exciting social web projects in a matter of 5 years. It&#8217;s dizzying to think of how quickly I ended up with so much responsibility, but I learned to ride a wave when it&#8217;s there for you, and do your best to get up on your board again when you fall down.</p>
<p>At Yahoo, I had to re-humbleize myself, as they do business at a scale that is unimaginable until you&#8217;ve actually seen some of it. You can&#8217;t imagine what it&#8217;s like to prepare for gigantic mainstream audiences. Think <a href="http://astonmartinnews.com/story/601188500/dan-grover-toward-a-grand-unified-theory-of-n00bs" onclick="pageTracker._trackPageview('/outgoing/astonmartinnews.com/story/601188500/dan-grover-toward-a-grand-unified-theory-of-n00bs?referer=');">Grand Unified Theory of n00bs</a>, but having to prepare for that from the very beginning.</p>
<p>It took about a year, but I was able to get up to speed and lead the technical side of a transition from small, good ol&#8217; Upcoming.org to Upcoming.yahoo.com, ready to bring in a much wider audience and handle substantially increased traffic. We continued to be a tiny team, and making it all the way to a yahoo.com subdomain was a big accomplishment for us. </p>
<p>While attending SXSW in 2007, I got kind of bored with the insider-ish web panels where nothing substantial was being discussed, and instead I headed over to the gaming panels to see what that was about. I ended up being wowed by the content, and inspired by the conversations that were both foreign and familiar. The gaming industry was going through many of the same transformations to handle the networked expertise of the new generation, and it was fascinating to see how they were trying to incorporate participatory media into games. It inspired me to go deeper and analyze game mechanics more deeply. I ended up writing a well-received <a href="http://getluky.net/2007/03/21/understanding-avatars-part-3-samples/" onclick="pageTracker._trackPageview('/outgoing/getluky.net/2007/03/21/understanding-avatars-part-3-samples/?referer=');">three-part analysis of avatars</a> in which I tried to sort out the orthogonal components of social representations of ourselves that we use on the web and in games.</p>
<p>Because of that interest of mine, I spent part of my time creating an achievements platform for the web at the internal incubator called Brickhouse. It was intended to be an XBOX Live-style achievement system where anyone could make an achievement for anyone else, but I eventually realized that it wasn&#8217;t the right time or place to do the Bravonation experiment and nurture it for three or four years until it could grow. <a href="http://waxy.org/2007/12/exclusive_yahoo/" onclick="pageTracker._trackPageview('/outgoing/waxy.org/2007/12/exclusive_yahoo/?referer=');">Andy had a great writeup of it here.</a> Part of the concept &#8211; the platform API for achievements and recognition &#8211; seems validated by the achievement platforms operating for iPhone games such as AGON Online, but the other part still hasn&#8217;t really been accomplished yet. </p>
<p>I resigned from Yahoo! in March of 2008, two and a half years after starting there. I had come in as a social media programmer, and the trajectory I was on when I left was leading me towards the intersection of social websites and games. I was kinda burnt out, and I spent a good amount of time just playing games again, in a way I hadn&#8217;t really done since middle school. I did some consulting work for great clients, and kept myself afloat that way. Actually, because of my love for Halo 3, I ended up meeting some really interesting people, and started renting studio space from the <a href="http://flightcomics.com" onclick="pageTracker._trackPageview('/outgoing/flightcomics.com?referer=');">Flight Comics</a> folks. </p>
<p>It was here that I started developing some game prototypes, such as <a href="http://www.goodhustle.com/games/skybox/">Skybox</a> and the work-in-progress Monster Boxing title. It&#8217;s going to take some time to really transition my skills, but the availability of Javascript-like Unityscript in the <a href="http://unity3d.com" onclick="pageTracker._trackPageview('/outgoing/unity3d.com?referer=');">Unity3d</a> game engine is helping me get going quickly. Right now, Apple devices are my target of choice, and it looks like it&#8217;ll be that way for a few more years at least. It&#8217;s impossible to tell what the future holds, so it&#8217;s time to just hustle my way to building games, websites, and software that helps people out. Thanks for reading, and I hope you&#8217;ll stay tuned for blogging that will be less about myself and more about actual games. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goodhustle.com/blog/2010/02/from-webdev-to-gamedev-part-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Having a Hook – Initial Marketing Case Study for Skybox</title>
		<link>http://www.goodhustle.com/blog/2010/02/having-a-hook-initial-marketing-case-study-for-skybox/</link>
		<comments>http://www.goodhustle.com/blog/2010/02/having-a-hook-initial-marketing-case-study-for-skybox/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 01:12:14 +0000</pubDate>
		<dc:creator>Gordon</dc:creator>
				<category><![CDATA[Dev Diary]]></category>
		<category><![CDATA[Skybox]]></category>

		<guid isPermaLink="false">http://www.goodhustle.com/blog/?p=15</guid>
		<description><![CDATA[This was originally a pretty long post, but I&#8217;ve decided that editing for Twitter helps me feel more comfortable with getting to the point quickly. I lucked into doing something very right with my pitch email for my iPhone game, Skybox, and I think I should share if it helps others get good products noticed [...]]]></description>
			<content:encoded><![CDATA[<p>This was originally a pretty long post, but I&#8217;ve decided that editing for Twitter helps me feel more comfortable with getting to the point quickly.</p>
<p>I lucked into doing something very right with my pitch email for my iPhone game, Skybox, and I think I should share if it helps others get good products noticed that would otherwise be ignored. This is it:</p>
<blockquote><p>  * Inspired by Japanese game shows and Aaaaa!: A Reckless Disregard for Gravity &#8211; <a href="http://getluky.net/2010/01/22/the-design-inspiration-for-skybox/" onclick="pageTracker._trackPageview('/outgoing/getluky.net/2010/01/22/the-design-inspiration-for-skybox/?referer=');">http://getluky.net/2010/01/22/the-design-inspiration-for-skybox/</a></p></blockquote>
<p>Yup, a tiny reference to part of the inspiration for Skybox being a hilarious, strange, and popular Japanese game show clip on Youtube. It happened to catch the eye of 148apps&#8217;s chief editor <a href="http://www.148apps.com/author/chris/" onclick="pageTracker._trackPageview('/outgoing/www.148apps.com/author/chris/?referer=');">Chris Hall</a>, who had <a href="http://www.148apps.com/reviews/skybox/" onclick="pageTracker._trackPageview('/outgoing/www.148apps.com/reviews/skybox/?referer=');">this to say in his review of Skybox</a>:</p>
<blockquote><p>Here at 148apps, we get a ton of apps submitted to us for review. Unfortunately, we don’t have fifty plus reviewers, so many apps slip between the cracks. While Skybox itself doesn’t have a bright 3D world to show off or an incredible promo video to lure me in, it does have a bit of inspiration that made me pay attention.. Japan’s very own Human Tetris.
</p></blockquote>
<caption>(You can read the rest here: <a href="http://www.148apps.com/reviews/skybox/" onclick="pageTracker._trackPageview('/outgoing/www.148apps.com/reviews/skybox/?referer=');">http://www.148apps.com/reviews/skybox/</a>)</caption>
<p>If you&#8217;re an iPhone app developer with less-than-incredible graphics but good, quirky, or interesting gameplay, you absolutely should consider linking your design to something memetic on the web. In other words, since YOUR game is most likely not well known, you can opt to link it to something else that is well known! Also, if you need time to explain your interesting hook, you should do it in a blog post, and summarize it in a prominent bullet point in your email. Keep things short and sweet when you&#8217;re trying to get attention.</p>
<p>In my case, the Human Tetris video has been seen and enjoyed by a wide variety of tuned-in Internet folks. Conjuring up that memory in order to express what makes Skybox fun to play was a great way to catch the interest of a reviewer without wasting their time.</p>
<p>Of course, it goes without saying that you really have to have a good product to begin with, so please use this tip for good and not evil. Although the review dinged me for graphics, it was my favorite review of all the press mentions, because it so helpfully laid out for me exactly what was lacking. In my 1.1 update (available now!), i&#8217;ve taken a nice pretty stick to the graphics and have something more presentable. I&#8217;m going to be releasing new gameplay modes and more in future versions, but having a really detailed review was a <strong>huge</strong> help to me when trying to prioritize my limited time.</p>
<p>Thanks to Andy Baio for helping me understand what makes for an interesting hook, and to Chris Hall for a really helpful review!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goodhustle.com/blog/2010/02/having-a-hook-initial-marketing-case-study-for-skybox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
