<?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>Tiny Tim Games &#187; Development</title>
	<atom:link href="http://www.tinytimgames.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tinytimgames.com</link>
	<description></description>
	<lastBuildDate>Sun, 18 Jul 2010 09:18:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>The Unity/Objective-C Divide</title>
		<link>http://www.tinytimgames.com/2010/01/10/the-unityobjective-c-divide/</link>
		<comments>http://www.tinytimgames.com/2010/01/10/the-unityobjective-c-divide/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 12:15:37 +0000</pubDate>
		<dc:creator>Jerrod Putman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[iPhone & iPod touch]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Unity]]></category>

		<guid isPermaLink="false">http://www.tinytimgames.com/?p=389</guid>
		<description><![CDATA[UPDATE: There was a typo in the code section that adds the observer for NSUserDefaults. This has now been corrected. I also added information about how to find the proper assembly file when trying to access script class methods. WARNING: The following is a technical article. Don&#8217;t blame me if you find it boring! I [...]]]></description>
			<content:encoded><![CDATA[<p>UPDATE: There was a typo in the code section that adds the observer for <em>NSUserDefaults</em>. This has now been corrected. I also added information about how to find the proper assembly file when trying to access script class methods.</p>
<p>WARNING: The following is a technical article. Don&#8217;t blame me if you find it boring!</p>
<p>I love <a title="Unity" href="http://www.unity3d.com" target="_self">Unity</a>! The Unity iPhone engine is a fantastic piece of technology, allowing us to quickly develop games without having to worry about a lot of the underlying stuff. However, Unity is essentially an additional layer on top of the iPhone SDK, which means that while the iPhone SDK may advance with new features, the Unity engine is generally a step behind with adding these features in a manner that can be easily accessed through script.</p>
<p>Enter Objective-C: This is the language that iPhone apps are usually written in. Unity provides some support for calling native Objective-C code from Unity script, but only for Advanced licensees and only in one direction. This can be pretty limiting especially if you&#8217;re trying to use a lot of the fancy features in iPhone OS 3.0. Sure, you can pass around information using the <em>PlayerPrefs</em> trick. But this has the problem of not being instantaneous, and it forces the app to constantly poll for new commands, which probably isn&#8217;t a good idea performance-wise.</p>
<p>What follows is a method for immediately calling Objective-C code from Unity script (for both Basic and Advanced licenses) and also vice versa! That&#8217;s right, two-way communication between Objective-C and Unity script that&#8217;s instantaneous.</p>
<p><span id="more-389"></span><strong>Unity to Objective-C (for Advanced licensees)</strong></p>
<p>First, for the Advanced license users of Unity, you already have a quick and easy way of calling Objective-C code from Unity script. In C#, just do the following:</p>
<pre>[System.Runtime.InteropServices.DllImport("__Internal")]
extern static public int AwesomeFunction(int awesomeParameter);</pre>
<p>Then, in a C/C++/Objective-C file somewhere in your Unity-built Xcode project, do the following:</p>
<pre>int AwesomeFunction(int awesomeParameter)
{
   // My awesome code goes here.

  return somethingAwesome;
}</pre>
<p>You may have to wrap your function prototypes in <em>extern &#8220;C&#8221; { &#8230; }</em> if you&#8217;re using C++/Objective-C++ due to name mangling.</p>
<p><strong>Unity to Objective-C (for Basic licensees)</strong></p>
<p>Now for you Basic license users, you&#8217;ve been used to sending a command to Objective-C from Unity script like this:</p>
<pre>PlayerPrefs.SetString("Commands",
   String.Format("AwesomeCommand|{0}|{1}", awesome1, awesome2));</pre>
<p>Or something similar. You&#8217;ll still be sending commands this way. However, in Objective-C, you probably have an <em>NSTimer</em> that is constantly polling to see if the &#8220;Commands&#8221; key in <em>NSUserDefaults</em> has a string in it. You might even have some fancy queueing system set up so that you can call multiple commands in a row without them overwriting each other. The issue, though, is that if you need a result back from one of these commands, you can&#8217;t get it instantaneously. You have to set up some kind of polling system in Unity script to wait for a return result to show up in some other <em>PlayerPrefs</em> key. Messy.</p>
<p>But there&#8217;s a better way. Let me introduce you to Key-Value Observing. The iPhone SDK provides a method for setting up &#8220;observers&#8221; for certain things currently going on in the system. It just so happens that one of the things that you can &#8220;observe&#8221; is <em>NSUserDefaults</em>. That&#8217;s our ticket!</p>
<p>Somewhere in your Objective-C code (where you might normally set up the <em>NSTimer</em> for polling the <em>NSUserDefaults</em>), place the following code:</p>
<pre>[[NSUserDefaults standardUserDefaults] addObserver:self
   forKeyPath:@"Command" options:0 context:nil];</pre>
<p>Then, create a method like the following:</p>
<pre>- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
   change:(NSDictionary *)change context:(void *)context
{
   // Command parsing code goes here.
}</pre>
<p>The <em>observeValueForKeyPath</em> method is essentially the function you had before that parsed the commands from <em>PlayerPrefs</em>/<em>NSUserDefaults</em>. What the <em>addObserver</em> moethod does is set <em>self</em> to be an observer of <em>NSUserDefaults</em>, meaning that every time you set the <em>PlayerPrefs</em> in Unity script, the <em>observeValueForKeyPath</em> method gets called <strong>immediately!</strong></p>
<p>What this now allows you to do is to set a result key in Objective-C and immediately access it in Unity script. Here&#8217;s an example:</p>
<pre>// Objective-C code
if([[[NSUserDefaults standardUserDefaults] getObjectForKey:@"Command"]
   isEqualToString:@"DoSomething")
{
   // Return a result by setting the key here.
   [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"Result"];
}</pre>
<pre>// Unity C# code
int CallDoSomething()
{
   PlayerPrefs.SetString("Command", "DoSomething");
   // Before, doing something like this would be very bad!
   return PlayerPrefs.GetInt("Result");
}</pre>
<p>As you can see, you can get immediate results from the Objective-C code! Hooray!</p>
<p><strong>Objective-C to Unity (for everyone)</strong></p>
<p>Where Advanced and Basic licensees meet is in the need for having Objective-C code call back to Unity script. There are many instances where you need to capture an event in Objective-C and then pass this off immediately to your Unity scripts so that you can update your game. While using <em>NSUserDefaults</em> to send information back to <em>PlayerPrefs</em> is certainly doable, a polling system would need to be set up in Unity script and it would never be instantaneous.</p>
<p>To get this working, you need to know a little bit about the underlying Unity frameworks. Unity uses a framework called Mono, which is an open-source cross-platform implementation of .NET. When you use something in the System namespace or String.Format, you&#8217;re actually using .NET libraries, and not something Unity-specific. While the actual invocation of the Mono runtime isn&#8217;t visible from inside the Xcode project, that doesn&#8217;t mean we can&#8217;t still have access to the Mono functions.</p>
<p>You can do amazing things with C. You can also do terrible things with C. That&#8217;s why it&#8217;s preferred by so many programmers, as data and memory in C is completely malleable. You can do almost anything with it. Even though we don&#8217;t have access to the Mono header files in the Unity Xcode project, by doing some handy Internet searches, we can get the function prototypes of all of the Mono functions we&#8217;ll need to get what we want.</p>
<p>In addition, many Mono functions require or return special MonoTypes. This would be a problem in C#, but in C a void pointer cures all! For our purposes, here are all of the MonoTypes that we need:</p>
<pre>typedef void* MonoDomain;
typedef void* MonoAssembly;
typedef void* MonoImage;
typedef void* MonoClass;
typedef void* MonoObject;
typedef void* MonoMethodDesc;
typedef void* MonoMethod;
typedef int gboolean;</pre>
<p>To be honest, you don&#8217;t even really have to set up the typedefs, but it makes the function prototypes look cleaner and more readable. Remember, since pointers simply point to memory, they don&#8217;t really need a type.</p>
<p>Now for the function prototypes that we&#8217;ll need. The following is the bare minimum of functions needed to accomplish calling Unity script code from Objective-C. (Remember: You may need to wrap these in <em>extern &#8220;C&#8221; { &#8230; }</em> if you&#8217;re using C++/Objective-C++ due to name mangling.)</p>
<pre>MonoDomain *mono_domain_get();
MonoAssembly *mono_domain_assembly_open(MonoDomain *domain, const char *assemblyName);
MonoImage *mono_assembly_get_image(MonoAssembly *assembly);
MonoMethodDesc *mono_method_desc_new(const char *methodString, gboolean useNamespace);
MonoMethodDesc *mono_method_desc_free(MonoMethodDesc *desc);
MonoMethod *mono_method_desc_search_in_image(MonoMethodDesc *methodDesc, MonoImage *image);
MonoObject *mono_runtime_invoke(MonoMethod *method, void *obj, void **params, MonoObject **exc);</pre>
<p>Here&#8217;s where we need to explain things: We call Unity script functions by using the <em>mono_runtime_invoke</em> function. However, before we can call this, we need to get the <em>MonoMethod</em> (essentially, the pointer to the Unity script function we want to call) from the assembly file that was compiled by Unity when you hit &#8220;Build &amp; Run&#8221;. So how do we get that?</p>
<p>First things first, we need to get the domain where all of the Unity scripts are running. In the vaguest of terms, a domain is kind of a box where scripts are run. So we need to grab the Mono domain first:</p>
<pre>MonoDomain *domain = mono_domain_get();</pre>
<p>Simple enough. We now have the location where all of the Unity scripts are being run. Now to get the MonoMethod, we first need to get a reference to the assembly that contains the function. In your Xcode project, if you look in the Libraries group, you&#8217;ll see a bunch of &#8216;dll.s&#8217; files. These files get compiled by Xcode on Build into DLL files that get placed into your app&#8217;s <em>Data</em> folder. If you don&#8217;t believe me, take your built Unity app, Show Package Contents on it, and then browse around.</p>
<p>Knowing the folder structure of the built application is actually important to this process, as we&#8217;re going to be directly referencing these DLLs for the next step. We need to get the assembly itself so we can read through it and find our functions. Here&#8217;s how to do that:</p>
<pre>NSString *assemblyPath = [[[NSBundle mainBundle] bundlePath]
   stringByAppendingPathComponent:@"Data/Assembly - CSharp.dll"]
MonoAssembly *assembly = mono_domain_assembly_open(domain, path.UTF8String);
MonoImage *image = mono_assembly_get_image(assembly);</pre>
<p>You&#8217;ll notice we put in the path of the built DLL file from the application&#8217;s main bundle. Note that the assembly you&#8217;re looking for might be different for the class method you&#8217;re trying to access. To find out the correct assembly, highlight the script in Unity and go into Debug mode in the Inspector. The Assembly Identifier should tell you the name of the assembly. We then get the assembly from our domain. The MonoImage is something we&#8217;ll need for the next step.</p>
<p>We have our assembly now, and we can start accessing the functions inside it. To do this, we need to tell Mono what functions we&#8217;re looking for. (For ease of use, I&#8217;m only going to be looking for static methods in classes without a namespace. If you want to access specific objects or call non-static methods, I suggest you read up on the official documentation on <a title="Embedding Mono" href="http://www.mono-project.com/Embedding_Mono" target="_blank">Embedding Mono</a>.)</p>
<pre>MonoMethodDesc *desc = mono_method_desc_new("AwesomeClass:AwesomeFunction()", FALSE);
MonoMethod *method = mono_method_desc_search_in_image(desc, image);
mono_method_desc_free(desc);</pre>
<p>Notice that the <em>MonoMethodDesc</em> (literally, MonoMethod Description) is created by giving <em>mono_method_desc_new</em> a string that contains the method that we want to call. Remember to put the class name before the function and follow it with a <strong>colon</strong>, not a period. If you want to access a method with parameters, do something like this:</p>
<pre>"AwesomeClass:AwesomerFunction(int,int,int)"</pre>
<p>Formatting is very important. There shouldn&#8217;t be any spaces between the method parameters. After getting the description, we then search the assembly image for the method. Doing all of this searching could impact performance in your app, so it&#8217;s recommended that you do all of this in an initialization function and store the pointers to the various <em>MonoMethods</em> you want to use. After we have the method pointer, we free the <em>MonoMethodDesc</em> that was created.</p>
<p>Now you have your <em>MonoMethod</em>! And you say you want to call it! We can do that very easily now:</p>
<pre>mono_runtime_invoke(method, NULL, NULL, NULL);</pre>
<p>See? Very simple. If your method had some parameters in it, you need to pass the arguments as a void pointer array to the third parameter of <em>mono_runtime_invoke</em>, like so:</p>
<pre>int param1 = 1;
int param2 = 27;
void *args[] = { &amp;param1, &amp;param2 };

mono_runtime_invoke(method, NULL, args, NULL);</pre>
<p>We are essentially passing the arguments by their address via way of an array.</p>
<p>And that&#8217;s it! There are a few caveats to using this method of invoking Unity script methods: Firstly, it&#8217;s slow. It would not be recommended to call these many times per frame or even once every frame. It&#8217;s primarily good for callbacks that occur every now and then (like for GameKit connection results, etc). Secondly, you&#8217;re putting a lot of trust in the Mono and Unity developers to not change things around too drastically. If you upgrade Unity and your code suddenly stops working, you&#8217;ll need to downgrade to the previous version of Unity or muck around until you can find out what was changed.</p>
<p><strong>Conclusion</strong></p>
<p>Finding all of this out was a long weekend project for me, and it has definitely been worth it. Functionality that I simply didn&#8217;t think was possible without official Unity support is now immediately available, and I am now able to bounce back and forth between Unity script and Objective-C to get access to whatever I need. There are performance issues to consider, but on the whole the flexibility outweighs the potential performance pitfalls. It just requires you to properly plan your app with these things in mind.</p>
<p>Some may read this article and think that the Advanced license is obsolete with these methods. However, I don&#8217;t think that&#8217;s true. The simple fact that Advanced users can use namespaces like <em>System.Runtime.InteropServices</em> and <em>System.Xml</em> are worth it alone, especially when you consider that you can&#8217;t send something as complex as a struct or class through a <em>PlayerPrefs</em> string (I guess you could, but it wouldn&#8217;t be very pretty). This is really just a stopgap measure to allow Basic license users access to some of the native functionality that isn&#8217;t available in Unity yet. The splash screen requirement alone was enough for us to upgrade!</p>
<p>In addition, using the Objective-C to Unity callback functionality is not for the faint of heart, and certainly not for those who aren&#8217;t well-versed in the art of programming. Just be sure to design your games around what you <strong>can</strong> do, not around what you <strong>wish</strong> you could do.</p>
<p>I hope you&#8217;ve found this both educational and useful and that you&#8217;ll consider contributing your own findings to the Unity community.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tinytimgames.com/2010/01/10/the-unityobjective-c-divide/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>What We&#8217;re Working On &#8211; Week of November 9, 2009</title>
		<link>http://www.tinytimgames.com/2009/11/09/what-were-working-on-week-of-november-9-2009/</link>
		<comments>http://www.tinytimgames.com/2009/11/09/what-were-working-on-week-of-november-9-2009/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 02:56:08 +0000</pubDate>
		<dc:creator>Jerrod Putman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Upcoming Projects]]></category>
		<category><![CDATA[What We're Working On]]></category>

		<guid isPermaLink="false">http://www.tinytimgames.com/?p=334</guid>
		<description><![CDATA[Look! A WWWO post that&#8217;s actually on-time! Things must be looking up! And indeed they are here at Tiny Tim Games. We&#8217;ve made a lot of progress in the last week, and I think it&#8217;s safe to say that we&#8217;ll be announcing a new game NEXT WEEK! It&#8217;s very exciting. Read on for more info. [...]]]></description>
			<content:encoded><![CDATA[<p>Look! A WWWO post that&#8217;s actually on-time! Things must be looking up!</p>
<p>And indeed they are here at Tiny Tim Games. We&#8217;ve made a lot of progress in the last week, and I think it&#8217;s safe to say that we&#8217;ll be announcing a new game NEXT WEEK! It&#8217;s very exciting. Read on for more info.</p>
<p><span id="more-334"></span>Things are never set in stone in game development. This again proved itself last week when we got word that if we wanted to get our games in the App Store for the holidays, we needed to have them submitted about a week before we had planned to finish both of our current projects. Knowing that we didn&#8217;t have nearly enough time to finish both in that time frame, we had to choose which we want to focus on now and push to get out for the holidays.</p>
<p>Unfortunately, &#8220;Game 2&#8243; will now become &#8220;Game 3&#8243;. But don&#8217;t worry. By this time next week, you shouldn&#8217;t have to keep track of our next two games via number anymore. Because the project we&#8217;re moving forward with has made some excellent progress in the last week.</p>
<p>We&#8217;ve settled on a name and style for the game, which allowed Shannon to begin creating the HUD and textures for the game. And let me just say that the stuff she&#8217;s doing looks amazing. I&#8217;m excited that we&#8217;ll be able to show a little of it off next week.</p>
<p>Meanwhile, I&#8217;ve been taking our basic gameplay prototype and fleshing out various pieces of it. We have the whole game almost completely mapped out, from main menu to final level to AGON awards (that&#8217;s right, our next game will be AGON-enabled). With the game mapped out like this, it&#8217;s been very easy for me to sit down and program the remaining pieces of our game.</p>
<p>Funnily enough, I&#8217;ve realized that aside from the initial tech and prototype, the remaining pieces of this game are actually less development intensive than Sheepstacker, even though I would argue this game has more variety and depth. Game development is always surprising.</p>
<p>This should be the last post where we have to be annoyingly cryptic about our next project. Thanks for sticking with us, and we hope you like what you see next week.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tinytimgames.com/2009/11/09/what-were-working-on-week-of-november-9-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What We&#8217;re Working On &#8211; Week of November 2, 2009</title>
		<link>http://www.tinytimgames.com/2009/11/04/what-were-working-on-week-of-november-2-2009/</link>
		<comments>http://www.tinytimgames.com/2009/11/04/what-were-working-on-week-of-november-2-2009/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 09:34:13 +0000</pubDate>
		<dc:creator>Jerrod Putman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Upcoming Projects]]></category>
		<category><![CDATA[What We're Working On]]></category>

		<guid isPermaLink="false">http://www.tinytimgames.com/?p=332</guid>
		<description><![CDATA[Last week was a big turning point in the development of both of our upcoming games. We settled on the main interface elements of &#8220;Game 2&#8243;, and we made some important decisions about &#8220;Game 3&#8243; as well. We also set an internal milestone for getting these projects done. As of right now we&#8217;re planning to [...]]]></description>
			<content:encoded><![CDATA[<p>Last week was a big turning point in the development of both of our upcoming games. We settled on the main interface elements of &#8220;Game 2&#8243;, and we made some important decisions about &#8220;Game 3&#8243; as well. We also set an internal milestone for getting these projects done. As of right now we&#8217;re planning to finish both games by the end of November! It&#8217;s an aggressive goal, but I believe we can make it.</p>
<p><span id="more-332"></span>There&#8217;s not much to say about Game 2 at the moment, other than we have enough of the main interface to bring it into the engine and actually test it out. The hope is that we&#8217;ll have something to show of the game next week, even if it&#8217;s just a screenshot. Video would be preferable.</p>
<p>As for Game 3, due to some design concerns, we scaled back on some features that we initially thought were completely necessary. After weighing the options, we realized these features weren&#8217;t necessary to the core gameplay after all. We felt that by focusing on this core gameplay would allow for a better, more polished initial release. If the game is successful, I&#8217;m sure we&#8217;ll be returning to add all of these features later. That&#8217;s the beauty of digital distribution!</p>
<p>The week ahead is going to be a rough one, simply due to how much has to be done. The main interface for Game 2 needs to be finalized so that I can get back to programming the remaining features. And I&#8217;ve got my work cut out for me writing the behaviors for three of Game 3&#8242;s antagonists. Strangely, I seem to have picked the most difficult one to start with. At least the next two will be simpler. Once these are written, we&#8217;ll wire up a few scenarios, and do a fun factor check. If it passes, we&#8217;re going to go all out creating final art to put into the game. I&#8217;d say we&#8217;ll be ready to show a few screens off in about two weeks. Very exciting!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tinytimgames.com/2009/11/04/what-were-working-on-week-of-november-2-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What We&#8217;re Working On &#8211; Week of October 26, 2009</title>
		<link>http://www.tinytimgames.com/2009/10/27/what-were-working-on-week-of-october-26-2009/</link>
		<comments>http://www.tinytimgames.com/2009/10/27/what-were-working-on-week-of-october-26-2009/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 09:27:25 +0000</pubDate>
		<dc:creator>Jerrod Putman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Upcoming Projects]]></category>
		<category><![CDATA[What We're Working On]]></category>

		<guid isPermaLink="false">http://www.tinytimgames.com/?p=329</guid>
		<description><![CDATA[We took a little hiatus last week to do some contract projects, and as such didn&#8217;t get as much progress on our two new games as we might have liked. However, some progress was made in the art department for both games. And for us (not being artists), any sort of art that is complete [...]]]></description>
			<content:encoded><![CDATA[<p>We took a little hiatus last week to do some contract projects, and as such didn&#8217;t get as much progress on our two new games as we might have liked. However, some progress was made in the art department for both games. And for us (not being artists), any sort of art that is complete is a big step.</p>
<p><span id="more-329"></span>For &#8220;Game 2&#8243;, we kicked around a variety of themes for the game. As we created the prototype completely abstractly (meaning, there was no story, concept, or theme in mind when we created it), we wanted to see if we could create a theme that would give the game a little bit of personality, something that we feel is very important to our games. Again, as our handicap is art, we settled on something that doesn&#8217;t quite have the personality of Sheepstacker, but should still be pleasant and fun.</p>
<p>For &#8220;Game 3&#8243;, the bulk of the technology for the game is actually complete. The next step is to bring it all together to create our first playable prototype. Looking forward, this game seems like it will require a lot of small tweaks to get exactly right, as there&#8217;s a balancing act to keep all of the elements of gameplay from overpowering each other. It should be an interesting experiment.</p>
<p>In addition to the technology, I&#8217;ve successfully modeled, unwrapped, and rigged all of the characters we&#8217;ll need for the game! The models themselves are very simple as we want to get as many of these guys on screen as possible. The biggest problem was keeping the vertex numbers down. With low vert numbers, Unity (our engine) will be able to batch the drawing of nearly all of our characters. This will greatly help performance, which is something we&#8217;re going to need help with since we want to have oodles of skinned and animated characters on screen.</p>
<p>The next steps for us are pretty clear: For Game 2, Shannon will continue creating mock-ups of our user interface and gameplay screens. Since the bulk of the gameplay programming is actually finished for that game, I&#8217;ll be focusing on assembling the different components for Game 3 to create a playable prototype. In addition, I&#8217;ll probably coax Shannon into creating some textures for our characters.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tinytimgames.com/2009/10/27/what-were-working-on-week-of-october-26-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What We&#8217;re Working On &#8211; Week of October 12, 2009</title>
		<link>http://www.tinytimgames.com/2009/10/14/what-were-working-on-week-of-october-12-2009/</link>
		<comments>http://www.tinytimgames.com/2009/10/14/what-were-working-on-week-of-october-12-2009/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 12:01:32 +0000</pubDate>
		<dc:creator>Jerrod Putman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Upcoming Projects]]></category>
		<category><![CDATA[What We're Working On]]></category>

		<guid isPermaLink="false">http://www.tinytimgames.com/?p=326</guid>
		<description><![CDATA[Another long time since our last post, however we&#8217;ve been pretty busy here at Tiny Tim. We&#8217;ve finished up a few programming projects that we&#8217;ve been working on for other developers (more about those later), and we did a lot of soul searching on our next game project, myself particularly so. The project I&#8217;ve mentioned [...]]]></description>
			<content:encoded><![CDATA[<p>Another long time since our last post, however we&#8217;ve been pretty busy here at Tiny Tim. We&#8217;ve finished up a few programming projects that we&#8217;ve been working on for other developers (more about those later), and we did a lot of soul searching on our next game project, myself particularly so.</p>
<p><span id="more-326"></span>The project I&#8217;ve mentioned in previous posts has been giving us some grief lately. Whether it&#8217;s the looming giant-ness of the project or worries of lack of innovation in gameplay, there have been lots of roadblocks keeping us from real progress on the game (which will henceforth be known as &#8220;The Big Project&#8221;). We&#8217;ve basically been trying to make this game since Sheepstacker, even though we&#8217;ve gone through lots of very different prototypes that hardly look like the same game. Yet they&#8217;ve all had something in common&#8230; they were big. Or at least big for a two person team to accomplish.</p>
<p>So with release seeming further away than ever, we took a step back and began rethinking our development strategy. After many days (weeks?) of back and forth, we&#8217;ve finally figured out what we&#8217;re going to do! We&#8217;re putting the Big Project on partial hold for the moment (&#8220;partial&#8221; meaning that if inspiration strikes, we&#8217;ll work on it), and in its place we&#8217;ll be working on two (yes, TWO) other projects in tandem.</p>
<p>These two projects will be smaller in hopes of actually finishing them in a reasonable time frame. Since they&#8217;re small, though, the gameplay needs to be: 1) very fun, 2) engaging, and 3) completely addicting. We&#8217;ve already completed the prototype for one of the games, and after a little focus testing we feel we&#8217;ve definitely got something that fits all of those criteria. The second prototype is underway but isn&#8217;t fully playable yet. Still, we&#8217;re really excited about the idea (both the gameplay and the theme). It&#8217;s certainly a lot of fun in my head!</p>
<p>I&#8217;ll have more information about these two games next week. As they&#8217;re smaller games, we&#8217;ll be able to reveal more about them sooner instead of sort of talking about them in code here on the site. Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tinytimgames.com/2009/10/14/what-were-working-on-week-of-october-12-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What We&#8217;re Working On &#8211; Week of September 7, 2009</title>
		<link>http://www.tinytimgames.com/2009/09/09/what-were-working-on-week-of-september-7-2009/</link>
		<comments>http://www.tinytimgames.com/2009/09/09/what-were-working-on-week-of-september-7-2009/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 05:29:58 +0000</pubDate>
		<dc:creator>Jerrod Putman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Upcoming Projects]]></category>
		<category><![CDATA[What We're Working On]]></category>

		<guid isPermaLink="false">http://www.tinytimgames.com/?p=318</guid>
		<description><![CDATA[Last week was an incredibly busy week for us, though we didn&#8217;t make quite as much progress as we were hoping. We finished our main characters, though they still need a bit of tweaking. They&#8217;re also going to need some animations, but we&#8217;ll be getting to that soon. I got back to programming earlier this [...]]]></description>
			<content:encoded><![CDATA[<p>Last week was an incredibly busy week for us, though we didn&#8217;t make quite as much progress as we were hoping. We finished our main characters, though they still need a bit of tweaking. They&#8217;re also going to need some animations, but we&#8217;ll be getting to that soon.</p>
<p><span id="more-318"></span>I got back to programming earlier this week, which was very nice after two weeks straight of modeling, rigging, and unwrapping UVs. During the previous two weeks, we made some core gameplay design changes to better fit the characters that we created, so when I got back to programming there was a fair amount of work to be done. However, the work has been extremely enjoyable. Things are starting to meld now and actually feel like we can finish this thing!</p>
<p>Shannon will be continuing to touch up the textures on our main characters. She&#8217;ll also be texturing all of our environments as well. I&#8217;m looking forward to having something more than a gray background to look at for once! I think that&#8217;s when it&#8217;ll really feel like we&#8217;ve got a game.</p>
<p>We bought ourselves a second-generation iPod touch last week so we could have an actual working iPhone OS 2.2.1 device in-house. You may remember that we <a title="Oops!" href="http://www.tinytimgames.com/2009/07/06/sheepstacker-12-issue-on-221-and-earlier-devices/" target="_blank">flubbed up</a> one of our Sheepstacker updates for 2.x people. We&#8217;d rather not make that mistake again. That brings our current development hardware to: two iPhone 3GSs, two original iPhones, and one iPod touch (along with the devices we finagle from family and friends).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tinytimgames.com/2009/09/09/what-were-working-on-week-of-september-7-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What We&#8217;re Working On &#8211; Week of August 31, 2009</title>
		<link>http://www.tinytimgames.com/2009/09/01/what-were-working-on-week-of-august-31-2009/</link>
		<comments>http://www.tinytimgames.com/2009/09/01/what-were-working-on-week-of-august-31-2009/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 01:27:11 +0000</pubDate>
		<dc:creator>Jerrod Putman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Upcoming Projects]]></category>
		<category><![CDATA[What We're Working On]]></category>

		<guid isPermaLink="false">http://www.tinytimgames.com/?p=314</guid>
		<description><![CDATA[Another week, another installment of What We&#8217;re Working On. Last week, we were knee-deep in modeling and rigging our four main characters. We were mostly successful in that we have completely modeled and rigged three of them. That fourth one will come once we discuss the character design a bit more (as I mentioned in [...]]]></description>
			<content:encoded><![CDATA[<p>Another week, another installment of <em>What We&#8217;re Working On</em>. Last week, we were knee-deep in modeling and rigging our four main characters. We were mostly successful in that we have completely modeled and rigged three of them. That fourth one will come once we discuss the character design a bit more (as I mentioned in my previous post, we mostly just wing it on all of this stuff).</p>
<p><span id="more-314"></span>My modeling talents were definitely put to the test this last week. As a person who has a bit of an artistic thought process but no actual artistic skill, it was a bit of a bumpy ride. With these characters being my first humanoid models, I had a lot of learning to do. I input each individual vertex by hand on my first human head. Vowing to never do that again, I began using cylinders and various tools in <a title="Cheetah 3D" href="http://www.cheetah3d.com" target="_blank">Cheetah</a> (like the scalpel and weld tools) to do the brunt of the work for me.</p>
<p>The plan was to pass off the models to Shannon so she could rig them. However, as she had never done rigging before, and I hadn&#8217;t done rigging on anything that needed vertex weights that weren&#8217;t 100% all the way, the two of us weren&#8217;t prepared for the complexities of rigging a humanoid character.</p>
<p>Whereas the sheep in Sheepstacker were composed of completely separate moving parts, humanoid characters have skin that has to stretch around the arm and leg joints. This was the most difficult part to get right. Since I had more rigging experience, I took over the initial rigging job for our first character, and played around with it until I got it right&#8230; well, mostly right. There&#8217;s still a bit of pinching in some areas, but we&#8217;ll try to cover it up as best we can.</p>
<p>I also did a full UV unwrap of one of our characters. Again, the complexity level versus our experience level was the holdup here, but I think things worked out decently. I&#8217;m passing along my knowledge to Shannon so she can complete the rest of the characters while I start working on our fourth and final main character.</p>
<p>We went through a few more iterations of our logo design. We&#8217;re getting closer to having a design I feel we can call final. I haven&#8217;t been doing very much programming in the last week, though I did speak with my good friend Nathan Fouts over at <a title="Mommy's Best Games" href="http://www.mommysbestgames.com" target="_blank">Mommy&#8217;s Best Games</a> about some technical points that we&#8217;ll be facing soon.</p>
<p>Friday was also <a title="Snow Leopard" href="http://www.apple.com/macosx/" target="_blank">Snow Leopard</a> Upgrade Day! I&#8217;m a bit impulsive when it comes to OS updates, so it probably would&#8217;ve been better for me to wait to upgrade until a few more kinks with some of the apps we use were worked out, but I just couldn&#8217;t resist.</p>
<p>One app that we had just started using to keep the project synced across our machines (since <a title="Unity" href="http://www.unity3d.com" target="_blank">Unity</a> doesn&#8217;t play nice with <a title="Subversion" href="http://subversion.tigris.org/" target="_blank">SVN</a> or <a title="Git" href="http://git-scm.com/" target="_blank">Git</a>) was <a title="Windows Live Sync" href="http://sync.live.com" target="_blank">Windows Live Sync</a>, which up until the Snow Leopard upgrade worked just fine. Having gotten used to having the project auto-sync on our machines, we needed the functionality back ASAP. Since the Live Sync team has been quiet on when they&#8217;ll actually fix the issue, I went looking for an alternative. Luckily, we found <a title="Dropbox" href="https://www.getdropbox.com/referrals/NTE4ODg5MDQ5" target="_blank">Dropbox</a>, which not only does the sync functionality we needed, but also backs up our project files online, and it works on Snow Leopard. <a title="With win-win-win, we all win." href="http://www.tv.com/the-office/conflict-resolution/episode/631894/summary.html" target="_blank">Win-win-win</a>.</p>
<p>So we&#8217;ve got a bit more character modeling and rigging to do and lots of texturing. After that, it&#8217;s character animations and the creation of our very first complete level. Very exciting stuff.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tinytimgames.com/2009/09/01/what-were-working-on-week-of-august-31-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What We&#8217;re Working On &#8211; Week of August 24, 2009</title>
		<link>http://www.tinytimgames.com/2009/08/25/what-were-working-on-week-of-august-24-2009/</link>
		<comments>http://www.tinytimgames.com/2009/08/25/what-were-working-on-week-of-august-24-2009/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 06:00:12 +0000</pubDate>
		<dc:creator>Jerrod Putman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Upcoming Projects]]></category>
		<category><![CDATA[What We're Working On]]></category>

		<guid isPermaLink="false">http://www.tinytimgames.com/?p=310</guid>
		<description><![CDATA[I&#8217;ve been lax in posting a new installment of &#8220;What We&#8217;re Working On&#8221; for the past two weeks. However, I have a good excuse: We&#8217;ve been incredibly busy! We have officially decided upon a name for our upcoming game, and we even have a logo to boot. We can&#8217;t reveal it yet as we still [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been lax in posting a new installment of &#8220;What We&#8217;re Working On&#8221; for the past two weeks. However, I have a good excuse: We&#8217;ve been incredibly busy!</p>
<p>We have officially decided upon a name for our upcoming game, and we even have a logo to boot. We can&#8217;t reveal it yet as we still want a few more things finished before we reveal the game to the world. Things are starting to come together though. It&#8217;s really exciting!</p>
<p><span id="more-310"></span></p>
<p>I began prototyping various enemies, their behaviors and movements. In addition, I also began modeling some of the enemies for our first level. In fact, except for one or two, we have all of our enemies modeled, textured, and ready to go for the first level. After putting the finished guys into the level, it finally started to feel like a game.</p>
<p>Along with enemies, I also began modeling our main characters. These are the characters you&#8217;ll be controlling when you play the game. As of today, I&#8217;ve completed two models, and have two more to go. So that should give you a hint of how many characters we&#8217;re going for. I had to really stretch my modeling skills to get these characters made, but I think they turned out fairly well.</p>
<p>Shannon was in charge of texturing all of our enemies, and she&#8217;ll begin rigging our main characters for animation tonight. She&#8217;ll be texturing them as well, but we&#8217;re running into issues with UV seams giving Unity a hard time. For some reason our models are showing nearly 5 times the number of vertices in Unity as they are in Cheetah. So until we figure that problem out, our main characters will remain untextured for a while longer.</p>
<p>Shannon and I also sat down and did a bit of a brainstorming session for the game. We discussed various aspects of the game, including bad guy names and additional levels. As you can see, we&#8217;re not really working off of a set design document. We&#8217;ve found we&#8217;re more creative coming up with things as we go along. Plus this leaves us open to change course quickly if necessary. While I wouldn&#8217;t recommend doing this for a large game, when you&#8217;re making smaller iPhone games, it really helps the creative process.</p>
<p>We&#8217;re hoping to have made enough progress on the game that we&#8217;ll be able to show off some of it in the next two weeks.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tinytimgames.com/2009/08/25/what-were-working-on-week-of-august-24-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What We&#8217;re Working On &#8211; Week of August 3, 2009</title>
		<link>http://www.tinytimgames.com/2009/08/04/what-were-working-on-week-of-august-3-2009/</link>
		<comments>http://www.tinytimgames.com/2009/08/04/what-were-working-on-week-of-august-3-2009/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 04:59:31 +0000</pubDate>
		<dc:creator>Jerrod Putman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Upcoming Projects]]></category>
		<category><![CDATA[What We're Working On]]></category>

		<guid isPermaLink="false">http://www.tinytimgames.com/?p=306</guid>
		<description><![CDATA[Welcome to another thrilling edition of &#8220;What We&#8217;re Working On&#8221;. Not much new to report this week. I finished up our new game&#8217;s event and wave management system which allows us to quickly add and arrange game events (i.e., enemy waves, cutscenes, or even level loads). With that working great, I&#8217;m unfortunately having a hard [...]]]></description>
			<content:encoded><![CDATA[<p>Welcome to another thrilling edition of &#8220;What We&#8217;re Working On&#8221;. Not much new to report this week. I finished up our new game&#8217;s event and wave management system which allows us to quickly add and arrange game events (i.e., enemy waves, cutscenes, or even level loads). With that working great, I&#8217;m unfortunately having a hard time prototyping interesting enemies. Unfortunately, for this particular game, it&#8217;s not just quality but also quantity. Oh well, I&#8217;m sure it will come to me.</p>
<p>Shannon is continuing her Cheetah 3D lessons, and seems to be grasping it quite well. She learning a lot of techniques that we&#8217;ll be desperately needing for this game, with some of those techniques being some that we could&#8217;ve used on Sheepstacker (if I would&#8217;ve known how to do it in Blender).</p>
<p>We&#8217;re looking to start brainstorming character, enemy, and level designs shortly, hopefully by the beginning of next week. That&#8217;s going to be an exciting time, as we&#8217;ll soon be able to actually show a little bit of the game.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tinytimgames.com/2009/08/04/what-were-working-on-week-of-august-3-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What We&#8217;re Working On &#8211; Week of July 27, 2009</title>
		<link>http://www.tinytimgames.com/2009/07/29/what-were-working-on-week-of-july-27-2009/</link>
		<comments>http://www.tinytimgames.com/2009/07/29/what-were-working-on-week-of-july-27-2009/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 08:34:11 +0000</pubDate>
		<dc:creator>Jerrod Putman</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[What We're Working On]]></category>

		<guid isPermaLink="false">http://www.tinytimgames.com/?p=296</guid>
		<description><![CDATA[I&#8217;ve decided to start a new segment on the site that details a bit more of what we do around here at Tiny Tim Games. We&#8217;ve had an immense amount of help from reading the stories from other indie iPhone game developers (like NimbleBit, Retro Dreamer, and Majic Jungle), and we&#8217;d like to share our [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve decided to start a new segment on the site that details a bit more of what we do around here at Tiny Tim Games. We&#8217;ve had an immense amount of help from reading the stories from other indie iPhone game developers (like <a title="NimbleBit" href="http://www.nimblebit.com" target="_blank">NimbleBit</a>, <a title="Retro Dreamer" href="http://www.retrodreamer.com" target="_blank">Retro Dreamer</a>, and <a title="Majic Jungle" href="http://www.majicjungle.com" target="_blank">Majic Jungle</a>), and we&#8217;d like to share our own experiences in hopes of being helpful to the indie iPhone development community (or at least to be entertaining).</p>
<p><span id="more-296"></span></p>
<p>First off, we submitted a quick update to Sheepstacker over this past weekend. We updated the AGON Online libraries (which now include Twitter support &#8211; yay!), and we built the game with a new version of the Unity engine, so it should be faster, better, stronger.</p>
<p>I&#8217;ve been continuing work on a prototype for our (hopefully) next game. It took a long time to settle on a design that: 1) wasn&#8217;t overly ambitious for a team of two working from a home office; and 2) wasn&#8217;t a complete dull-fest. We&#8217;re the picture of iterative design simply due to the number of projects that we started and threw out. One project was even in development for a full month before we finally decided to cut our losses (don&#8217;t worry, it wasn&#8217;t very fun anyways).</p>
<p>This particular prototype has only been in development for a little over a week, but the little bit that I have running seems to be fun, accessible, and not a 40-hour long RPG (you&#8217;d be surprised how important that is to an indie developer). We&#8217;re sticking with the &#8220;pick up and play&#8221; mentality of our earlier game <a title="Sheepstacker" href="/games/sheepstacker" target="_blank">Sheepstacker</a>, but with more &#8220;hardcore gamer&#8221; sensibilities.</p>
<p>In particular, I&#8217;ve been focusing on the controls for the game, and I think we&#8217;ve landed on something really awesome. &#8220;Easy to learn, hard to master&#8221; sort of stuff. I&#8217;ve also been working on getting a wave management system up and running so that we can have all sorts of enemies do all sorts of things without pulling our hair out trying to put them all into the game.</p>
<p>Meanwhile, Shannon has been learning a bit of 3D modeling. On Sheepstacker, I was the primary modeler while Shannon did all of the texture and image works. However, when you start making a game that&#8217;s a little more complex than just &#8220;drop some sheep&#8221;, you start running out of time to do things other than programming. So she&#8217;s stepping up and taking on that primary role for this project.</p>
<p>We&#8217;ve decided to switch 3D packages from <a title="Blender" href="http://www.blender.org" target="_blank">Blender</a> to <a title="Cheetah 3D" href="http://www.cheetah3d.com" target="_blank">Cheetah 3D</a>. While I cut my teeth on Blender and like how quickly you can make stuff in it (once you&#8217;ve learned all of the shortcuts), it&#8217;s extremely complex for someone just learning 3D to jump into, and it has more than a few issues when importing into <a title="Unity engine" href="http://www.unity3d.com" target="_blank">Unity</a>. Cheetah meanwhile has a simple interface, imports into Unity perfectly, and has all of the features that Blender has (at least for Unity game development).</p>
<p>That&#8217;s all for this week. Next up on the agenda: I program lots of stuff to shoot at, while Shannon draws lots of stuff to shoot at.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tinytimgames.com/2009/07/29/what-were-working-on-week-of-july-27-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
