<?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>Doolwind&#039;s Game Coding Blog &#187; Game Programming</title>
	<atom:link href="http://www.doolwind.com/blog/tag/game-programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.doolwind.com/blog</link>
	<description>Pragmatic Thoughts On Game Development</description>
	<lastBuildDate>Sun, 08 Jan 2012 08:15:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>SOLID Principles For Game Developers</title>
		<link>http://www.doolwind.com/blog/solid-principles-for-game-developers/</link>
		<comments>http://www.doolwind.com/blog/solid-principles-for-game-developers/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 22:34:36 +0000</pubDate>
		<dc:creator>Doolwind</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Game Engine]]></category>
		<category><![CDATA[Game Programming]]></category>

		<guid isPermaLink="false">http://www.doolwind.com/blog/?p=545</guid>
		<description><![CDATA[The SOLID principles are a set of 5 software development principles coined by “Uncle Bob” (Robert C. Martin).  They are a set of guidelines for Object Oriented Design (OOD), specifically for class design.  They are widely used by agile business programmers however they are generally unknown amongst game developers.  This article describes the principles and [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.doolwind.com/images/blog/solid/solidprinciples.jpg"><img class="alignright" title="SOLID Principles" src="http://www.doolwind.com/images/blog/solid/solidprinciples.jpg" alt="" width="162" height="130" /></a>The SOLID principles are a set of 5 software development principles coined by “Uncle Bob” (Robert C. Martin).  They are a set of guidelines for Object Oriented Design (OOD), specifically for class design.  They are widely used by agile business programmers however they are generally unknown amongst game developers.  This article describes the principles and frames them in common game development situations.</p>
<p><span id="more-545"></span></p>
<p><strong>Single Responsibility Principle</strong></p>
<p><em>“There should never be more than one reason for a class to change.”</em></p>
<p><a href="http://www.doolwind.com/images/blog/solid/SingleResponsibilityPrinciple.jpg"><img class="alignright" title="Single Responsibility Principle" src="http://www.doolwind.com/images/blog/solid/SingleResponsibilityPrinciple.jpg" alt="" width="270" height="216" /></a></p>
<p>The first principle is the cornerstone of the set and gives the greatest return on investment when followed correctly.  It states that each class should have only a single responsibility and therefore reason to change.  Keeping each class small and tightly focussed allows developers to know exactly where to go to find or add particular functionality to the game. </p>
<p>Why is having more than one responsibility bad?  Multiple responsibilities means there is coupling between separate pieces of code.  Changes to one responsibility reduce the ability for the class to meet the requirements of the other responsibilities.  This leads to fragile design that breaks often and in unexpected ways.  “Why did changing from rendering API break jumping in the game?”</p>
<p>The way to fix code that breaks this principle is to separate each responsibility into its own class.  The first step can be to extract an interface per responsibility.  Other classes can then rely on these interfaces rather than the class itself.  The class can then safely be split up into separate classes for each responsibility that each implements a single interface.</p>
<p><span style="text-decoration: underline;">When have you got it?</span> – The usual culprit breaking this principle is that one (or group) class that’s hundreds or thousands of lines long.  You know the one I’m talking about. Often it’s the <em>GameObject</em> or <em>Entity</em> class that everyone seems to throw code into.  This class usually has about 500 reasons to change, and therefore 500 responsibilities.  It’s usually involved in the heinous bugs that crop up constantly.</p>
<p><strong>Open Closed Principle</strong></p>
<p><em>“Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.”</em></p>
<p><a href="http://www.doolwind.com/images/blog/solid/OpenClosedPrinciple.jpg"><img class="alignright" title="Open Closed Principle" src="http://www.doolwind.com/images/blog/solid/OpenClosedPrinciple.jpg" alt="" width="270" height="216" /></a></p>
<p>The goal of this principle is for each class to change as infrequently as possible while allowing it to be used in as many situations as possible.  While these two requirements may seem at odds they actually complement each other to generate robust design.  A class is open for extension means that the behaviour of a class can be changed in new and different ways as the requirements change.  A class is closed for modification when no source code changes are required for these changes in requirements to be met.</p>
<p>This principle can easily be resolved with data driven design.  By passing the required configuration data to a class it can easily be extended reducing its need for modification.  Any variables (in the mathematical sense) should be passed to the class so that the classes definition itself (the code) does not specify the functionality of the class alone.  I find this the easiest to think about in terms of the basic OOD principle of data and operations.  The class defines the operations it can perform (its functions) and the data that it operates on.  As much of this data as possible should be passed to the class/function.  This moves the configuration of its data outside the class itself to the calling code increasing its ability to change.</p>
<p><span style="text-decoration: underline;">When have you got it?</span> – This is the file you dread checking-in because everyone seems to be working on it all the time.  No matter what system you’re working on, these files always seem to be involved.</p>
<p><strong>Liskov Substitution Principle</strong></p>
<p><em>“Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.”</em></p>
<p><a href="htp://www.doolwind.com/images/blog/solid/LiskovSubtitutionPrinciple.jpg"><img class="alignright" title="Liskov Substitution Principle" src="http://www.doolwind.com/images/blog/solid/LiskovSubtitutionPrinciple.jpg" alt="" width="270" height="216" /></a></p>
<p>Inheritance and polymorphism are powerful mechanisms for solving complex problems with simple solutions.  They are also powerful mechanisms for creating bugs and problematic code.  This principle involves making sure inheritance hierarchies are sound and not being abused by code that introduces bugs that are hard to find.  While it seems simple on the surface, this principle can be quite complex to solve correctly.</p>
<p>The first steps to solving this problem are to find instances of checking for an objects type &#8211; both its own and that of objects it’s working on.  Beyond this easy first step comes a principle known as “Design By Contract”.  Each function has a set of conditions that must be true before it is called (pre-conditions) and a set of conditions it guarantees are met after its completion (post-conditions).  These are often implied conditions kept in the mind(s) of the programmer(s) working on them.  The first step is formalising these conditions into code.  Once this step is completed the following rule can be met – “Derived classes can only weaken pre-conditions and strengthen post-conditions”.  Put another way, functions of a derived class should expect no more than their base class and promise no less.  This principle is important because of the fact a model viewed in isolation cannot be meaningfully validated.  You don’t know whether your new “Tank” class is valid until you run it in the context of its parent, siblings and other game system.</p>
<p><span style="text-decoration: underline;">When have you got it?</span> – Classes breaking this rule are really easy to find.  Look for any base class that uses run-time type information (RTTI) to interrogate its own type (or the type of an object it’s working on).  As soon as the GameEntity class is checking if it’s of type “Tank” to do some special code, you’ve broken this principle.  The class should be able to polymorphically call functions without caring about the actual type of the object.</p>
<p><strong>Interface Segregation Principle</strong></p>
<p><em>“Clients should not be forced to depend upon interfaces that they do not use.”</em></p>
<p><a href="http://www.doolwind.com/images/blog/solid/InterfaceSegregationPrinciple.jpg"><img class="alignright" title="Interface Segregation Principle" src="http://www.doolwind.com/images/blog/solid/InterfaceSegregationPrinciple.jpg" alt="" width="270" height="216" /></a></p>
<p>Interfaces should be used for communication between different objects to encourage clean, modular code. This principle takes that concept further by making sure that the interfaces we use are themselves clean and unified. The larger the interface, the more the client is relying on functionality of another object. By keeping small segregated interfaces each object will rely upon only the smallest set of functionality it actually requires. This reduces the complexity of links between objects and more importantly, lets someone reading your code know exactly what each class relies upon. Rather than one “fat” interface we break the interface up into multiple smaller groups of functionality that each serve a different client.</p>
<p>This principle links back to the single responsibility principle nicely. In this case each interface should have a single responsibility. This lets you explicitly state the functionality requirements of each object based on the interfaces it requires.</p>
<p><span style="text-decoration: underline;">When have you got it?</span> – Look at all your interfaces (abstract classes) and make sure their listing of functions are homogenous.  An easy way to tell you’ve broken this principle is when there are small groupings of functions within the interface definition.  Whitespace is the key here, the more whitespace between the groups of functions, the more disparate they are.</p>
<p><strong>Dependency Inversion Principle</strong></p>
<p><em>“High level modules should not depend upon low level modules. Both should depend upon abstractions.”</em></p>
<p><em>“Abstractions should not depend upon details. Details should depend upon abstractions.”</em></p>
<p><a href="http://www.doolwind.com/images/blog/solid/DependencyInversionPrinciple.jpg"><img class="alignright" title="Dependency Inversion Principle" src="http://www.doolwind.com/images/blog/solid/DependencyInversionPrinciple.jpg" alt="" width="270" height="216" /></a></p>
<p>This is a key point that I had not heard of at all in game development until recently. This principle is quite the opposite of how many developers are used to working. Usually, if a class depends on another class, the client will instantiate an object of that class and then act upon it. Dependency Inversion (also called Inversion of Control) turns this on its head. Instead of the client being responsible for creating the object, it is given the object it depends on. This takes the control away from the client and moves it to the owner of the client, often the game engine.</p>
<p>A good example of this is in a rendering system. Rather than instantiating a rendering object, or directly calling the classes of the rendering API, the rendering system should receive an interface to the low level rendering functionality. By relying on an interface that is given to the rendering system, the low level rendering API can be changed without making breaking changes to the client rendering system. It becomes obvious if breaking changes occur as the low level rendering API’s interface will require changing.</p>
<p><span style="text-decoration: underline;">When have you got it?</span> – When two systems are talking to each other, how do they do it?  If they are using concrete classes then look for opportunities for them to rely on interfaces instead.  The best way is for the class to take as parameter to its constructor an interface reference to the class it needs to work on.  This also makes it obvious what sub-systems are particular class is reliant on.</p>
<p><strong>Conclusion</strong></p>
<p>What are your thoughts on the SOLID principles? Do you see benefit from adopting these in the games industry as web and application development has done?</p>
<p>SOLID Motivational Posters, by <a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/02/11/solid-development-principles-in-motivational-pictures.aspx">Derick Bailey</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.doolwind.com/blog/solid-principles-for-game-developers/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Flick Buddies: Multiplayer action for iPad, iPhone/iPod Touch</title>
		<link>http://www.doolwind.com/blog/flick-buddies-multiplayer-action-for-ipad-iphoneipod-touch/</link>
		<comments>http://www.doolwind.com/blog/flick-buddies-multiplayer-action-for-ipad-iphoneipod-touch/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 05:04:29 +0000</pubDate>
		<dc:creator>Doolwind</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Flick Buddies]]></category>
		<category><![CDATA[Game Engine]]></category>
		<category><![CDATA[Game Programming]]></category>

		<guid isPermaLink="false">http://www.doolwind.com/blog/?p=522</guid>
		<description><![CDATA[For the past three months I&#8217;ve been secretly working on a new project, Flick Buddies. Along with Shauno from Squid Tank we&#8217;ve been busily putting together a multiplayer action game for iPad, iPhone and iPod Touch. The game is built around a simple premise of flicking little characters from your corner into the goal. With [...]]]></description>
			<content:encoded><![CDATA[<p>For the past three months I&#8217;ve been secretly working on a new project, <a href="http://www.flickbuddies.com">Flick Buddies</a>.  Along with Shauno from <a href="http://www.squidtank.com">Squid Tank</a> we&#8217;ve been busily putting together a multiplayer action game for iPad, iPhone and iPod Touch.  The game is built around a simple premise of flicking little characters from your corner into the goal.  With lots of obstacles to dodge and special abilities to help you score while stopping your opponents from scoring.  Flick Buddies supports up to 4 players on a single iPad or iPhone/iPod Touch.</p>
<p><span id="more-522"></span></p>
<p>The game will be available on the app store on the 15th December and we&#8217;ll have more info in the coming days on <a href="http://www.facebook.com/flickbuddies">Facebook</a> and <a href="http://www.twitter.com/flickbuddies">Twitter</a> and our <a href="http://www.flickbuddies.com">site</a>.</p>
<p>Check out our first trailer below and watch this space for updates on the game and behind the scene&#8217;s look into how we created it.</p>
<p style="text-align: center;"><a href="http://www.doolwind.com/images/blog/flickbuddies.jpg"><img class="aligncenter" title="Flick Buddies" src="http://www.doolwind.com/images/blog/flickbuddies.jpg" alt="" width="603" height="137" /></a></p>
<p style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="620" height="378" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://www.youtube.com/v/iP-xvy8prkY&amp;hl=en_US&amp;feature=player_embedded&amp;version=3" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="620" height="378" src="http://www.youtube.com/v/iP-xvy8prkY&amp;hl=en_US&amp;feature=player_embedded&amp;version=3" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.doolwind.com/blog/flick-buddies-multiplayer-action-for-ipad-iphoneipod-touch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fanatical Pragmatism in Software Development</title>
		<link>http://www.doolwind.com/blog/fanatical-pragmatism-in-software-development/</link>
		<comments>http://www.doolwind.com/blog/fanatical-pragmatism-in-software-development/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 21:17:18 +0000</pubDate>
		<dc:creator>Doolwind</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Fanatical Pragmatism]]></category>
		<category><![CDATA[Game Programming]]></category>
		<category><![CDATA[Pragmatic]]></category>

		<guid isPermaLink="false">http://www.doolwind.com/blog/?p=496</guid>
		<description><![CDATA[I’ve caught the pragmatism bug.  Everything I do now is the most pragmatic way I can possibly complete the task.  This all started when my time started costing me money; when I started working for myself.  I like to think of it as “The product justifies the means”.  Today I’m going to briefly describe what [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.doolwind.com/images/blog/pragmatic.jpg"><img class="alignright" title="Fanatical Pragmatism" src="http://www.doolwind.com/images/blog/pragmatic.jpg" alt="" width="173" height="130" /></a>I’ve caught the pragmatism bug.  Everything I do now is the most <a href="http://www.doolwind.com/blog/pragmatic-game-development/">pragmatic</a> way I can possibly complete the task.  This all started when my time started costing me money; when I started working for myself.  I like to think of it as “The product justifies the means”.  Today I’m going to briefly describe what I mean by fanatical pragmatism with some concrete rules I’ve been following recently.</p>
<p><span id="more-496"></span></p>
<p><strong>What fanatical pragmatism is</strong></p>
<p>Fanatical pragmatism involves pursuing the optimal product as cost effectively as possible, without cutting corners.  For anything non-trivial, see if there is an existing solution that can solve the problem.  For games, this involves using a 3<sup>rd</sup> party engine, particle system, etc wherever possible.  It’s about solving the problems that need to be solved, in the cheapest way possible.</p>
<p>It’s good for developers as focuses them on completing as much as possible, as quickly as possible.  It’s also good for the business as it means the problems the business exists to solve are solved as cost effectively as possible.</p>
<p><strong>What fanatical pragmatism isn’t</strong></p>
<p>It is not about cutting corners to get to a solution faster.  Nor is it about ignoring long-term goals to reach short-term goals faster.  Fanatical pragmatism is not “cowboy coding” (rather it’s tangential to it) and it’s more about solving the businesses needs for the least cost than just getting things done quickly.</p>
<p><strong>How scrum fits in</strong></p>
<p>It fits in perfectly with agile development practices, particularly Scrum.  Scrum is a discipline-agnostic framework that gives developers the freedom to work within their own specific style.  For this reason, fanatical pragmatism works hand-in-hand with extremely short sprints and meeting changing customer demands.  It acts on high-level sprint planning (deciding what goes into a sprint) as well as low-level, day-to-day development such as exactly how to solve the tasks for a given sprint.  For this reason it can be embraced by both developers and management alike.</p>
<p><strong>Some general rules</strong></p>
<p>Some general rules I’ve found myself following recently:</p>
<ul>
<li><strong>Broaden your knowledge</strong>.  I’ve spent the last couple of years running a software company focussed on web applications.  I’ve picked up a lot of skills that I’ve been able to transfer over to game development (and vice versa).  The broader your knowledge, the large the pool of resources you can draw from to solve problems.  The jack of all trades is the master of fanatical pragmatism</li>
<li><strong>Focus on the goal</strong>.  The key to keeping pragmatic is always looking at where you are heading.  Every decision from day-to-day task assignment to strategic planning should focus on where the team is heading.  All efforts should be in driving the team towards their ultimate goal(s).<strong></strong></li>
</ul>
<p>Some general software development rules:</p>
<ul>
<li><strong>Separate your concerns</strong>.  A big part of why <a href="http://www.doolwind.com/blog/model-view-controller-mvc-game-engine/">MVC</a> works so well for a game engine is that it keeps the obvious concerns (e.g. gameplay vs. rendering) separated from each other.  This keeps each person on the team focussed on their part of the problem domain and helps to reduce complexity as the software grows in size</li>
<li><strong>Clean Interfaces</strong>.  Keeping loosely coupled systems is a great way of isolating your code so that any mistakes made, or changes needed can be done with the least amount of hassle in the future</li>
<li><strong>Build strong architecture where it’s needed</strong>.  For some large, complex system’s it’s important to spend the time up front designing the architecture for the system.  This gives everyone a foundation to build upon.  This should only be done in rare situations though.  It&#8217;s easy to get caught in the trap of doing lots of big design up front, however fanatical pragmatism calls for this only when absolutely necessary, and enough information is known.</li>
</ul>
<p><strong>Conclusion</strong></p>
<p>So that’s fanatical pragmatism in a nutshell.  Share your thoughts on the topic and let me know how you work best in achieving your goals.  I’m constantly evolving the way I work and I’m always looking for the best way to solve problems so please leave a message with your best practices.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doolwind.com/blog/fanatical-pragmatism-in-software-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Review: Certified ScrumMaster for Video Game Development with Clinton Keith</title>
		<link>http://www.doolwind.com/blog/review-certified-scrummaster-for-video-game-development-with-clinton-keith/</link>
		<comments>http://www.doolwind.com/blog/review-certified-scrummaster-for-video-game-development-with-clinton-keith/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 22:38:14 +0000</pubDate>
		<dc:creator>Doolwind</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Game Programming]]></category>
		<category><![CDATA[GDC]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.doolwind.com/blog/?p=477</guid>
		<description><![CDATA[In the days leading up to GDC this year Clinton Keith held a ScrumMaster course specifically for video game development.  I attended the course and in this blog post I share my experiences with a brief review for anyone thinking of attending or sending some of their developers to attend. The course runs over two [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.doolwind.com/images/blog/certified_scrummaster.jpg"><img class="alignright" title="Certified ScrumMaster" src="http://www.doolwind.com/images/blog/certified_scrummaster.jpg" alt="" width="155" height="107" /></a>In the days leading up to GDC this year <a href="http://clintonkeith.com/">Clinton Keith</a> held a ScrumMaster course specifically for video game development.  I attended the course and in this blog post I share my experiences with a brief review for anyone thinking of attending or sending some of their developers to attend.</p>
<p><span id="more-477"></span></p>
<p>The course runs over two full days and was the first course of this length where I didn’t fall asleep.  The content was of a high quality and was kept interesting with lots of interactive tasks and small group discussions.  Clinton began with a great overview of Scrum and then dug deep in to the details, explaining all concepts in great detail, without bogging down in minutiae.  While there was a slight programmer emphasis he covered all facets of game development.</p>
<p>Clinton has a lot of experience with general game development and is a pioneer with implementing Scrum in game development.  His stories were not only interesting but served as a great way to show how Scrum is being used in the real world.  He has worked with some big studios including CCP (creators of Eve Online) and Bioware.  This gives him both credibility and a great insight into how large companies have made successful games using Scrum.</p>
<p>The last part of the second day was spent simulating a handful of sprints to get a feel for how the interactions worked between ScrumMaster, product owner and the team.  The use of lego to create a small world was surprisingly similar to software development and served as a great way to simulate a small development cycle.  This brought the whole group together and let them experience the realities of working with Scrum in a group of people.  It allowed us to put into practice what had been learnt over the past two days.</p>
<p>An obvious benefit is the certification received at the end of the course.  However more important was the knowledge gained during the course.  I had a fairly good understanding of Scrum before the course however this helped to fill all the holes and even correct a number of misconceptions I had.  There are a lot of resources on the net and in books that can teach the basics of Scrum however I found that the interactive and hands-on nature of the course taught me things I would never have picked up through reading or trying to implement Scrum in a vacuum within my own team.  This is the primary reason I would recommend the course to anyone looking to adopt Scrum in the software development team.  Most people admitted to using a “version” of Scrum which by the end of the course proved to not have some of the essential ingredients.</p>
<p>One of the great points of the course was the high level of interactivity.  We could ask questions at any time (which people did) and Clinton would often integrate his answer into the rest of his talk give context rather than a simple answer.  He was happy to answer the hard questions about Scrum including where it has its problems and where we are likely to run into trouble.</p>
<p>I highly recommend the course to any lead’s or project managers.  While the cost of $1500 is fairly high (it&#8217;s the standard cost of any ScrumMaster course) it pays for itself in the payoffs you will experience within your team.  It’s an enjoyable two days where a lot is learnt and most will be inspired to fix the problems with the way their teams are managed.</p>
<p>Have you participated in a certified ScrumMaster course?  Have you attended one of Clinton’s courses or talks?  What do you think of Scrum and its relevance to video game development?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doolwind.com/blog/review-certified-scrummaster-for-video-game-development-with-clinton-keith/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Best Graphics Programming and Game Programming Blogs</title>
		<link>http://www.doolwind.com/blog/best-graphics-programming-and-game-programming-blogs/</link>
		<comments>http://www.doolwind.com/blog/best-graphics-programming-and-game-programming-blogs/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 06:15:57 +0000</pubDate>
		<dc:creator>Doolwind</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Game Engine]]></category>
		<category><![CDATA[Game Programming]]></category>
		<category><![CDATA[Graphics Programming]]></category>

		<guid isPermaLink="false">http://www.doolwind.com/blog/?p=455</guid>
		<description><![CDATA[Below are a collection of Blogs relating to game development, primarily graphics programming. Use your favourite reader (eg Google Reader) to read them.  Know of any blogs not on the list that you can recommend? Add a comment and I&#8217;ll add them to the list. Big thanks to Damian Trebilco for help with the list.  The [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.doolwind.com/images/blog/rssfeed.jpg"><img class="alignright" title="RSS Feed" src="http://www.doolwind.com/images/blog/rssfeed.jpg" alt="" width="130" height="119" /></a>Below are a collection of Blogs relating to game development, primarily graphics programming.  Use your favourite reader (eg <a href="http://www.google.com/reader">Google Reader</a>) to read them.  Know of any blogs not on the list that you can recommend? Add a comment and I&#8217;ll add them to the list. Big thanks to <a href="http://glintercept.nutty.org/">Damian Trebilco</a> for help with the list.  The blogs are listed alphabetically rather than by any preference of mine.</p>
<p><span id="more-455"></span></p>
<p>.mischief.mayhem.soap.<br />
<a href="http://msinilo.pl/blog/?feed=rss2"> http://msinilo.pl/blog/?feed=rss2</a></p>
<p>Atom<br />
<a href="http://farrarfocus.blogspot.com/feeds/posts/default "> http://farrarfocus.blogspot.com/feeds/posts/default </a></p>
<p>Beautiful Pixels<br />
<a href="http://feeds.feedburner.com/BeautifulPixels"> http://feeds.feedburner.com/BeautifulPixels</a></p>
<p>Dead Voxels<br />
<a href="http://deadvoxels.blogspot.com/feeds/posts/default"> http://deadvoxels.blogspot.com/feeds/posts/default</a></p>
<p>Diary of a Graphics Programmer<br />
<a href="http://diaryofagraphicsprogrammer.blogspot.com/feeds/posts/default"> http://diaryofagraphicsprogrammer.blogspot.com/feeds/posts/default</a></p>
<p>direct to video<br />
<a href="http://directtovideo.wordpress.com/feed/"> http://directtovideo.wordpress.com/feed/</a></p>
<p>Gamasutra<br />
<a href="http://feeds.feedburner.com/GamasutraNews">http://feeds.feedburner.com/GamasutraNews</a></p>
<p>Game Angst<br />
<a href="http://gameangst.com/?feed=rss2">http://gameangst.com/?feed=rss2</a></p>
<p>Game Rendering<br />
<a href="http://www.gamerendering.com/feed/"> http://www.gamerendering.com/feed/</a></p>
<p>GameArchitect<br />
<a href="http://gamearchitect.net/feed/"> http://gamearchitect.net/feed/</a></p>
<p>GameDev.Net<br />
<a href="http://www.gamedev.net/xml/">http://www.gamedev.net/xml/</a></p>
<p>Geeks3D Forums &#8211; 3D-Tech News Around The Web<br />
<a href="http://feeds2.feedburner.com/Geeks3DTechNewsForum">http://feeds2.feedburner.com/Geeks3DTechNewsForum</a></p>
<p>GPGPU» :: GPGPU.org<br />
<a href="http://www.gpgpu.org/cgi-bin/blosxom.cgi/index.rss">http://www.gpgpu.org/cgi-bin/blosxom.cgi/index.rss</a></p>
<p>Graphic Rants<br />
<a href="http://graphicrants.blogspot.com/feeds/posts/default"> http://graphicrants.blogspot.com/feeds/posts/default</a></p>
<p>Graphics Size Coding<br />
<a href="http://sizecoding.blogspot.com/feeds/posts/default"> http://sizecoding.blogspot.com/feeds/posts/default</a></p>
<p>Humus<br />
<a href="http://www.humus.name/rss.xml"> http://www.humus.name/rss.xml</a></p>
<p>Ignacio Castaño<br />
<a href="http://castano.ludicon.com/blog/feed/"> http://castano.ludicon.com/blog/feed/</a></p>
<p>John Ratcliff&#8217;s Code Suppository<br />
<a href="http://codesuppository.blogspot.com/feeds/posts/default"> http://codesuppository.blogspot.com/feeds/posts/default</a></p>
<p>level of detail<br />
<a href="http://www.jshopf.com/blog/?feed=rss2"> http://www.jshopf.com/blog/?feed=rss2</a></p>
<p>Level of Detail<br />
<a href="http://levelofdetail.wordpress.com/feed/"> http://levelofdetail.wordpress.com/feed/</a></p>
<p>Lost in the Triangles<br />
<a href="http://feeds.feedburner.com/LostInTheTriangles"> http://feeds.feedburner.com/LostInTheTriangles</a></p>
<p>Make It Big In Games<br />
<a href="http://makeitbigingames.com/feed/">http://makeitbigingames.com/feed/</a></p>
<p>meshula.net<br />
<a href="http://meshula.net/wordpress/?feed=rss2"> http://meshula.net/wordpress/?feed=rss2</a></p>
<p>OpenGL News<br />
<a href="http://www.opengl.org/news/rss_2.0/"> http://www.opengl.org/news/rss_2.0/</a></p>
<p>NVIDIA Developer News<br />
<a href="http://news.developer.nvidia.com/rss.xml"> http://news.developer.nvidia.com/rss.xml</a></p>
<p>Outside Hollywood<br />
<a href="http://www.outside-hollywood.com/feed/"> http://www.outside-hollywood.com/feed/</a></p>
<p>Real-Time Rendering<br />
<a href="http://www.realtimerendering.com/blog/feed/"> http://www.realtimerendering.com/blog/feed/</a></p>
<p>realtimecollisiondetection.net &#8211; the blog<br />
<a href="http://realtimecollisiondetection.net/blog/?feed=rss2"> http://realtimecollisiondetection.net/blog/?feed=rss2</a></p>
<p>Sanders&#8217; blog<br />
<a href="http://sandervanrossen.blogspot.com/feeds/posts/default"> http://sandervanrossen.blogspot.com/feeds/posts/default</a></p>
<p>Scattered Pixels<br />
<a href="http://feeds.feedburner.com/ScatteredPixels"> http://feeds.feedburner.com/ScatteredPixels</a></p>
<p>Solid Angle<br />
<a href="http://solid-angle.blogspot.com/feeds/posts/default"> http://solid-angle.blogspot.com/feeds/posts/default</a></p>
<p>The Hacks of Life<br />
<a href="http://hacksoflife.blogspot.com/feeds/posts/default"> http://hacksoflife.blogspot.com/feeds/posts/default</a></p>
<p>w00t<br />
<a href="http://bpeers.com/blog/xml-rss2.php"> http://bpeers.com/blog/xml-rss2.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.doolwind.com/blog/best-graphics-programming-and-game-programming-blogs/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Top 10 Software Development Books</title>
		<link>http://www.doolwind.com/blog/top-10-software-development-books/</link>
		<comments>http://www.doolwind.com/blog/top-10-software-development-books/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 10:40:30 +0000</pubDate>
		<dc:creator>Doolwind</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Books]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[Game Programming]]></category>
		<category><![CDATA[Softare Development]]></category>

		<guid isPermaLink="false">http://www.doolwind.com/blog/?p=277</guid>
		<description><![CDATA[Good software development books are hard to find. I&#8217;m always being asked which books I recommend so I thought I&#8217;d compile a list of my favourites. These are books every software developer should read. All of these books have made me a better programmer. The list covers everything from the basics of coding to agile [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.doolwind.com/images/blog/top10books/Top10SoftwareDevelopmentBooks.jpg"><img class="alignright" title="Top 10 Software Development Books" src="http://www.doolwind.com/images/blog/top10books/Top10SoftwareDevelopmentBooks.jpg" alt="" width="82" height="103" /></a>Good software development books are hard to find.  I&#8217;m always being asked which books I recommend so I thought I&#8217;d compile a list of my favourites.  These are books every software developer should read.  All of these books have made me a better programmer.  The list covers everything from the basics of coding to agile development and architectural software development.</p>
<p><span id="more-277"></span></p>
<p><strong>The Pragmatic Programmer: From Journeyman to Master</strong><br />
<a href="http://www.amazon.com/gp/product/020161622X?ie=UTF8&amp;tag=doosgamcodblo-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=020161622X"><img src="http://www.doolwind.com/images/blog/top10books/ThePragmaticProgrammer.jpg" border="0" alt="" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=doosgamcodblo-20&amp;l=as2&amp;o=1&amp;a=020161622X" border="0" alt="" width="1" height="1" /><br />
<strong> </strong></p>
<p><strong>Code Complete</strong><br />
<a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;tag=doosgamcodblo-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0735619670"><img src="http://www.doolwind.com/images/blog/top10books/CodeComplete.jpg" border="0" alt="" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=doosgamcodblo-20&amp;l=as2&amp;o=1&amp;a=0735619670" border="0" alt="" width="1" height="1" /><br />
<strong> </strong></p>
<p><strong>Rapid Development: Taming Wild Software Schedules</strong><br />
<a href="http://www.amazon.com/gp/product/1556159005?ie=UTF8&amp;tag=doosgamcodblo-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1556159005"><img src="http://www.doolwind.com/images/blog/top10books/RapidDevelopment.jpg" border="0" alt="" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=doosgamcodblo-20&amp;l=as2&amp;o=1&amp;a=1556159005" border="0" alt="" width="1" height="1" /><br />
<strong> </strong></p>
<p><strong>Agile Software Development, Principles, Patterns, and Practices</strong><br />
<a href="http://www.amazon.com/gp/product/0135974445?ie=UTF8&amp;tag=doosgamcodblo-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0135974445"><img src="http://www.doolwind.com/images/blog/top10books/AgileSoftwareDevelopment.jpg" border="0" alt="" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=doosgamcodblo-20&amp;l=as2&amp;o=1&amp;a=0135974445" border="0" alt="" width="1" height="1" /><br />
<strong> </strong></p>
<p><strong>Refactoring: Improving the Design of Existing Code</strong><br />
<a href="http://www.amazon.com/gp/product/0201485672?ie=UTF8&amp;tag=doosgamcodblo-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0201485672"><img src="http://www.doolwind.com/images/blog/top10books/Refactoring.jpg" border="0" alt="" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=doosgamcodblo-20&amp;l=as2&amp;o=1&amp;a=0201485672" border="0" alt="" width="1" height="1" /><br />
<strong> </strong></p>
<p><strong>Peopleware: Productive Projects and Teams</strong><br />
<a href="http://www.amazon.com/gp/product/0932633439?ie=UTF8&amp;tag=doosgamcodblo-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0932633439"><img src="http://www.doolwind.com/images/blog/top10books/Peopleware.jpg" border="0" alt="" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=doosgamcodblo-20&amp;l=as2&amp;o=1&amp;a=0932633439" border="0" alt="" width="1" height="1" /><br />
<strong> </strong></p>
<p><strong>The Mythical Man-Month: Essays on Software Engineering</strong><br />
<a href="http://www.amazon.com/gp/product/0201835959?ie=UTF8&amp;tag=doosgamcodblo-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0201835959"><img src="http://www.doolwind.com/images/blog/top10books/TheMythicalManMonth.jpg" border="0" alt="" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=doosgamcodblo-20&amp;l=as2&amp;o=1&amp;a=0201835959" border="0" alt="" width="1" height="1" /><br />
<strong> </strong></p>
<p><strong>Design Patterns: Elements of Reusable Object-Oriented Software</strong><br />
<a href="http://www.amazon.com/gp/product/0201633612?ie=UTF8&amp;tag=doosgamcodblo-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0201633612"><img src="http://www.doolwind.com/images/blog/top10books/DesignPatterns.jpg" border="0" alt="" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=doosgamcodblo-20&amp;l=as2&amp;o=1&amp;a=0201633612" border="0" alt="" width="1" height="1" /><br />
<strong> </strong></p>
<p><strong>Software Estimation: Demystifying the Black Art</strong><br />
<a href="http://www.amazon.com/gp/product/0735605351?ie=UTF8&amp;tag=doosgamcodblo-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0735605351"><img src="http://www.doolwind.com/images/blog/top10books/SoftwareEstimation.jpg" border="0" alt="" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=doosgamcodblo-20&amp;l=as2&amp;o=1&amp;a=0735605351" border="0" alt="" width="1" height="1" /><br />
<strong> </strong></p>
<p><strong>Patterns of Enterprise Application Architecture</strong><br />
<a href="http://www.amazon.com/gp/product/0321127420?ie=UTF8&amp;tag=doosgamcodblo-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321127420"><img src="http://www.doolwind.com/images/blog/top10books/PatternsOfEnterpriseApplicationArchitecture.jpg" border="0" alt="" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=doosgamcodblo-20&amp;l=as2&amp;o=1&amp;a=0321127420" border="0" alt="" width="1" height="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.doolwind.com/blog/top-10-software-development-books/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>How To Make A Game (For Free In XNA)</title>
		<link>http://www.doolwind.com/blog/how-to-make-a-game-for-free-in-xna/</link>
		<comments>http://www.doolwind.com/blog/how-to-make-a-game-for-free-in-xna/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 20:48:52 +0000</pubDate>
		<dc:creator>Doolwind</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[Game Programming]]></category>
		<category><![CDATA[Xbox 360]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://www.doolwind.com/blog/?p=273</guid>
		<description><![CDATA[Do you want to learn how to make your own computer games?  Not sure where to start?  This step-by-step tutorial shows you how to create your own games for free using XNA.  I’ve been asked by a number of people what the best route to take when learning to develop games.  The following tutorial will [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.doolwind.com/images/blog/xna.jpg"><img class="alignright" title="XNA" src="http://www.doolwind.com/images/blog/xna.jpg" alt="" width="169" height="98" /></a>Do you want to learn how to make your own computer games?  Not sure where to start?  This step-by-step tutorial shows you how to create your own games for free using XNA.  I’ve been asked by a number of people what the best route to take when learning to develop games.  The following tutorial will give you a good start towards creating your first few games for PC and Xbox 360.  I cover the software you’ll need, a list of tutorial both in C# and XNA and other helpful links.</p>
<p><span id="more-273"></span></p>
<p><strong>Software</strong></p>
<p style="padding-left: 30px;"><strong><span style="font-weight: normal; ">1. Download Visual Studio 2008 Express &#8211; <a href="http://bit.ly/VCSExp">http://bit.ly/VCSExp</a></span></strong></p>
<p style="padding-left: 30px;"><strong><span style="font-weight: normal; "><a href="http://bit.ly/VCSExp"></a>2. Download XNA Game Studio 3.1 &#8211; <a href="http://bit.ly/XNAGS31">http://bit.ly/XNAGS31</a></span></strong></p>
<p><strong>Learning C#</strong></p>
<p style="padding-left: 30px;"><strong><span style="font-weight: normal; ">3. Read these C# tutorials</span></strong></p>
<p style="padding-left: 60px;"><strong><span style="font-weight: normal; ">a. C# Station Tutorial &#8211; <a href="http://bit.ly/CSTut1">http://bit.ly/CSTut1</a></span></strong></p>
<p style="padding-left: 60px;"><strong><span style="font-weight: normal; "><a href="http://bit.ly/CSTut1"></a>b. C# WikiBooks &#8211; <a href="http://bit.ly/CSWiki">http://bit.ly/CSWiki</a></span></strong></p>
<p><strong>Learning XNA</strong></p>
<p style="padding-left: 30px;"><strong><span style="font-weight: normal;">4. Read these XNA tutorials</span></strong></p>
<p style="padding-left: 60px;"><strong><span style="font-weight: normal;">a. Introduction &#8211; <a href="http://bit.ly/XNATut1">http://bit.ly/XNATut1</a></span></strong></p>
<p style="padding-left: 60px;"><strong><span style="font-weight: normal;"><a href="http://bit.ly/XNATut1"></a>b. 2D Introduction &#8211; <a href="http://bit.ly/XNATut2D">http://bit.ly/XNATut2D</a></span></strong></p>
<p style="padding-left: 60px;"><strong><span style="font-weight: normal;"><a href="http://bit.ly/XNATut2D"></a>c. 3D Introduction &#8211; <a href="http://bit.ly/XNATut3D">http://bit.ly/XNATut3D</a></span></strong></p>
<p style="padding-left: 30px;">5.<strong> <span style="font-weight: normal;">Look at these starter kits &#8211; <a href="http://bit.ly/XNAKit">http://bit.ly/XNAKit</a></span></strong></p>
<p><strong>Other Links</strong></p>
<p style="padding-left: 30px;"><strong><span style="font-weight: normal;">6. Visit the following for more information on game development</span></strong></p>
<p style="padding-left: 60px;"><strong><span style="font-weight: normal;">a. Gamedev.net &#8211; <a href="http://www.gamedev.net/">http://www.gamedev.net/</a></span></strong></p>
<p style="padding-left: 60px;"><strong><span style="font-weight: normal;"><a href="http://www.gamedev.net/"></a>b. Gamasutra &#8211; <a href="http://gamasutra.com/">http://gamasutra.com/</a></span></strong></p>
<p style="padding-left: 60px;"><strong><span style="font-weight: normal;"><a href="http://gamasutra.com/"></a>c. Indie Gamer Forums &#8211; <a href="http://forums.indiegamer.com/">http://forums.indiegamer.com/</a></span></strong></p>
<p><strong>What should you create?</strong></p>
<p>I&#8217;ve found the best way to learn game development is by creating a full game.  Exactly what game you create depends on what you want to get out of game development.  There are a number of paths I commonly see people taking:</p>
<ul>
<li><strong>Becoming a game programmer</strong> &#8211; The best route here is to take an existing game like Pong, Space Invaders or Mario and recreating it.  The game design done is already complete, allowing you to focus on learning the skills required to code the game</li>
<li><strong>Becoming a game designer</strong> &#8211; Rather than recreating an existing game, come up with a new, simpler design.</li>
<li><strong>Getting a job at a particular game company </strong>- Before you begin your new game, you should find out what technology the company is using.  You are much more likely to be hired by them if you are experienced in their technology suite.  If you&#8217;re unsure of what they use, ask them.  Game companies are always looking for good talent and they&#8217;ll be happy to share the technologies they use with you.</li>
</ul>
<p><strong>Want more?</strong></p>
<p>I’d like this list to become a comprehensive, step-by-step introduction to game development that takes developers from zero experience to creating their own 3D (or 2D) games.  If you get to a point where you’re stuck and don’t know what to do next, please email me and I’ll help you fill in the blanks.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doolwind.com/blog/how-to-make-a-game-for-free-in-xna/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unified Game Development Scripting Language</title>
		<link>http://www.doolwind.com/blog/unified-game-development-scripting-language/</link>
		<comments>http://www.doolwind.com/blog/unified-game-development-scripting-language/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 23:55:13 +0000</pubDate>
		<dc:creator>Doolwind</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Game Engine]]></category>
		<category><![CDATA[Game Programming]]></category>
		<category><![CDATA[Scripting Language]]></category>
		<category><![CDATA[Unreal]]></category>

		<guid isPermaLink="false">http://www.doolwind.com/blog/?p=194</guid>
		<description><![CDATA[What is the best scripting language for game development?  Every different game engine has its own scripting language making for a difficult choice.  Game programmers have a unified language in C++ however game designers are left with whatever language their engine supports.  I propose a unified scripting language that all engines/platforms can share. Problem When [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.doolwind.com/images/blog/scriptinglanguages.jpg"><img class="alignright" title="Scripting Languages" src="http://www.doolwind.com/images/blog/scriptinglanguages.jpg" alt="" width="86" height="75" /></a>What is the best scripting language for game development?  Every different game engine has its own scripting language making for a difficult choice.  Game programmers have a unified language in C++ however game designers are left with whatever language their engine supports.  I propose a unified scripting language that all engines/platforms can share.</p>
<p><span id="more-194"></span></p>
<p><strong>Problem</strong></p>
<p>When you chose an engine or platform to develop for, you’re locking yourself into its scripting language.  This has the following core problems:</p>
<ul>
<li><strong>Difficult cross platform development</strong>.  Cross platform development is hard      enough without the worry of porting gameplay code.  Gameplay code should not be platform      specific, and therefore there is no reason to have a different language      per platform/engine.</li>
<li><strong>Immature languages</strong>.       With each company re-inventing the wheel when they implement a new      language designers are left with immature languages.</li>
<li><strong>Too many languages</strong>.       Designers must learn a new language whenever they develop for a new      engine/platform.  This increases      development time and reduces fluency in a language.  A designer cannot be free to fully      express themselves until they are fluent in the language they describe      their gameplay in.</li>
</ul>
<p><strong>Solution</strong></p>
<p>The solution to these problems is to have a unified scripting language shared by all engines/platforms.  Written specifically for game development it would take the best of current scripting languages.  The games industry as a whole would “own” the language allowing it to evolve with the needs of the industry as each new generation of hardware is released.</p>
<p><strong>Advantages</strong></p>
<p>There are a number of key advantages for moving towards a unified scripting language.</p>
<ul>
<li><strong>Single gameplay codebase</strong>.       Gameplay doesn’t change dramatically between similar platforms      (e.g. 360 and PS3 or flash and iPhone).       A unified language would allow a single codebase to kept across      multiple platforms helping with porting and maintenance.</li>
<li><strong>Specific to game development needs</strong>.  A language created specifically for game      development could cater to the needs of the industry.</li>
<li><strong>Single language for designers to use.</strong> Small nuances in existing languages can      create major issues for non-programmer designers.  A single unified language reduces these      problems and makes the learning path for students clearer.</li>
<li><strong>Less Wheel Re-Invention</strong>.       An open-source unified scripting language would allow anyone to      submit changes to the language to improve it, rather than re-inventing a      whole new language.</li>
<li><strong>Unified Toolset</strong>.  A      unified set of tools could sit on top of a unified scripting language.<strong></strong></li>
</ul>
<p><strong>Genre Specific</strong></p>
<p>The core language will hold the basic building blocks for all games.  In the future, small libraries can be built by studios or the community for each specific genre.  For example a library of functions common to most FPS or RTS games could be created and shared between developers.   A unified scripting language makes this sharing possible and encourages people to develop well thought out, robust libraries they can reuse from engine to engine.  It also serves to soften the blow for designers when changing engines as their common set of functions will move across with them.</p>
<p><strong>How</strong></p>
<p>There are two main options for the creation of a new unified scripting language:</p>
<ul>
<li><strong>Large studio forks their current language</strong>.  For example Epic could open up Unreal      Script and give out the source code for its implementation (let&#8217;s call it      OpenUnrealScript).</li>
<li><strong>Community Driven</strong>.  A      simple codeplex/google code project with a couple of leaders and a team of      developers would allow for rapid development, while meeting the needs of      multiple teams.  Early adopters      would drive the initial feature-set and help to drive its development.<strong></strong></li>
</ul>
<p><strong>Conclusion</strong></p>
<p>My dream is to see the next generation of consoles and other platforms (PC, iPhone, Flash) all supporting a unified language.  I&#8217;m interested in people&#8217;s thoughts on this idea and candidates for which language to use.  It&#8217;s less about language features and just agreeing on a core language everyone can use to develop games and bring all developers onto the same page.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doolwind.com/blog/unified-game-development-scripting-language/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Doolwind&#039;s Game Coding Standard</title>
		<link>http://www.doolwind.com/blog/doolwinds-game-coding-standard/</link>
		<comments>http://www.doolwind.com/blog/doolwinds-game-coding-standard/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 22:37:05 +0000</pubDate>
		<dc:creator>Doolwind</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Game Programming]]></category>

		<guid isPermaLink="false">http://www.doolwind.com/blog/?p=93</guid>
		<description><![CDATA[For some time now I&#8217;ve been asked by a few people to write up my thoughts on a coding standard. To me, coding standards are like source control, until you use them you don&#8217;t realise just how awesome they are. Coding standards are a requirement for large software teams, however even if you are working [...]]]></description>
			<content:encoded><![CDATA[<p align="left"><img src="http://www.doolwind.com/images/blog/comic/comic-05.jpg" usemap="#Map" align="right" border="0" height="230" width="300" /><br />
<map name="Map" id="Map">
<area href="http://www.squidtank.com" shape="rect" coords="91,191,300,229" /></map>
<p>For some time now I&#8217;ve been asked by a few people to write up my thoughts on a coding standard.  To me, coding standards are like source control, until you use them you don&#8217;t realise just how awesome they are.  Coding standards are a requirement for large software teams, however even if you are working alone I&#8217;d recommend adopting at least a simple coding standard.Keeping code consistent and readable is helpful when reading other people&#8217;s code as well as when reading your own code weeks or months are it was written.  In effect a coding standard is trading development time for maintainability time.  I&#8217;ve found that the ratio of dev time to maintenance time grows from 1:1 on a small project to something approaching 1:∞ on larger projects.</p>
<p><span id="more-93"></span></p>
<p>I&#8217;d like to formally thank <a href="http://www.somedude.net/gamemonkey/forum/viewtopic.php?f=12&amp;t=377">Greg</a> for showing me the light on a lot of these points.  I&#8217;ve spoken previously about <a href="http://www.doolwind.com/blog/?p=61">pair programming</a> and just generally mixing the experience level of developers to help the younger ones.  I think that these kinds of relationships are invaluable for making great programmer as it&#8217;s something that you just can&#8217;t pick up from textbooks or coding by yourself.</p>
<p>As always, please add your thoughts and complaints.  I think that just talking about these issues is a good step in growing as a software developer, even if everyone doesn&#8217;t always agree.</p>
<h3><strong>General Tips</strong></h3>
<p><strong>1.       </strong><strong>Be consistent</strong></p>
<p>This is the golden rule with coding standards in any language.  Every other rule below is pointless unless there is consistency.  If you completely disagree with all of my points below that&#8217;s fine, so long as you set out a standard, and everyone conforms to it.  The only thing worse than a bad coding standard is not having one or having one that isn&#8217;t followed by everyone.</p>
<p>This can be an issue for some programmers as their ego&#8217;s get in the way however it&#8217;s vitally important that everyone follows the standard otherwise it will quickly turn into bedlam.  This consistency should ideally cross both the programmer boundary and the project boundary.  It will be much harder to have consistency between projects, however if this can be achieved, any programmer within the company can switch projects freely (even if only to assist briefly).  This also increases efficiency on new projects when programmers who haven&#8217;t worked together already have this coding standard in common.</p>
<p><strong>2.       </strong><strong>Get everyone involved</strong></p>
<p>To get the best &#8220;buy-in&#8221; and to reduce friction amongst the team, it&#8217;s important to get everyone involved in the discussions.  I&#8217;d recommend writing up the standard once &#8220;complete&#8221; and passing it around as the first draft.  Giving people plenty of time to comment also gives leaders more ammunition when enforcing the standard.  If people can voice their thoughts on the subject they are more likely to follow the standard in the future.</p>
<p>There is always going to be the inevitable ideological disputes where programmers won&#8217;t be able to come to a conclusion.  There are really two options here:</p>
<blockquote><p>i. Military style: The highest ranked programmer makes a decision, and everyone follows suit.  This may be the only way to solve the most ideological debates but has the side effect of lowering morale.</p></blockquote>
<blockquote><p>ii. Politician style: Both sides put their case forward and the entire team (or key members) vote on which to choose.</p></blockquote>
<h3><strong>Specific Tips</strong></h3>
<p><strong>3.       </strong><strong>Curly braces &#8211; on the next line</strong></p>
<p><code><font color="#0000ff">if</font> (condition)<br />
{<br />
}</code></p>
<p>This is pretty much the standard I&#8217;m seeing everyone use these days.  There are some strange lecturers and Java programmers that keep the brace on the same line, but otherwise most people seem to have unofficially agreed to this.  This has the added advantage of allowing the condition to be commented out quickly (using //)</p>
<p>Negative: It takes up less space having it on the same line.<br />
Response: It makes code far more readable, and white space is free and should be used.</p>
<p><strong>4.       </strong><strong>Always put curly braces in</strong></p>
<p>The main reason for this is that it reduces errors in code such as a macro hiding the fact its multiple statements.  The secondary reason is for maintainability.  If the single statement becomes multiple statements it takes longer to update, and can lead to errors if people miss adding the braces.</p>
<p>Negative: It saves time to leave braces out.<br />
Response: Saving time at the expense of readability is bad.  If all conditions/loops have braces then the source will be far more consistent.</p>
<p>Negative: It takes up less space without braces and more code can fit on the screen.<br />
Response: Fitting more code on screen is not as important as having error free, maintainable code.  As desktop resolutions increase this argument holds even less weight.</p>
<p><strong>5.       </strong><strong>Prefix members and arguments</strong></p>
<p><code><span style="color: #0000ff">class</span> MyClass<br />
{<br />
<span style="color: #0000ff">  int</span> m_myInt;<br />
};</code></p>
<p><code><span style="color: #0000ff">void</span> MyFunction( <span style="color: #0000ff">int</span> a_myParam )<br />
{<br />
}<br />
</code></p>
<p>Firstly, adding these prefixes is NOT Hungarian notation.  Rather than describing the type of a variable adding these prefixes gives context about what the variable is.  This context is the key reason for adding prefixes.  Prefixes make it easier to build a map in your mind of what the code is doing as you can quickly tell what variables are arguments/parameters, which are members and which are simply local variables.  You can also add g_ to globals, however I&#8217;d be advocating the use of globals then J.</p>
<p>If m_ and a_ are too verbose then the alternative is simply appending m and a.</p>
<p><code><span style="color: #0000ff">void</span> MyFunction( <span style="color: #0000ff">int</span> aMyParam )<br />
{<br />
}</code></p>
<p>Personally, I prefer the full prefix (m_) as it makes the code more readable, and it follows the convention of the first character of the variable name being lower case.</p>
<p>Negative: With modern IDE&#8217;s you can mouse over variables to get extra information<br />
Response: Mousing over is slower than simply perusing code.  The information given is usually just the type which doesn&#8217;t give context, it only gives further information.</p>
<p>Negative: It takes too long<br />
Response: Again, readability is more important than saving a few seconds on typing</p>
<p>Negative: Underscore is hard to type<br />
Response: Once you&#8217;ve been using it for a while it becomes quite natural.  Also with tools like visual assist the underscore can automatically be added in for you.</p>
<p><strong>6.       </strong><strong>Put modifiers (* and &amp;) next to variable type rather than variable name</strong></p>
<p><code>MyClass*             myVariable;</code></p>
<p>This point actually goes against what I am seeing most people using in their coding standards at the moment.  It also goes against what I was taught at university (whether that&#8217;s bad or not I don&#8217;t know).  Before you dismiss it though, I recommend you actually sit and think about the alternatives and why you would use them.  The modifier (pointers or reference) is modifying the type of the variable and therefore it should be placed next to the type itself.  The negative to this is one I gave when first taught this, however after thinking about it I realised the error of my ways.</p>
<p>Negative: The modifier should go next to the variable name as it is misleading if you declare multiple variables per line.  In the example below, the first variable is a pointer and the second is not, this is misleading.</p>
<p><code>MyClass*             myPointerVariable, myNonPointerVariable;</code></p>
<p>Response: Declaring multiple variables on one line is really the exception to the rule.  Should you be making a decision about based on the exception or the rule?  If there are any modifiers like this, don&#8217;t declare them on the same line.  The worst issue here is a bit of extra typing and more screen real-estate being used up, neither of which should be an issue.  Having the pointer next to the variable name makes it harder to reader when skimming over code, particularly if there are a number of spaces (or tabs) between the type and name.</p>
<p><strong>7.       </strong><strong>Create const on functions and function arguments where appropriate</strong></p>
<p>Const correctness for variables is a bit like cleaning your teeth.  It&#8217;s annoying to do, but everyone agrees that you should do it.  There are three main benefits:</p>
<blockquote><p>i. More descriptive code.  A quick look at a function tells you whether it changes the state of an object, and whether it changes the state of any variables passed in.</p></blockquote>
<blockquote><p>ii. Faster code.  Giving the compiler more information about constness allows it to optimize your code.</p></blockquote>
<blockquote><p>iii. Less errors.  If a function or argument is const then anyone changing the function will get compile time errors if they do something the function was never intended to do.</p></blockquote>
<p><strong>8.       </strong><strong>Conditions/Loops should have a space after them</strong></p>
<p><code><span style="color: #0000ff">if</span> (myVar)<br />
{<br />
}<br />
</code></p>
<p>This is the most readable way of writing conditional and loop statements I&#8217;ve seen.  I personally recommend this usage, however the main reason for this point is to get you thinking about how it should be done.  If you disagree, that&#8217;s fine, just make sure you remember point #1 and decide how you want your code to look and keep it consistent.</p>
<p><strong>9.       </strong><strong>Camel case variables, capitalize classes and functions and full capitalize constants</strong></p>
<p>I&#8217;ll finish up with an easy one.  Most people agree with this standard but I thought I&#8217;d list it anyone.  The best way to show this is with examples:</p>
<p>Variable:</p>
<p><code><span style="color: #0000ff">int </span>myVariableName;     <span style="color: #339966">// camel case</span><br />
</code><br />
Class and functions:</p>
<p><code><span style="color: #0000ff">class</span> MyClassName {} ; <span style="color: #339966">// camel case with capital first</span><br />
<span style="color: #0000ff">void </span>MyFunctionName();</code></p>
<p>Constants:</p>
<p><code><span style="color: #0000ff">const int</span> MY_CONSTANT_NAME = 5;</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.doolwind.com/blog/doolwinds-game-coding-standard/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Creating Good Software Development Teams</title>
		<link>http://www.doolwind.com/blog/creating_good_software_development_teams/</link>
		<comments>http://www.doolwind.com/blog/creating_good_software_development_teams/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 06:26:56 +0000</pubDate>
		<dc:creator>Doolwind</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Game Development Teams]]></category>
		<category><![CDATA[Game Programming]]></category>

		<guid isPermaLink="false">http://www.doolwind.com/blog/?p=92</guid>
		<description><![CDATA[Below is a short list on how I believe managers can foster a good software development team. 1. Fire bad programmers (and don&#8217;t hire them) I decided to start with the controversial one; however it&#8217;s one of the most important. Nearly every team I&#8217;ve worked on has had someone on it that should have been [...]]]></description>
			<content:encoded><![CDATA[<p><img usemap="#Map" src="http://www.doolwind.com/images/blog/comic/comic-04.jpg" border="0" alt="" width="300" height="200" align="right" /></p>
<p><span id="more-92"></span></p>
<map id="Map" name="Map">
<area shape="rect" coords="92,169,336,221" href="http://www.squidtank.com" /></map>
<p>Below is a short list on how I believe managers can foster a good software development team.</p>
<p><strong>1.  Fire bad programmers (and don&#8217;t hire them) </strong></p>
<p>I decided to start with the controversial one; however it&#8217;s one of the most important.  Nearly every team I&#8217;ve worked on has had someone on it that should have been fired but the company just wouldn&#8217;t do it.  There are many benefits to be made from firing the bad programmers, some of which aren&#8217;t immediately obvious.</p>
<blockquote><p>a. The obvious one is that bad programmers add bad code.  This in turn causes more work for the rest of the team, adds to maintenance time and pushes deadlines back.  This also leads to software entropy where good programmers will be forced to work with bad code which often encourages other bad code.</p></blockquote>
<blockquote><p>b. They bring the morale of the team down.  Any good programmer can pick a bad programmer after only a few weeks of working with them.  It&#8217;s very demoralising to be forced to work with someone that is no good, particularly if they are getting paid just as much, or more than the good programmers.</p></blockquote>
<blockquote><p>c. They teach bad habits.  Keeping bad programmers on gives new programmers bad influences to look to for support.  By letting them stay on within the team, managers are basically saying that they don&#8217;t mind having bad programmers working for them.  It makes it hard to foster good quality coding standards when members of the team are openly ignoring them.</p></blockquote>
<p>The only caveat to this is mid-development of a product.  It may be detrimental in the short term to remove bad programmers immediately; however this often turns into apathy where the programmer simply stays on to the next project or milestone.  Look at the schedule and actually mark off when the time is right to remove them.  Once this date comes around bite the bullet and get rid of them.</p>
<p><strong>2.  Give rewards</strong></p>
<p>I&#8217;m surprised how many programmers when asked how work is going will mention certain perks or rewards they receive from their bosses.  This can be anything from having a few days off after record profits to free food/beer/game nights once a week.  One of the biggest problems with &#8216;working for the man&#8217; is that there&#8217;s no direct connection between the quality of work programmers do and their rewards.  This was one of the key points in Office Space and every programmer I speak to has had this problem at some stage in their career.  The main purpose here is to tie the success of the company to the employee&#8217;s that are creating this success.  It can range from profit sharing to simply taking everyone out for a big meal (with free drinks for those inclined) after meeting a big milestone.</p>
<p>In the grand scheme of things it doesn&#8217;t end up costing much, and the productivity benefits returned will easily pay the rewards back many times over.</p>
<p><strong>3.  Give good direction</strong></p>
<p>There&#8217;s nothing worse than having a project that&#8217;s just aimlessly drifting towards it&#8217;s goal.  There need to be set goals that the entire project is working towards as well as sub-goals for each individual team.  Programmers are logical, methodical people and they like order in their lives.  The more you can make the project&#8217;s direction fit in with this view the more the programmers will &#8216;buy in&#8217; on the future direction.</p>
<p>Programmers will look at the project as if it were a program in itself.  There&#8217;s a bunch of commands the team is following (create the UI), with conditions (if there&#8217;s time, add in flashy feature 53) and iteration (each milestone).  If you can learn to think like programmers do and show the direction of the project in a way they&#8217;ll understand you&#8217;ll see productivity gains.</p>
<p><strong>4.  Be transparent</strong></p>
<p>I touched on this in an <a href="http://www.doolwind.com/blog/?p=88">earlier post</a>, so I&#8217;ll keep this one short.  Basically let the team know what&#8217;s happening within the company.  You don&#8217;t have to give them every detail, but make sure that the important information is propagated.  This can be as simple as a company newsletter or an internal website that has the news.  Those who are interested can stay up to date and others who don&#8217;t care can just ignore it.  People often worry about their jobs and not knowing what is happening can often lead to a drop in productivity.</p>
<p><strong>Conclusion</strong></p>
<p>I&#8217;d like to hear from people if they have other ideas or whether people agree or disagree with my list.  As things move forward with the business we&#8217;re hoping to set up a software team in the near future so I&#8217;ll start posting on how implementing these and other ideas I&#8217;ve blogged about works out in reality.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doolwind.com/blog/creating_good_software_development_teams/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

