<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-33731376</id><updated>2012-01-17T15:08:36.329-08:00</updated><category term='IPhone'/><category term='Lunch Prodigy'/><category term='HyperGlider'/><category term='sound'/><category term='SoundToy'/><category term='Software Prodigy'/><category term='Objective-C'/><category term='Mac'/><category term='Unity'/><category term='boot camp'/><category term='iPad'/><category term='Buttonia'/><category term='Windows7'/><category term='Property Prodigy'/><category term='opengl ES'/><category term='XCode'/><title type='text'>Software Prodigy</title><subtitle type='html'>This is the blog for www.SoftwareProdigy.com. Here you will find any updates done to our projects or future projects. Feel free to leave any comments.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>90</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-33731376.post-8098290113515948603</id><published>2010-10-24T11:49:00.000-07:00</published><updated>2010-10-24T11:55:50.715-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='HyperGlider'/><title type='text'>Too Busy</title><content type='html'>I've been too busy with my full time job (lecturing at &lt;a href="http://www.stmartins.edu"&gt;St.Martin's Institute of I.T.&lt;/a&gt;) that I didn't progress anywhere with the balancing of the weapons.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I will probably rescale down the project into just a shooter without any storyline for the time being. Then we see how it will be received by the public and guide the project accordingly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The major problem I'm seeing is that I had envisioned the big screen of the ipad to be a big plus when navigating and directing the shit with the accelerometer, however people get their forearms tired quite quickly. I had introduced the touch-joystick as well, but it's not the same feeling.  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8098290113515948603?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8098290113515948603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8098290113515948603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8098290113515948603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8098290113515948603'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/10/too-busy.html' title='Too Busy'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-326792140495452366</id><published>2010-09-27T01:53:00.000-07:00</published><updated>2010-09-27T02:08:15.223-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unity'/><category scheme='http://www.blogger.com/atom/ns#' term='HyperGlider'/><title type='text'>New weapons done but not balanced yet</title><content type='html'>So this week I have added the ray-gun (previously I was referring to it as the BFG, but decided that the ray-gun has more potential) and also the missiles.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The ray-gun fires for a couple of seconds and you just point it to your enemies and damage would be given to the enemies. I have to tweak the recharge time and how much it stays on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The missile will follow an enemy if you lock on to him. Right now it will lock immediately. Maybe I will add a couple of seconds before it locks. I will also need to make it more obvious that it locked on the enemy. Again I need to tweak the recharge time and also have a limit of missiles and add pickups for missiles.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have added something which wasn't in the sprint... Actually three things. A crazy boss level where you have to chase an enemy and an alien structure made of smaller pieces that follows you. Still need to balance everything but it's looking good. The other thing is customizing the controls and placing the buttons wherever the user wants, although on a grid. And the last thing is to optionally seeing your vehicle, ala AfterBurner, but I need to add collision with it now.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have noticed a slow down since I added more HUD stuff. I'm already using SpriteManager, but something is slowing down the framerate and narrowed it down to the HUD. It's not number of draw calls though. I will need to investigate more. If the worse comes to the worse, I will add an option for less details. It didn't effect the framerate on the iPad though.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I wanted to push out this sprint's prototype to the user but it doesn't feel right yet. So I will push it later during the week when I have sometime in the evenings.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What's next?&lt;/div&gt;&lt;div&gt;Balancing&lt;/div&gt;&lt;div&gt;Collider for your visible ship with checks for camera not penetrating objects&lt;/div&gt;&lt;div&gt;performance tweak&lt;/div&gt;&lt;div&gt;minor bugs with ray and missiles&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-326792140495452366?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/326792140495452366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=326792140495452366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/326792140495452366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/326792140495452366'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/09/new-weapons-done-but-not-balanced-yet.html' title='New weapons done but not balanced yet'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-4153608609974367925</id><published>2010-09-19T12:13:00.000-07:00</published><updated>2010-09-19T12:29:37.274-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HyperGlider'/><title type='text'>Next sprint</title><content type='html'>I have redone the tutorial level. We'll see how it goes from the feedback this week.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Touch (Joystick) control system is in place. I don't like it much, even because the game is now easier IMO. I prefer the Tilt control mechanism.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have also done a survival mode level. I noticed that people just wanted to shoot down stuff. So I added that even if it wasn't planned.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also met with an old friend of mine, who is going to have a go creating some 3d models. Cool.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So my next chunk of energies will be dedicated to&lt;/div&gt;&lt;div&gt;- adding pickups&lt;/div&gt;&lt;div&gt;- BFG which will give a short burst of energy after it charges&lt;/div&gt;&lt;div&gt;- Missiles where you have to lock on to an enemy and then fire away&lt;/div&gt;&lt;div&gt;- Adding the above to survival mode&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-4153608609974367925?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/4153608609974367925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=4153608609974367925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4153608609974367925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4153608609974367925'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/09/next-sprint.html' title='Next sprint'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-1523098261047235280</id><published>2010-09-13T06:30:00.000-07:00</published><updated>2010-09-12T21:51:51.001-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unity'/><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Using SpriteManager for Unity iPhone HUD/UI</title><content type='html'>The problem is the usual... having a draw call for each GUITexture that you put on screen. Of course there is SpriteManager to put all sprites into one mesh, and thus one draw call. Here is how I used it.&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;SpriteManager&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Create a an empty GameObject and drag the SpriteManager script to it. Call the GameObject SpriteManager as well. Set the texture to point to your sprite sheet material and set the alloc block size to say 100. Also change it to CW from CCW.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Create a layer for the UI and make put the SpriteManager object in the UI layer.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Creating a Sprite Sheet&lt;/span&gt;&lt;/div&gt;&lt;div&gt;To create the sprite sheet I used Sprite Sheet Packer (only for Windows though), which given a set of images will generate for you the sprite sheet and also a text file containing the sprite sheet map which can be easily parsed. Each line of this text file will have imagename = x y width height.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I created the following sprite sheet map parser which returns a hashtable of the sprite's uv coordinates and dimensions indexed by the original image name&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using UnityEngine;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System;&lt;br /&gt;using System.IO;&lt;br /&gt;&lt;br /&gt;public class SpriteSheetMapParser : MonoBehaviour&lt;br /&gt;{&lt;br /&gt;public static Hashtable parse(string filename)&lt;br /&gt;{&lt;br /&gt;Hashtable h = new Hashtable();&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;// Create an instance of StreamReader to read from a file.&lt;br /&gt;// The using statement also closes the StreamReader.&lt;br /&gt;using (StreamReader sr = new StreamReader(Application.dataPath + filename))&lt;br /&gt;{&lt;br /&gt; String line;&lt;br /&gt; // Read and display lines from the file until the end of&lt;br /&gt; // the file is reached.&lt;br /&gt; while ((line = sr.ReadLine()) != null)&lt;br /&gt; {&lt;br /&gt;     int equalsIndex = line.IndexOf ('=');&lt;br /&gt;//get the image name&lt;br /&gt;     string name = line.Substring(0, equalsIndex).Trim();&lt;br /&gt;//and the uv coordinates and width height&lt;br /&gt;string[] dimensions = line.Substring(equalsIndex+1).Trim().Split(' ');&lt;br /&gt;Rect r = new Rect(int.Parse(dimensions[0]),&lt;br /&gt;    int.Parse(dimensions[1]),&lt;br /&gt;    int.Parse(dimensions[2]),&lt;br /&gt;    int.Parse(dimensions[3]));&lt;br /&gt;//print(name+"&gt;&gt;&gt;"+r);&lt;br /&gt;h[name] = r;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch (Exception e)&lt;br /&gt;{&lt;br /&gt;// Let the user know what went wrong.&lt;br /&gt;print("The file could not be read:");&lt;br /&gt;print(e.Message);&lt;br /&gt;}&lt;br /&gt;return h;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;The next thing was creating a singleton base class to be used by any sprite sheets you are going to use, as you may be using multiple sprite sheets. So each sprite sheet you would want to access would be another class extending this base class.&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using System.Collections;&lt;br /&gt;&lt;br /&gt;public class SpriteSheetSingletonBase  {&lt;br /&gt;&lt;br /&gt;private Hashtable spriteSheetMap;&lt;br /&gt;&lt;br /&gt;protected SpriteSheetSingletonBase (string spriteSheetMapPath)&lt;br /&gt;{&lt;br /&gt;spriteSheetMap = SpriteSheetMapParser.parse(spriteSheetMapPath);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Hashtable SpriteSheetMap&lt;br /&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;return spriteSheetMap;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the sprite sheet used by the HUD I simply created this singleton&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using UnityEngine;&lt;br /&gt;using System.Collections;&lt;br /&gt;&lt;br /&gt;public class SpriteSheetHUD : SpriteSheetSingletonBase{&lt;br /&gt;&lt;br /&gt;private static SpriteSheetSingletonBase instance;&lt;br /&gt;&lt;br /&gt;private SpriteSheetHUD () : base("/Textures/spritesheet.txt")&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static SpriteSheetSingletonBase Instance&lt;br /&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;   if (instance == null)&lt;br /&gt;   {&lt;br /&gt;       instance = new SpriteSheetHUD();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return instance;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;I created the parser class with just one static method that extends MonoBehaviour due to print mainly. I didn't want he sprite sheet singletons to extend MonoBehaviour and have extra baggage. I wanted the singletons to be plain old objects.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;SpriteBase class&lt;/span&gt;&lt;br /&gt;&lt;div&gt;Next was creating a sprite base class which would be linked with any transform (empty gameobject) that would require some sprite to be drawn at that position. You then just need to specify the name of the sprite in your sprite sheet map. You also need to link the sprite manager object in your editor with the script, as you may have multiple sprite managers as well. Of course you can create a script which extends the SpriteBase class to animate the object etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-Bme_EOsh_o/TI2syDDfzRI/AAAAAAAAAU4/FEskMBUnRC4/s1600/Sprite+Settings.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 288px;" src="http://3.bp.blogspot.com/_-Bme_EOsh_o/TI2syDDfzRI/AAAAAAAAAU4/FEskMBUnRC4/s320/Sprite+Settings.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5516255094412135698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using UnityEngine;&lt;br /&gt;using System.Collections;&lt;br /&gt;&lt;br /&gt;public class SpriteBase : MonoBehaviour {&lt;br /&gt;&lt;br /&gt;public SpriteManager spriteManager;&lt;br /&gt;protected Sprite sprite;&lt;br /&gt;&lt;br /&gt;public int width = 10;&lt;br /&gt;public int height = 10;&lt;br /&gt;public string spriteName;&lt;br /&gt;public Color color = Color.white;&lt;br /&gt;private Color oldColor = Color.white;&lt;br /&gt;&lt;br /&gt;// Use this for initialization&lt;br /&gt;void Start () {&lt;br /&gt;Rect dimensions = (Rect)SpriteSheetHUD.Instance.SpriteSheetMap[spriteName];&lt;br /&gt;sprite = spriteManager.AddSprite(gameObject, width, height,&lt;br /&gt; (int)dimensions.x, (int)(dimensions.y+dimensions.height),&lt;br /&gt; (int)dimensions.width, (int)dimensions.height,&lt;br /&gt; false);&lt;br /&gt;sprite.SetColor(color);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Update is called once per frame&lt;br /&gt;void Update () {&lt;br /&gt;if (color != oldColor)&lt;br /&gt;{&lt;br /&gt;sprite.SetColor(color);&lt;br /&gt;oldColor = color;&lt;br /&gt;}&lt;br /&gt;// transform.position = transform.position + new Vector3(1,0,0);&lt;br /&gt;// sm.Transform(s);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void RemoveSprite() {&lt;br /&gt;print("spritemanager should be removing sprite");&lt;br /&gt;spriteManager.RemoveSprite(sprite);&lt;br /&gt;sprite = null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void HideSprite() {&lt;br /&gt;spriteManager.HideSprite(sprite);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void ShowSprite() {&lt;br /&gt;spriteManager.ShowSprite(sprite);&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Setting up a UI Camera&lt;/span&gt;&lt;div&gt;Create a new camera, call it UI Camera. Set the culling to just the UI Layer, so first select nothing, and then select the UI.&lt;/div&gt;&lt;div&gt;From the main Camera you will have to remove the UI layer too, so go the main camera and from the culling just unselect the UI layer.&lt;/div&gt;&lt;div&gt;Set the depth the UI Camera to 1 so it is rendered after the main camera.&lt;/div&gt;&lt;div&gt;Also change it to orthographic. I also pushed it to some negative value, e.g. -7 in the z direction.&lt;/div&gt;&lt;div&gt;I changed the size to 160 on an iPhone display, so the size of sprites that I give when creating them, maps to the rendered size on the screen. That 160 is actually the screen height/2. If you are developing for iPad and Retina displays you would need to do something like this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;camera.orthographicSize = Screen.height/2;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I put that in the camera's script Update() although it should be in the Start() however in the editor the Screen.height wouldn't have been changed on starting up, if the window is set to iPad and Maximize on Play.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-Bme_EOsh_o/TI2tkKkUGAI/AAAAAAAAAVA/B-eHo0ywvsA/s1600/UI+Camera+Settings.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 211px; height: 320px;" src="http://4.bp.blogspot.com/_-Bme_EOsh_o/TI2tkKkUGAI/AAAAAAAAAVA/B-eHo0ywvsA/s320/UI+Camera+Settings.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5516255955422287874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;That should be it. Enjoy. Coming up next is how to do a radar.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-1523098261047235280?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/1523098261047235280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=1523098261047235280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1523098261047235280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1523098261047235280'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/09/using-spritemanager-for-unity-iphone.html' title='Using SpriteManager for Unity iPhone HUD/UI'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-Bme_EOsh_o/TI2syDDfzRI/AAAAAAAAAU4/FEskMBUnRC4/s72-c/Sprite+Settings.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-4900823689329712964</id><published>2010-09-12T22:13:00.000-07:00</published><updated>2010-09-12T22:26:45.461-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='HyperGlider'/><title type='text'>Last sprint was hijacked :)</title><content type='html'>The last sprint was completely changed. Some valuable feedback was coming in and I found it more important to address them rather than the features in the last sprint.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I implemented an auto locking system. It's now very easy to shoot down enemies IMO. I will probably put that on for Easy mode (whenever I implement difficulties that is)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I introduced a tutorial level instead. Still needs a lot of rework. In fact I got some more feedback on this too. The tutorial should be really small. The next iteration, the tutorial should be incorporated into a level and shooting should be very early in the tutorial. Navigation is not the fun part of the game but shooting is.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also I should add a touch control system ASAP since I got some complaints, especially when playing on an iPad, that they get tired. Wimps! :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So my next iteration will basically be&lt;/div&gt;&lt;div&gt;- get tutorial level right&lt;/div&gt;&lt;div&gt;- touch controls&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-4900823689329712964?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/4900823689329712964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=4900823689329712964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4900823689329712964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4900823689329712964'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/09/last-sprint-was-hijacked.html' title='Last sprint was hijacked :)'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6036252970997585374</id><published>2010-09-06T01:19:00.000-07:00</published><updated>2010-09-06T01:25:45.585-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='HyperGlider'/><title type='text'>Next HyperGlider sprint... BFG, Missiles, Overshield + gameplay tweaks</title><content type='html'>I'm releasing the first prototype to my close friends to play test it a bit. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I encountered a couple of problems, namely the framerate drop due to draw call for each sprite. So I started using SpriteManager for the HUD. I also implemented properly the radar. I will be posting a separate post on that. I also introduced an simple intro, where a draft comic strip is displayed and then a dialog is presented. All the graphics are drafts and will probably not make in the final version&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While I will be waiting for some feedback I will be working on the next stuff:&lt;/div&gt;&lt;div&gt;- BFG... a huge blast that needs to recharge&lt;/div&gt;&lt;div&gt;- Missiles... lock on an enemy and shoot away&lt;/div&gt;&lt;div&gt;- Overshield... you can boost and blast into enemies&lt;/div&gt;&lt;div&gt;- tweak the gameplay to make it highly action packed&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6036252970997585374?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6036252970997585374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6036252970997585374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6036252970997585374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6036252970997585374'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/09/next-hyperglider-sprint-bfg-missiles.html' title='Next HyperGlider sprint... BFG, Missiles, Overshield + gameplay tweaks'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-1675609251958189601</id><published>2010-08-29T13:14:00.000-07:00</published><updated>2010-08-29T13:17:50.624-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HyperGlider'/><title type='text'>Prototype available to friends soon</title><content type='html'>&lt;div&gt;Ok so I bought Unity iPhone License, and added the enemies and made them shoot. However I didn't bother with optimizing the draw calls just yet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instead I concentrated on adding the fun elements in the game. I improved the sensation of speed by adding a stretched particle system just in front of the player's camera and I enable emitting only when the player is boosting. I also added the rotation of mothership to align firing the planet off the face of the universe. The player can now go inside the cannon and drop the nuke. He cannot enter the cannon until the mothership finishes aligning, after which the cannon's shaft opens. This may change later on when I tweak the gameplay.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I encountered some problems such as the turret's gun's rotation to shoot at you got screwed after the mothership changes orientation. I thought it was trivial to solve, but after wasting a couple of hours I pushed the task down in my priority list. I also wasted precious time trying to fix a bug with the radar. This is how the rad should work. According to the ship's forward direction and up direction, we project the enemies on a plane (up = normal), but after this projection I want to show the projected enemies on an XY plane and it's the latter part which I've got problems with. The bug that I see is that in some quadrants, the result of the positions on the XY plane are skewed somehow. Haven't figured out the problem yet, but someday I have to face this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A friend of mine has also started sketching the comic strip for the intro, hopefully I will be seeing the sketches soon. I've also contacted a friend of mine who may give me a hand from the musical aspect of the game.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For next week:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Prepare build for prototype testers including intro page&lt;/li&gt;&lt;li&gt;Tweak the enemy to be a bit more realistic (current he can shoot even if its not looking at you&lt;/li&gt;&lt;li&gt;Make some game over triggers and restarting the game.&lt;/li&gt;&lt;li&gt;Tweak the manouvrability of the spaceship&lt;/li&gt;&lt;li&gt;Also the timing for mothership aligning and getting the end of the tunnel with some enemies such as turrets and ships coming at you.&lt;/li&gt;&lt;li&gt;Cutscene to see mothership shooting planet&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-1675609251958189601?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/1675609251958189601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=1675609251958189601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1675609251958189601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1675609251958189601'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/08/prototype-available-to-friends-soon.html' title='Prototype available to friends soon'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6240059298926241040</id><published>2010-08-23T00:32:00.000-07:00</published><updated>2010-08-23T00:33:51.904-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HyperGlider'/><title type='text'>Turrets &amp; bullets</title><content type='html'>&lt;div&gt;This week I managed to get the hang of using a unity particle system for all the bullets by using the Emit() method of the ParticleEmitter. That will ensure just one draw call for all the bullets in my scene.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have also made a Turret to focus on a target and start shooting at it. I also tried doing a prediction method that takes into consideration the distance and speed of the vehicle. I will need to add also into consideration the bullet's speed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For Next week: &lt;/div&gt;&lt;div&gt;- re-add the enemies and make them shoot at the player&lt;/div&gt;&lt;div&gt;- optimize the textured enemies to use an unparented bones system (read this somewhere to minimize draw calls in unity)&lt;/div&gt;&lt;div&gt;- buy unity license&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6240059298926241040?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6240059298926241040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6240059298926241040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6240059298926241040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6240059298926241040'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/08/turrets-bullets.html' title='Turrets &amp; bullets'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-7224031749388321017</id><published>2010-08-15T12:18:00.000-07:00</published><updated>2010-08-15T12:23:30.410-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HyperGlider'/><title type='text'>New iphone/ipad game in development</title><content type='html'>&lt;div&gt;I have just finished doing the game bible for my next game. The work-in-progress name of the game is HyperGlider. The name will probably change later on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In short it's going to be a 3d space shooter game with intense action. The way how to hold the ipad will immerse the player even more in the game.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I will be using Unity and I will try to push the limits of the ipad to make it as visually appealing as this game: &lt;a href="http://www.youtube.com/watch?v=fnPrP7QjzzM"&gt;Star Wolves&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I will be posting any updates about this game on this blog.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-7224031749388321017?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/7224031749388321017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=7224031749388321017' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7224031749388321017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7224031749388321017'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/08/new-iphoneipad-game-in-development.html' title='New iphone/ipad game in development'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6746468043415876125</id><published>2010-04-03T00:36:00.000-07:00</published><updated>2010-04-03T00:48:04.436-07:00</updated><title type='text'>SoundToy iPad app approved for launch</title><content type='html'>This is great news. It has been approved by Apple and will be &lt;a href="http://www.itunes.com/app/soundtoy"&gt;available on the iPad's launch on the AppStore&lt;/a&gt;! Keep you posted on how it goes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6746468043415876125?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6746468043415876125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6746468043415876125' title='33 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6746468043415876125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6746468043415876125'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/04/soundtoy-ipad-app-approved-for-launch.html' title='SoundToy iPad app approved for launch'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-8580177975273417884</id><published>2010-04-01T08:25:00.000-07:00</published><updated>2010-04-01T21:06:35.667-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SoundToy'/><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><title type='text'>SoundToy - iPad app in 24hrs</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-Bme_EOsh_o/S7VtOeFidYI/AAAAAAAAAUQ/Cl8CIV8dpOY/s1600/soundToy512.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_-Bme_EOsh_o/S7VtOeFidYI/AAAAAAAAAUQ/Cl8CIV8dpOY/s320/soundToy512.png" alt="" id="BLOGGER_PHOTO_ID_5455386618991113602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The story started when a day before a public holiday here in Malta (31st March), I got a reminder from Apple Developer Center to submit any iPad app for review for the great launch of the iPad. And I thought why not create something simple in just a 24hr - code jam. My wife was going to be busy doing figolli (traditional Easter sweets), so I said let me a do a coding marathon where in less than 24 hours I have to submit an iPad app. This wouldn't have been possible if I didn't have experience building &lt;a href="http://buttonia.com/"&gt;Buttonia&lt;/a&gt;&lt;a href="http://buttonia.com/"&gt; for the iPhone&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Problem 1: I didn't have Snow Leopard, so I bought it after finishing a tutorial with my students on that day. And that evening I installed it together with XCode 3.2 / iPhone SDK for the iPad. Installation went smooth, although took a while to finish due to updates. I still made a TimeMachine backup before just in case :)&lt;br /&gt;&lt;br /&gt;Problem 2: What can I do in less than 24 hours? I thought what would I want to do if I had a big multitouch screen? I would want to touch it with both hands and swipe and do some nice visual effects. That would be quite easy to do. Then I said what if I add some sound to it? That would make it more engaging and it would be ideal for kids to play around with it. I'm not really an audio programmer, but a sine wave generator wouldn't be difficult to code. Then if I get some sales, I might add some more sound effects to it and improve it later.&lt;br /&gt;&lt;br /&gt;Problem 3: I didn't have an iPad, so I was bound to use the iPad simulator which although it works, its a bit slow on my machine. Plus I cannot tilt it or shake it, or actually multitouch it. So once I had a semi-decent touch trail effect, and a sine-wave generator, whose pitch changes according to where you touch the screen, I ported the code into another project to try it out on my iPod Touch. Now I know I could have done a universal build, i.e. an app that works both on the iPod Touch and iPad, but I didn't want that as it is not the same thing when you have a small screen. The main idea of porting it was to test the multitouch, but also to hope that the sound glitches I was experiencing in the simulator where a bug in the simulator and not in my code. Obviously I was wrong! The sound glitch still occurred and it only occurred when a sound starts, and when it ends. It also wasn't working nicely when blending multiple sine waves.&lt;br /&gt;&lt;br /&gt;As I said I'm no audio programmer, so probably this would have been a no-brainer for some experienced audio programmers. The problem was in fact in the blending of the waves. I didn't want to use (A+B)/2, where A and B are two samples, because if one of them is silence, then outcome would be half the volume. I tried this as a test, even though it might half the volume and with this I didn't have any glitches. So I concluded my blending formula of (A+B) - A.B (not exactly this, but a variant of it), was not working right. My mind was already slowing, especially after coding an all-nighter with just 4 hours of sleep (5am - 9pm). I tried to find on the internet how to do correct blending. I discovered a lot of other unrelated algorithms, but not what I wanted. After telling the problem to my wife, I got to the solution :). Basically I used A*a/t+B*b/t where a is the current sine wave's volume, b is the previous waves' volume and t is the total volume (a+b). Now consider A as being the current wave we are mixing, and B as the previous wave (which is a mix of other waves). Then b is simply the maximum volume of all the waves mixed so far. This is probably not the correct way how to do, but I was pressed with time. It worked and no glitches :)&lt;br /&gt;&lt;br /&gt;The polishing stage was the shortest cycle I have ever done on any project. There wasn't much to polish since it was a small project. I just added some concepts like double tap to hold a note, and shaking to clear the notes. Then made a quick logo and some simple text instructions while the app is loading.&lt;br /&gt;&lt;br /&gt;All in all, it was a fun coding experience. I learned a lot, and definitely I need to get my hands deeper into audio programming/DSP. Waiting for Apple's review...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8580177975273417884?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8580177975273417884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8580177975273417884' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8580177975273417884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8580177975273417884'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/04/soundtoy-ipad-app-in-24hrs.html' title='SoundToy - iPad app in 24hrs'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-Bme_EOsh_o/S7VtOeFidYI/AAAAAAAAAUQ/Cl8CIV8dpOY/s72-c/soundToy512.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-667578005919840611</id><published>2010-03-24T23:10:00.001-07:00</published><updated>2010-03-24T23:12:02.357-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Buttonia'/><title type='text'>History of Buttonia - Maltese iPhone game</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.itunes.com/app/buttonia"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="http://3.bp.blogspot.com/_-Bme_EOsh_o/S6r34cYVOtI/AAAAAAAAATg/ty82RbHaA3M/s400/buttonia_menu.png" alt="" id="BLOGGER_PHOTO_ID_5452442847948389074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://buttonia.com/"&gt;Buttonia&lt;/a&gt; was originally invented by Sven Neumann back in 1996. The first time I saw it was ten years later in 2006 when I was at Sven's place and he was showing me his prototype games.&lt;br /&gt;When he showed me his version of Buttonia I was hooked. Its simplicity and addictiveness was its strength. The first couple of seconds you are really puzzled on what you need to do, but then you immediately realise that each button effects it's neighbours and that's it. You just need to turn on all the buttons.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.itunes.com/app/buttonia"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 368px; height: 169px;" src="http://3.bp.blogspot.com/_-Bme_EOsh_o/S6r4DyEPKUI/AAAAAAAAATo/a25qwQd7IpY/s400/buttonia_app_store.jpg" alt="" id="BLOGGER_PHOTO_ID_5452443042748246338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It was still a prototype at the time and he never had the time to polish it. I told him "We got to polish this and push it out and see what happens". I had done some shiny buttons and Sven put up some javascript together and we rolled out an online version on &lt;a href="http://buttonia.com/"&gt;buttonia.com&lt;/a&gt;. We had a daily 3x3, 4x4, 5x5 and 6x6. The 6x6 were a bitch to solve and took around 5min to solve it. We had quite a hit when it got reviewed by blogs. At one point we were flooded from the Japanese. They seem to like these kind of puzzle games.&lt;br /&gt;&lt;br /&gt;At the time we spewed out randomly generated puzzles without verifying if they were solvable or not. The users could flag if it wasn't solvable or not. We knew this was a problem and we had several chats on how to come up with an algorithm to know whether a generated puzzle was solvable or not. Sven is more into Math than me, and after a lot of research/trial and error he came up with a mathematical solution. He tried to explain it to me, but it was beyond me. Too many matrices and transformations for my liking. But it works! We give the algorithm a randomly generated puzzle and it tells us whether it is solvable or not.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.itunes.com/app/buttonia"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="http://1.bp.blogspot.com/_-Bme_EOsh_o/S6r4Tw2hIeI/AAAAAAAAATw/weOrOX7tQPI/s400/buttonia_4x4.png" alt="" id="BLOGGER_PHOTO_ID_5452443317300175330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Meanwhile I was interested in iPhone development, not because of the gold rush really (which is over by now), but I always wanted to know what it would be like to develop for such a device. I had already developed a couple of games for the n-gage (Symbian OS), and sincerely the SDK wasn't that well organized (but maybe they fixed this by now). So I &lt;a href="http://softwareprodigy.blogspot.com/2009/04/fell-in-love-with-mac.html"&gt;bought a second-hand macbook&lt;/a&gt; and also a &lt;a href="http://softwareprodigy.blogspot.com/2009/05/ipod-touch-soon-on-its-way.html"&gt;second-hand ipod touch (with a cracked screen)&lt;/a&gt;, and started developing some prototypes, unrelated with &lt;a href="http://buttonia.com/"&gt;Buttonia&lt;/a&gt;. I had started an &lt;a href="http://softwareprodigy.blogspot.com/2009/06/started-shootem-up-prototype.html"&gt;engine for shoot'em ups&lt;/a&gt; but realised I needed a lot of art to make it really addictive and polished. Then I met Sven again and he tossed the idea of porting Buttonia for the iPhone. And that's were I started creating an even more polished version of Buttonia. We met every now and then to see what was working and what not. The prototype  was done in a couple of weeks, but then remained the next 90%. Polishing takes ages. We wanted to get the tutorial as best as we good, and when we give the device to our friends to play it, they still people press Play and don't care about the How to Play section :). They still figured out what they need to do.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.itunes.com/app/buttonia"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="http://3.bp.blogspot.com/_-Bme_EOsh_o/S6r48DYerfI/AAAAAAAAAT4/F8o_dS0y8EM/s400/buttonia_complete.png" alt="" id="BLOGGER_PHOTO_ID_5452444009469226482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I carried out two beta phases with my friends who had an iPhone/iPod touch and they gave valuable feedback. I only had one crash from one of the testers, and sent me the crash log and solved it. Thanks Luke. We had valuable feedback and fixed some usability issues. The best feedback though was when I showed someone the game and I just see how he/she will react to the game. Awesome experience for a developer to see his product being used. It's an eye-opener, because everyone will act differently and they always do something with the game you wouldn't have ever imagined. My best beta test is actually my wife. She likes games and she finds bugs so easily. So she is the first one to play my games before showing it to anyone else :).&lt;br /&gt;&lt;br /&gt;Last week we released the game to Apple and it was approved within a couple of days. We are currently waiting for some iPhone app reviewers. We are already hit #1 in Malta's AppStore, but we still need to make a hit internationally. Unfortunately when you release a game on the AppStore it immediately gets buried in the hundreds of apps released per day. So you really need to have a polished product to get noticed. We'll wait and see. We have to spread the word :)&lt;br /&gt;&lt;br /&gt;For more information about the game and a video check out &lt;a href="http://buttonia.com/"&gt;http://buttonia.com&lt;/a&gt;&lt;br /&gt;Buttonia is now &lt;a href="http://www.itunes.com/app/buttonia"&gt;available on the AppStore&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.itunes.com/app/buttonia"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 368px; height: 169px;" src="http://3.bp.blogspot.com/_-Bme_EOsh_o/S6r4DyEPKUI/AAAAAAAAATo/a25qwQd7IpY/s400/buttonia_app_store.jpg" alt="" id="BLOGGER_PHOTO_ID_5452443042748246338" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-667578005919840611?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/667578005919840611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=667578005919840611' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/667578005919840611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/667578005919840611'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/03/history-of-buttonia-maltese-iphone-game.html' title='History of Buttonia - Maltese iPhone game'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-Bme_EOsh_o/S6r34cYVOtI/AAAAAAAAATg/ty82RbHaA3M/s72-c/buttonia_menu.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-3821828963768943639</id><published>2010-03-20T00:07:00.000-07:00</published><updated>2010-03-20T00:19:48.796-07:00</updated><title type='text'>Buttonia for the iPhone/iPod touch released on the AppStore</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-Bme_EOsh_o/S6R1rMHNoQI/AAAAAAAAATY/MdwBF0HoXQk/s1600-h/buttonia_menu.png"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 267px; height: 400px;" src="http://4.bp.blogspot.com/_-Bme_EOsh_o/S6R1rMHNoQI/AAAAAAAAATY/MdwBF0HoXQk/s400/buttonia_menu.png" alt="" id="BLOGGER_PHOTO_ID_5450610833871446274" border="0" /&gt;&lt;/a&gt;Last Wed, 17th March, we have uploaded &lt;a href="http://buttonia.com/"&gt;Buttonia&lt;/a&gt; to Apple for review, and after two days it got approved! It has been an enjoyable ride with the iPhone SDK and Apple's quick and  efficient service. We have learned a lot and we will surely do other  apps in the near future.&lt;br /&gt;&lt;br /&gt;Something about the game:&lt;br /&gt;The aim of this simple but addictive game is to turn on all the buttons, in the least time  possible as quick as you can. Each button flips its neighbouring buttons  according to the icon on the button.&lt;br /&gt;&lt;br /&gt;Visit the &lt;a href="http://buttonia.com"&gt;Buttonia website&lt;/a&gt; for more info or find in the &lt;a href="itms://itunes.apple.com/us/app/buttonia/id349273813?mt=8"&gt;AppStore&lt;/a&gt;. Tell your friends and spread the word :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-3821828963768943639?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/3821828963768943639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=3821828963768943639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3821828963768943639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3821828963768943639'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/03/buttonia-for-iphoneipod-touch-released.html' title='Buttonia for the iPhone/iPod touch released on the AppStore'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-Bme_EOsh_o/S6R1rMHNoQI/AAAAAAAAATY/MdwBF0HoXQk/s72-c/buttonia_menu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6067603980116911294</id><published>2010-02-09T11:58:00.000-08:00</published><updated>2010-02-09T12:00:10.412-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><title type='text'>OCMock for the iPhone</title><content type='html'>I was using &lt;a href="http://iamthewalr.us/blog/2008/11/ocmock-and-the-iphone/"&gt;OCMock for testing on the iPhone&lt;/a&gt;, but for some strange reason, a configuration I had once done disappeared. I tracked down the tutorial I had used to set up OCMock, and went through it again to get back my tests to working condition again.&lt;br /&gt;&lt;br /&gt;I don't want forget &lt;a href="http://iamthewalr.us/blog/2008/11/ocmock-and-the-iphone/"&gt;this link&lt;/a&gt; anymore, so I'm blogging it :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6067603980116911294?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6067603980116911294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6067603980116911294' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6067603980116911294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6067603980116911294'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2010/02/ocmock-for-iphone.html' title='OCMock for the iPhone'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-1631619442460489452</id><published>2009-12-23T09:20:00.000-08:00</published><updated>2009-12-23T09:26:14.829-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengl ES'/><title type='text'>Adding Email in-app dialog to OpenGL App</title><content type='html'>I encountered a problem when trying to follow this &lt;a href="http://blog.mugunthkumar.com/coding/iphone-tutorial-in-app-email/"&gt;tutorial about adding in-app Email dialog&lt;/a&gt;. I had a general problem. I didn't have a UIViewController. I only had MyEAGLView instance, a UIView&lt;br /&gt;&lt;br /&gt;After reading this &lt;a href="http://stackoverflow.com/questions/1597310/add-a-uiview-to-an-uiviewcontroller"&gt;article about UIViewController&lt;/a&gt;, it clicked.&lt;br /&gt;&lt;br /&gt;All I had to do was create a UIViewController in the appFinishedLoading and then I added the opengl view to the viewcontroller. Then made the view of the view controller as a subview of the window.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; viewController = [[UIViewController alloc] init];&lt;br /&gt; [viewController.view addSubview:glView];&lt;br /&gt; &lt;br /&gt; [window addSubview:viewController.view];&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-1631619442460489452?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/1631619442460489452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=1631619442460489452' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1631619442460489452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1631619442460489452'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/12/adding-email-in-app-dialog-to-opengl.html' title='Adding Email in-app dialog to OpenGL App'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6917788480264204284</id><published>2009-12-22T01:12:00.000-08:00</published><updated>2009-12-22T01:17:36.298-08:00</updated><title type='text'>iPhone Ad Hoc distribution</title><content type='html'>I am just going to paste some links that helped me out through the process of nailing down a release that I can give to my friends for beta testing. Just need to fix some bugs before giving them the beta :)&lt;br /&gt;&lt;br /&gt;Process of setting up ad hoc build&lt;br /&gt;http://developer.apple.com/iphone/manage/distribution/index.action&lt;br /&gt;&lt;br /&gt;Tutorial to give to users to get the UDID&lt;br /&gt;http://www.innerfence.com/howto/find-iphone-unique-device-identifier-udid&lt;br /&gt;&lt;br /&gt;Tutorial to give to users for installing beta&lt;br /&gt;http://www.innerfence.com/howto/install-iphone-application-ad-hoc-distribution&lt;br /&gt;http://www.innerfence.com/howto/install-iphone-application-ad-hoc-distribution?zip_file=AppName.app.AdHoc.ipa&lt;br /&gt;&lt;br /&gt;Debugging Crash Logs&lt;br /&gt;http://developer.apple.com/tools/xcode/symbolizingcrashdumps.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6917788480264204284?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6917788480264204284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6917788480264204284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6917788480264204284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6917788480264204284'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/12/iphone-ad-hoc-distribution.html' title='iPhone Ad Hoc distribution'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-882406785719493968</id><published>2009-12-15T16:35:00.000-08:00</published><updated>2009-12-15T16:48:00.688-08:00</updated><title type='text'>Xmas tree - gamedev analogy</title><content type='html'>Today I was assembling our new christmas tree, when I started comparing the process with developing a game.&lt;br /&gt;&lt;br /&gt;When you start assembling the tree you first put in place the base, then the pillars where you will start hooking in the branches layer by layer.&lt;br /&gt;Well, even in gamedev we have to make the skeleton, some basic engine where you can start building a prototype, feature by feature.&lt;br /&gt;&lt;br /&gt;Then comes in the decorations, tinsel, lights and the star at the top of the tree. Even in gamedev you have polishing, polishing, polishing, and even more... you guessed it... POLISHING! It's those small details that make a christmas tree look great. That also counts for games (anything really)&lt;br /&gt;&lt;br /&gt;Best wishes to all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-882406785719493968?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/882406785719493968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=882406785719493968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/882406785719493968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/882406785719493968'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/12/xmas-tree-gamedev-analogy.html' title='Xmas tree - gamedev analogy'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6540036241748295744</id><published>2009-11-23T03:34:00.000-08:00</published><updated>2009-11-23T03:37:06.537-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Localization/Internationalization/i18n for iPhone apps</title><content type='html'>I have found this &lt;a href="http://www.iphonesdkarticles.com/2008/11/localizing-iphone-apps.html"&gt;internationalization guide&lt;/a&gt; on how to make your iPhone app behave appropriately according to the iPhone's language preference. Very easy to get started. Ideally the strings are externalized as from day 1. It's a bit time consuming externalizing them later on :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6540036241748295744?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6540036241748295744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6540036241748295744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6540036241748295744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6540036241748295744'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/11/localizationinternationalizationi18n.html' title='Localization/Internationalization/i18n for iPhone apps'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-7506548131638442090</id><published>2009-11-20T16:09:00.000-08:00</published><updated>2009-11-20T16:14:43.093-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>High Score System in place</title><content type='html'>I'm still working on the iphone game, but only a couple of hours a week unfortunately. I have created a High Score system using Rails on Heroku.com. Heroku is a very nice Rails hosting service - which is also free for a basic setup and easily be ramped up in a jiffy.&lt;br /&gt;&lt;br /&gt;The next think I need to check is the in-app purchases for downloadable content. Should be interesting...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-7506548131638442090?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/7506548131638442090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=7506548131638442090' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7506548131638442090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7506548131638442090'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/11/high-score-system-in-place.html' title='High Score System in place'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-7599706275552567871</id><published>2009-10-25T13:11:00.000-07:00</published><updated>2009-10-25T13:13:49.859-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><title type='text'>Updating the Provisioning Profile</title><content type='html'>When my provisioning profile expired, I had to create another one. But I had problems hooking it with the project. This &lt;a href="http://www.fruitstandsoftware.com/blog/2009/06/bypassing-the-trouble-caused-by-updating-an-iphone-app-provisioning-profile/"&gt;how-to&lt;/a&gt; saved the day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-7599706275552567871?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/7599706275552567871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=7599706275552567871' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7599706275552567871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7599706275552567871'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/10/updating-provisioning-profile.html' title='Updating the Provisioning Profile'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-5012875907847854051</id><published>2009-09-29T12:04:00.000-07:00</published><updated>2009-09-29T23:26:44.527-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Unit testing on the iPhone SDK</title><content type='html'>I have been busy preparing lectures (still am) but I'm still alive :)&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Introduction&lt;/span&gt;&lt;br /&gt;I realised that I was adding code to the iPhone project more like in a prototyping stage. I wasn't doing any tests but I still tried to organize the classes as best as I could. Now I'm starting to loose confidence when I'm going to add some features. Not a good feeling. I want to switch to TDD (Test Driven Development), where you first write a failing test, and then write the production code. The excellent side effect of this is that the design of the classes are automatically decoupled. However I need to first convert my project to be covered by tests. Found an interesting book called "Working Effectively with Legacy Code" where it gives a lot of tips on how to breakdown classes, etc. I'm still reading it in my free time, but I will soon be putting the tips to work.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Setting up test harness&lt;/span&gt;&lt;br /&gt;I searched for setting up a test harness in XCode. Version 3 supports unit tests using the SenTesting classes. I found a &lt;a href="http://cocoahk.com/wp-content/uploads/2009/07/iphone-30-unit-testing.pdf"&gt;presentation&lt;/a&gt; and an &lt;a href="http://developer.apple.com/IPhone/library/documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html#//apple_ref/doc/uid/TP40007959-CH20-SW1"&gt;Apple support page&lt;/a&gt; to set up a test harness. It also describes for setting up functional testing, however I will be only using unit (logic) tests for now.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Some tips to finalize the setup&lt;/span&gt;&lt;br /&gt;Remember to drag any .m files into the Compile Sources in the logic tests target and also any libraries.&lt;br /&gt;Also edit the Active target LogicTests and under Build tab, in Gcc 4.2 - Language section, turn on Precompile Prefix Header and also set the Prefix Header to &lt;project name=""&gt;_Prefix.pch&lt;br /&gt;It is very important to this as otherwise it will give you loads of errors like could not find CGPoint class, etc&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;NSLog...where are they output?&lt;/span&gt;&lt;br /&gt;What about logging when running the tests? Since to execute the unit tests you just need to build the application, there is not console out from XCode, however you can view the output of NSLog statements in the Console application. Launch Console from Spotlight.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Code Coverage&lt;/span&gt;&lt;br /&gt;I also wanted to have code coverage, to know how much of the code is being tests by the tests. I found an excellent &lt;a href="http://www.cubiclemuses.com/cm/articles/2009/05/14/coverstory-on-the-iphone/"&gt;tutorial on setting up code coverage&lt;/a&gt;. It uses &lt;a href="http://code.google.com/p/coverstory/"&gt;CoverStory&lt;/a&gt; - a tool for viewing the results of code coverage.&lt;br /&gt;&lt;br /&gt;Now I need to rewire my brain to think in tests...&lt;br /&gt;&lt;br /&gt;&lt;/project&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-5012875907847854051?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/5012875907847854051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=5012875907847854051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5012875907847854051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5012875907847854051'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/09/unit-testing-on-iphone-sdk.html' title='Unit testing on the iPhone SDK'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-5877838680931617287</id><published>2009-08-21T21:51:00.000-07:00</published><updated>2009-08-21T22:05:49.841-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengl ES'/><title type='text'>Creating sparks/bolts in Opengl ES</title><content type='html'>I wanted to create some sparks/lightening/bolts kinda thing on the iPhone/iPod touch using OpenGL ES. I made a quick google and found this &lt;a href="http://www.sulaco.co.za/opengl_project_electric_spheres.htm"&gt;Delphi Opengl Project&lt;/a&gt;. I adapted it and created a quick spark object. Here is the draw method involved:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-(void) draw&lt;br /&gt;{&lt;br /&gt;#define random ((float)random()/RAND_MAX)&lt;br /&gt;   // initialise the start and end points&lt;br /&gt;   yDisp[0] = yDisp[STEPS-1] = 0;&lt;br /&gt;&lt;br /&gt;   // calculate new Y coordinate. new = old + random.&lt;br /&gt;   for (int i = 1; i &lt;&gt; yDisp[i-1] + 0.075f)  yDisp[i] = yDisp[i-1]+0.075f;&lt;br /&gt;       if (yDisp[i] &lt;&gt; yDisp[i+1] + 0.075f)  yDisp[i] = yDisp[i+1]+0.075f;&lt;br /&gt;       if (yDisp[i] &lt;&gt;  0.5f)  yDisp[i] = 0.5f;&lt;br /&gt;       if (yDisp[i] &lt; -0.5f)  yDisp[i] = -0.5f;&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   // Prepare the vertices as a Triangle strip&lt;br /&gt;   float rnd;&lt;br /&gt;   for (int j = 0; j &lt; STEPS; j++)&lt;br /&gt;   {&lt;br /&gt;       rnd = 0.04f*(random-0.5f); //0.4 * random between -0.5 and 0.5&lt;br /&gt;       vertices[j*6 + 0] = length*j/STEPS + rnd; //x between 0 and length with some slight randomness&lt;br /&gt;       vertices[j*6 + 1] = -halfThickness + (yDisp[j] + rnd) * amplitude; //y&lt;br /&gt;       vertices[j*6 + 2] = 0; //rnd; //z&lt;br /&gt;     &lt;br /&gt;       vertices[j*6 + 3] = length*j/STEPS + rnd; //x&lt;br /&gt;       vertices[j*6 + 4] = halfThickness + (yDisp[j] + rnd) * amplitude; //y&lt;br /&gt;       vertices[j*6 + 5] = 0; //rnd; //z&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   // Draw the vertices&lt;br /&gt;   glDisableClientState(GL_COLOR_ARRAY);&lt;br /&gt;   glDisableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;   glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;   glDisable(GL_TEXTURE_2D);&lt;br /&gt;   glEnable(GL_BLEND);&lt;br /&gt;   glBlendFunc(GL_SRC_ALPHA, GL_ONE);&lt;br /&gt;   glColor4f(0.4f, 0.3f, 0.8f, 1.0f);&lt;br /&gt;   glVertexPointer(3, GL_FLOAT, 0, vertices);&lt;br /&gt;   glMatrixMode(GL_MODELVIEW);&lt;br /&gt;   glPushMatrix();&lt;br /&gt;       glTranslatef(x,y,0);&lt;br /&gt;       glRotatef(angleInDegrees, 0, 0, 1);&lt;br /&gt;       glDrawArrays(GL_TRIANGLE_STRIP, 0, STEPS*2);&lt;br /&gt;   glPopMatrix();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The vertices array and yDisp array would need to be malloced appopriately in the init method (and freed in the dealloc):&lt;br /&gt;&lt;br /&gt;   vertices = malloc(sizeof(GLfloat) * 3 * STEPS * 2);//3 coordinates for each vertex, 2 vertices for each step&lt;br /&gt;   yDisp = malloc(sizeof(float) * STEPS);&lt;br /&gt;&lt;br /&gt;Some good values for a decent spark would be length 200, halfWidth 1, amplitude 50.&lt;br /&gt;STEPS was #defined to 40 for now.&lt;br /&gt;&lt;br /&gt;This is just the beginning. I need to add more effects like glowing endpoints and subtle particle systems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-5877838680931617287?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/5877838680931617287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=5877838680931617287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5877838680931617287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5877838680931617287'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/08/creating-sparksbolts-in-opengl-es.html' title='Creating sparks/bolts in Opengl ES'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-4201054720050050416</id><published>2009-08-05T13:05:00.000-07:00</published><updated>2009-08-05T13:31:10.665-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl ES'/><title type='text'>gluUnProject for iPhone / OpenGL ES</title><content type='html'>I wasn't surprised that gluUnProject did not exist in the iPhone SDK since they did not provide a glu library implementation. However as I have migrated the gluLookAt, it was time to migrate the gluUnProject. It has been ages since I had used this method. The only thing I remebered was that it was used to know where you have clicked in your 3d world, by using a 2d device, i.e. a mouse. In our case since we're using iPhone, it's the capacitive touch screen which gives us back 2d coordinates of where we touched on the screen.&lt;br /&gt;&lt;br /&gt;Since I'm using a perspective view, I needed to translate those coordinates into world coordinates. In my case, on the current project I'm working on, I would finally want to know which button the user click from a grid.&lt;br /&gt;&lt;br /&gt;I got the &lt;a href="http://webcvs.freedesktop.org/mesa/Mesa/src/glu/mesa/project.c?revision=1.4&amp;amp;view=markup"&gt;gluUnProject code&lt;/a&gt; from &lt;a href="http://en.wikipedia.org/wiki/Mesa_3D_%28OpenGL%29"&gt;MESA&lt;/a&gt;. However the code needed some minor adjustments, namely converting everything from double to float:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;any GLdouble had to be replaced with GLfloat&lt;/li&gt;&lt;li&gt;any double numbers, e.g. 0.0 or 1.0 I converted them to their respective float counterpart, e.g. 0.0f or 1.0f&lt;/li&gt;&lt;li&gt;and math functions which accepted/returned double, I replaced them with their float versions, e.g. fabs -&gt; fabsf&lt;/li&gt;&lt;/ul&gt;The next problem was that gluUnProject takes the 3 coordinates, 2 of them are retrieved from the touch event, but the Z coordinate we don't know it. On the desktop openGL usually the depth buffer is queried to retrieve the depth value (between 0 and 1) at the x-y coordinate. But we cannot do this on the iPhone as it uses tile rendering.&lt;br /&gt;&lt;br /&gt;So I thought to use the value of zero, but in effect it was always giving the coordinates of the center of the screen. In reality it was giving me the coordinates of the camera position. When I tried 1 instead of 0, it was giving me coordinates that made more sense but still not 100% precise.&lt;br /&gt;&lt;br /&gt;The solution was to &lt;a href="http://www.idevgames.com/forum/archive/index.php/t-9310.html"&gt;unproject twice&lt;/a&gt;, one time at the near plane (z = 0) and one time at the far plane (z = 1) as discussed in a forum. That gives you a ray which can then be used to make an intersection with a plane and get the exact coordinates. Thus converting from 2d to 3d.&lt;br /&gt;&lt;br /&gt;Here's the method I have used which uses the migrated gluUnProject using just floats:&lt;br /&gt;&lt;br /&gt;-(CGPoint) getOGLPos:(CGPoint)winPos&lt;br /&gt;{&lt;br /&gt;//    I am doing this once at the beginning when I set the perspective view&lt;br /&gt;//    glGetFloatv( GL_MODELVIEW_MATRIX, __modelview );&lt;br /&gt;//    glGetFloatv( GL_PROJECTION_MATRIX, __projection );&lt;br /&gt;//    glGetIntegerv( GL_VIEWPORT, __viewport );&lt;br /&gt;   &lt;br /&gt;    //opengl 0,0 is at the bottom not at the top&lt;br /&gt;    winPos.y = (float)__viewport[3] - winPos.y;&lt;br /&gt;//    float winZ;&lt;br /&gt;    //we cannot do the following in openGL ES due to tile rendering&lt;br /&gt;//    glReadPixels( (int)winPos.x, (int)winPos.y, 1, 1, GL_DEPTH_COMPONENT24_OES, GL_FLOAT, &amp;amp;winZ );&lt;br /&gt;&lt;br /&gt;    float cX, cY, cZ, fX, fY, fZ;&lt;br /&gt;    //gives us camera position (near plan)&lt;br /&gt;    gluUnProject( winPos.x, winPos.y, 0, __modelview, __projection, __viewport, &amp;amp;cX, &amp;amp;cY, &amp;amp;cZ);&lt;br /&gt;    //far plane&lt;br /&gt;    gluUnProject( winPos.x, winPos.y, 1, __modelview, __projection, __viewport, &amp;amp;fX, &amp;amp;fY, &amp;amp;fZ);&lt;br /&gt;   &lt;br /&gt;    //We could use some vector3d class, but this will do fine for now&lt;br /&gt;    //ray&lt;br /&gt;    fX -= cX;&lt;br /&gt;    fY -= cY;&lt;br /&gt;    fZ -= cZ;&lt;br /&gt;    float rayLength = sqrtf(cX*cX + cY*cY + cZ*cZ);&lt;br /&gt;    //normalize&lt;br /&gt;    fX /= rayLength;&lt;br /&gt;    fY /= rayLength;&lt;br /&gt;    fZ /= rayLength;&lt;br /&gt;   &lt;br /&gt;    //T = [planeNormal.(pointOnPlane - rayOrigin)]/planeNormal.rayDirection;&lt;br /&gt;    //pointInPlane = rayOrigin + (rayDirection * T);&lt;br /&gt;   &lt;br /&gt;    float dot1, dot2;&lt;br /&gt;&lt;br /&gt;    float pointInPlaneX = 0;&lt;br /&gt;    float pointInPlaneY = 0;&lt;br /&gt;    float pointInPlaneZ = 0;&lt;br /&gt;    float planeNormalX = 0;&lt;br /&gt;    float planeNormalY = 0;&lt;br /&gt;    float planeNormalZ = -1;&lt;br /&gt;   &lt;br /&gt;    pointInPlaneX -= cX;&lt;br /&gt;    pointInPlaneY -= cY;&lt;br /&gt;    pointInPlaneZ -= cZ;&lt;br /&gt;   &lt;br /&gt;    dot1 = (planeNormalX * pointInPlaneX) + (planeNormalY * pointInPlaneY) + (planeNormalZ * pointInPlaneZ);&lt;br /&gt;    dot2 = (planeNormalX * fX) + (planeNormalY * fY) + (planeNormalZ * fZ);&lt;br /&gt;   &lt;br /&gt;    float t = dot1/dot2;&lt;br /&gt;   &lt;br /&gt;    fX *= t;&lt;br /&gt;    fY *= t;&lt;br /&gt;    //we don't need the z coordinate in my case&lt;br /&gt;   &lt;br /&gt;    return CGPointMake(fX + cX, fY + cY);&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-4201054720050050416?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/4201054720050050416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=4201054720050050416' title='30 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4201054720050050416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4201054720050050416'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/08/gluunproject-for-iphone-opengl-es.html' title='gluUnProject for iPhone / OpenGL ES'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>30</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-3544757368235473499</id><published>2009-08-04T02:34:00.000-07:00</published><updated>2009-08-04T02:42:03.665-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengl ES'/><title type='text'>Disabling Texture Units</title><content type='html'>After I managed to create multitextured polygons, I ran into another problem. After flushing the multitextured vertex array, I needed to flush a single textured vertex array for the HUD (Heads-up display, i.e. timer, score etc). The problem looked like it was using the texture coordinates of the previous vertex array.&lt;br /&gt;&lt;br /&gt;After some googling and trying to understand what was happening, I realized that I needed to disable the 2nd texture unit. When you are using texture array pointers we use glClientActiveTexture, so before drawing the non-multitextured vertex array, I needed to disable the second texture unit and then switch back to the first texture unit&lt;br /&gt;&lt;br /&gt;        //disable 2nd texture unit&lt;br /&gt;        glClientActiveTexture(GL_TEXTURE1);&lt;br /&gt;        glDisable (GL_TEXTURE_2D);&lt;br /&gt;        //back to the 1st texture unit&lt;br /&gt;        glClientActiveTexture(GL_TEXTURE0);&lt;br /&gt;        glBindTexture(GL_TEXTURE_2D, [_texture name]);&lt;br /&gt;        ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Initially I tried using glActiveTexture instead of glClientActiveTexture. The glActiveTexture is used when display lists/immediate mode is used (glBegin...glEnd). And obviously nothing was happening.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-3544757368235473499?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/3544757368235473499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=3544757368235473499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3544757368235473499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3544757368235473499'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/08/disabling-texture-units.html' title='Disabling Texture Units'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-3635528017280446175</id><published>2009-08-01T02:09:00.000-07:00</published><updated>2009-08-05T13:00:51.975-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Multitexturing on Opengl ES</title><content type='html'>I wanted to create a random highlight animation effect on the buttons that glides over them every now and then. At first I was going to do it in a multipass approach, i.e. first draw the button polygons, then the highlight over them. However it should be more efficient (with loads of polygons anyway) if multitexturing is used. The iPhone has 2 Texture Units (TU) and so I can take advantage of that.&lt;br /&gt;&lt;br /&gt;I never had done multitexturing in opengl before, so I had to learn the concept. If you understand the blending functions with the frame buffer, then multitexturing will be easy. The difference is that you can combine the results of texture units. Since we have two TUs we can make the first texture blend with the frame buffer, and then overlay the second texture by adding it to the result of the previous TU (GL_PREVIOUS).&lt;br /&gt;You dictate how the TUs will combine by specifying whether GL_COMBINE_RGB is &lt;a href="http://www.khronos.org/opengles/documentation/opengles1_0/html/glTexEnv.html"&gt;GL_MODULE, GL_ADD, GL_DECAL, and GL_REPLACE&lt;/a&gt;. One should take a look at what each one will calculate to, and also experiment a bit with them.&lt;br /&gt;&lt;br /&gt;Here is more detailed information about &lt;a href="http://www.opengl.org/wiki/Texture_Combiners"&gt;texture combiners&lt;/a&gt; using a fixed pipeline, and what it would like if we used shaders. I must admit that shaders are easier to read, at least such simple shaders, but shaders are only supported in iPhone 3GS.&lt;br /&gt;&lt;br /&gt;Before setting up the multitexturing, I set up the texture coordinates for both TUs:&lt;br /&gt;        glClientActiveTexture(GL_TEXTURE0);&lt;br /&gt;        glTexCoordPointer(2, GL_FLOAT, sizeof(VertexDataMultiTextured), &amp;amp;vd[0].uv0);&lt;br /&gt;        glEnableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;        glClientActiveTexture(GL_TEXTURE1);&lt;br /&gt;        glTexCoordPointer(2, GL_FLOAT, sizeof(VertexDataMultiTextured), &amp;amp;vd[0].uv1);&lt;br /&gt;        glEnableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;&lt;br /&gt;Then I set up how the TUs should behave. In my case I had a texture for the button (in an atlas) and used the following openGL commands&lt;br /&gt;        glActiveTexture(GL_TEXTURE0);&lt;br /&gt;        glBindTexture(GL_TEXTURE_2D, [_texture name]);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);&lt;br /&gt;        //blend the texture with the framebuffer(GL_PREVIOUS)&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_BLEND);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);&lt;br /&gt;        //use the texture's alpha channel&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);       &lt;br /&gt;        //------------------------&lt;br /&gt;&lt;br /&gt;And then I selected the second texture unit and added the color information of the glow texture (which was in the same atlas) to the result of the previous TU:&lt;br /&gt;        glActiveTexture(GL_TEXTURE1);&lt;br /&gt;        glBindTexture(GL_TEXTURE_2D, [_texture name]);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);&lt;br /&gt;        //add the previous color information with the texture's color information&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);&lt;br /&gt;        //don't effect the alpha channel, use the result (GL_PREVIOUS) of the previous texture unit&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_PREVIOUS);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);&lt;br /&gt;        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-3635528017280446175?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/3635528017280446175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=3635528017280446175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3635528017280446175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3635528017280446175'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/08/multitexturing-on-opengl-es.html' title='Multitexturing on Opengl ES'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6250634924959937235</id><published>2009-07-31T19:36:00.000-07:00</published><updated>2009-07-31T19:43:47.592-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>Always initialize your variables... never assume default value</title><content type='html'>I had a problem which was going to drive me insane. The app on the simulator worked fine, but not on the device. I introduced  depth in the prototype I'm working on, where buttons need to rotate and look 3d-ish. So when I added the z value, initially this was going to be zero. So I assumed that when I'm creating a variable it was going to be zero by default. I was wrong. It is only zero by default on the simulator. On the device it won't be, at least for floats. The result was a psychedelic trippy 3d-effect, which were ugly to say the least.&lt;br /&gt;&lt;br /&gt;Now I know why Java pesters the programmer to not allow him to use variables which have not been initialized.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6250634924959937235?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6250634924959937235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6250634924959937235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6250634924959937235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6250634924959937235'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/always-initialize-your-variables-never.html' title='Always initialize your variables... never assume default value'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-3605060490755709514</id><published>2009-07-30T18:38:00.000-07:00</published><updated>2009-07-30T18:42:03.668-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='boot camp'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows7'/><title type='text'>Copying files to boot camp windows drive</title><content type='html'>I discovered that by default I can only view the files availabe on the Windows boot camp drive when I'm in Mac OS X. I needed to put some files on my Windows drive before booting Windows 7 for a while. After a quick google I discovered an &lt;a href="http://www.lifehack.org/articles/lifehack/how-to-read-and-write-ntfs-windows-partition-on-mac-os-x.html"&gt;article&lt;/a&gt; which mentions &lt;a href="http://macntfs-3g.blogspot.com/"&gt;NTFS-3g&lt;/a&gt; that will allow you to write to any NTFS drive. Apparently it uses &lt;a href="http://code.google.com/p/macfuse/"&gt;MacFUSE&lt;/a&gt; underneath.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-3605060490755709514?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/3605060490755709514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=3605060490755709514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3605060490755709514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3605060490755709514'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/copying-files-to-boot-camp-windows.html' title='Copying files to boot camp windows drive'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-7130319654895114083</id><published>2009-07-28T22:48:00.000-07:00</published><updated>2009-07-28T22:51:41.052-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><title type='text'>LLVM/CLang static analyzer minor problem with iPhone SDK3</title><content type='html'>The &lt;a href="http://stackoverflow.com/questions/1078001/clang-giving-errors-complaining-about-defective-header-file-uilocalizedindexedcol"&gt;solution&lt;/a&gt; is to just tell scan-build to use gcc 4.2.&lt;br /&gt;The command would then be something like this&lt;br /&gt;scan-build --use-cc=/usr/bin/gcc-4.2 -k -V xcodebuild&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-7130319654895114083?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/7130319654895114083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=7130319654895114083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7130319654895114083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7130319654895114083'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/llvmclang-static-analyzer-minor-problem.html' title='LLVM/CLang static analyzer minor problem with iPhone SDK3'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-9004447299928152552</id><published>2009-07-28T15:55:00.000-07:00</published><updated>2009-07-28T16:01:12.230-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sound'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Audacity audio caf file problem with iPhone SDK</title><content type='html'>Today I came across a problem which wasted me an hour of my life! I wanted to add new sound files to my prototype. And I downloaded Audacity to convert some sound files. I exported them as uncompressed CAF files. I had read somewhere that the iphone supports some specific types of encoding, two of which are the U-law and the A-law. I tried both from within Audacity but they didn't won't to play on the simulator/device. But all was good when I saved them as Wav files. Not sure why the CAF files didn't work. Someday I have to dig this problem a bit deeper. For now, I'm happy with the placeholder sounds :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-9004447299928152552?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/9004447299928152552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=9004447299928152552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/9004447299928152552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/9004447299928152552'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/audacity-audio-caf-file-problem-with.html' title='Audacity audio caf file problem with iPhone SDK'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-3858774365142575659</id><published>2009-07-28T01:36:00.000-07:00</published><updated>2009-07-28T01:59:01.207-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><title type='text'>Bought xp-dev.com SVN service subscription</title><content type='html'>I required another repository as I'm doing a quick prototype of a very simple game I had done once with a friend of mine. I have decided to buy a subscription for xp-dev.com, the online SVN service. It has worked pretty well so far and when you upgrade they provide a backup service as well, besides no limitations (diskspace increased to 2g), and multiple repositories. 40$ is a good price for hassle-free SVN service which works without any problems in XCode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-3858774365142575659?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/3858774365142575659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=3858774365142575659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3858774365142575659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3858774365142575659'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/bought-xp-devcom-svn-service.html' title='Bought xp-dev.com SVN service subscription'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-5102241612842517577</id><published>2009-07-27T11:14:00.000-07:00</published><updated>2009-07-27T11:23:57.658-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl ES'/><title type='text'>gluLookAt for iPhone</title><content type='html'>On the iPhone SDK we don't have the glu utility library, so there is no glu functions. The gluLookAt is a very helpful function for conceptualizing a camera. I needed the same behavior since I needed to add some depth. So no more glOrthof, but glFrustumf did not cut it.&lt;br /&gt;&lt;br /&gt;After googling a bit I found some &lt;a href="http://forums.macrumors.com/showpost.php?s=1d9ca12fcdb179228063d11eaa778ac3&amp;amp;p=6299492&amp;amp;postcount=5"&gt;gluLookAt implementation&lt;/a&gt; which is working wonders.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-5102241612842517577?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/5102241612842517577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=5102241612842517577' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5102241612842517577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5102241612842517577'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/glulookat-for-iphone.html' title='gluLookAt for iPhone'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-305388257992227905</id><published>2009-07-25T15:04:00.000-07:00</published><updated>2009-07-25T15:08:54.551-07:00</updated><title type='text'>No problems with Boot Camp and Windows 7</title><content type='html'>The hard disk partitioning and installation of Windows 7 through Boot Camp was smooth as silk. No problems whatsoever. Having said that, my main OS of choice will be Mac OS X. Windows 7 will just be there mainly for some unforeseen peculiarities with some windows file, and minor gaming. Minor because I only got the intel GMA 950 on my macbook, so I'm lucky if I can play Quake3 and Halo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-305388257992227905?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/305388257992227905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=305388257992227905' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/305388257992227905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/305388257992227905'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/no-problems-with-boot-camp-and-windows.html' title='No problems with Boot Camp and Windows 7'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-2329414387847355349</id><published>2009-07-24T19:58:00.000-07:00</published><updated>2009-07-25T01:42:01.896-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows7'/><title type='text'>Preparing to install Windows 7 RC on macbook</title><content type='html'>Before I try installing Windows 7, I decided to make a backup of my macbook using Time Macine. I tried using &lt;a href="http://www.xiotios.com/itimemachine.html"&gt;iTimeMachine&lt;/a&gt; to backup over the network. This small app will simply enable TM to be able to use some network shared folder on my Windows macine. After using this small utility I found out that you could easily do a command in the Terminal as will be shown in the link below.&lt;br /&gt;&lt;br /&gt;I came across 2 problems when trying to use my Windows machine as a sort of Time Capsule. The first was that I needed to &lt;a href="http://appleclinic.wordpress.com/2008/10/30/time-machine-on-nas/"&gt;create a sparce bundle&lt;/a&gt; myself using Disk Utility and copying it over to the remote folder. That wasn't difficult to do as such as higlighted in the above link&lt;br /&gt;&lt;br /&gt;However the second problem wasted me a lot of time. When TM was starting to do the intial backup it would stop complaining about a problem with the network username or password.  This didn't make sense at all as I could browse the folder with Finder using the same exact password. Apparently the solution was to reboot my mac and remove all keys to my windows machine (not just the Time Machine System key). Not sure about the reboot whether that helped or not. Right now I'm waiting for TM to finish so I can start installing Windows 7 RC.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-2329414387847355349?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/2329414387847355349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=2329414387847355349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2329414387847355349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2329414387847355349'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/preparing-to-install-windows-7-rc-on.html' title='Preparing to install Windows 7 RC on macbook'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6440900771191093009</id><published>2009-07-24T02:53:00.001-07:00</published><updated>2009-08-05T13:05:28.689-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Keyframe animation</title><content type='html'>I had already done some keyframe animation code in java for &lt;a href="http://www.swingnstrike.com"&gt;Swing 'n Strike&lt;/a&gt;. I decided to migrate some of the code. The keyframe animation classes consisted mainly of two classes, a Keyframe class and a KeframesCollection class. Each instance of a Keyframe contains information about the position, transparency, frame number/time of the keyframe, what kind of interpolation to use with the next keyframe (linear,easing in/out, etc). The interpolation method I had in java, used to give back an instance of  a Keyframe containing the interpolated values. But with Objective-C (actually, because of C), now I could keep a reference to a primitive value, e.g. any int, any unsigned char, any float, or any point... and the interpolate method would directly manipulate that reference. Awesome!&lt;br /&gt;&lt;br /&gt;It's quite powerful and easy to use. Just create a keyframes collection. Give an address to what it will be modifying, give it some keyframes, and in the update method, we play the keyframe animation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6440900771191093009?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6440900771191093009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6440900771191093009' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6440900771191093009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6440900771191093009'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/keyframe-animation.html' title='Keyframe animation'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-4209012450999945337</id><published>2009-07-22T12:59:00.000-07:00</published><updated>2009-07-22T13:13:14.325-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengl ES'/><title type='text'>Faking transparency without alpha channel</title><content type='html'>I brushed again the gl Blending Functions (glBlendFunc) and I discovered you can fake transparent textures without having an alpha channel. You can have a simple RGB texture with a black background (like a lens flare for example) and then set the blending function to GL_ONE, GL_ONE (Some also make the source factor GL_SRC_ALPHA but since there is no alpha, might as well do it GL_ONE). So the source (pixel which is going to be output) factor and destination (pixel in the existing color buffer) factor are both 1. So if the source (texture) pixel is black (0, 0, 0), and the destination (frame buffer) pixel is red(1, 0, 0), the result would be red(1, 0, 0), i.e. nothing will change in the destination (frame buffer)...  more formally the result is Sf * Sp + Df * Dp,  where:&lt;br /&gt;S = source&lt;br /&gt;D = destination&lt;br /&gt;p = pixel tuple&lt;br /&gt;f = factor&lt;br /&gt;&lt;br /&gt;Using our example, Sf and Df are 1 and we have black (0, 0, 0) and red (1, 0, 0)&lt;br /&gt;1 * (0, 0, 0) + 1 * (1, 0, 0) = (0, 0, 0) + (1, 0, 0) = (1, 0, 0)&lt;br /&gt;Using another example&lt;br /&gt;1 * (0.2, 0, 0) + 1 * (0.4, 0, 0) = (0.6, 0, 0)&lt;br /&gt;&lt;br /&gt;So it's just adding them together. If it's completely black, it's as if it is invisible.&lt;br /&gt;&lt;br /&gt;Of course for accurate transparencies we need the alpha channel and use GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA so that they are blended together properly. If the alpha of the texture pixel is 0.2f then it would be&lt;br /&gt;0.2 * (0.2, 0, 0) + (1-0.2) * (0.4, 0, 0) = (0.04, 0, 0) + ( 0.32, 0, 0) = (0.36, 0, 0)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-4209012450999945337?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/4209012450999945337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=4209012450999945337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4209012450999945337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4209012450999945337'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/faking-transparency-without-alpha.html' title='Faking transparency without alpha channel'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-4559073533926747803</id><published>2009-07-22T12:42:00.000-07:00</published><updated>2009-07-22T13:13:58.905-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengl ES'/><title type='text'>glTexEnvi and GL_REPLACE</title><content type='html'>So I wanted something really simple. A textured object (with alpha channel) and I wanted it to fade it out, and perhaps color it at run time (instead of creating different colored textures).&lt;br /&gt;&lt;br /&gt;I knew that I should just give the object texture coordinates, and color information (besides vertex positions). Simple but it wasn't working. It was like it was not taking into consideration the color info at all. So I played around with a demo which I use as my playground and the same code worked. I was going nuts and it was obvious I was missing something. I was looking at the gl commands in the demo, and I had done all of those - enabling blending, enabling textureing, enabling vertex/texture/color arrays, blending function etc. Still nothing. It then clicked that by default it must be working automagically in the demo, and I must have some line of code which is changing the default behaviour and I spotted that line of coding which was setting the texture mode in glTexEnvi to GL_REPLACE which basically will discard the color information. I had completely forgotten about what that line was doing. Ah well...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-4559073533926747803?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/4559073533926747803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=4559073533926747803' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4559073533926747803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4559073533926747803'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/glblendfunc-and-gltexenvi.html' title='glTexEnvi and GL_REPLACE'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-1955865738344223521</id><published>2009-07-12T10:57:00.000-07:00</published><updated>2009-07-12T10:58:39.255-07:00</updated><title type='text'>Objective-C introduction</title><content type='html'>I have also found this&lt;a href="http://www.cocoadevcentral.com/d/learn_objectivec/"&gt; quick tips&lt;/a&gt; for Objective-C at Cocoa Dev Central. Wish I had found this earlier :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-1955865738344223521?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/1955865738344223521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=1955865738344223521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1955865738344223521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1955865738344223521'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/objective-c-introduction.html' title='Objective-C introduction'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-7971464758984333462</id><published>2009-07-12T10:52:00.000-07:00</published><updated>2009-07-12T11:00:41.352-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Selection List in UIKit</title><content type='html'>I also dared using a selection list using the UITableViewController class on top of openGL view. I used a modified version of the &lt;a href="http://iphonedevelopment.blogspot.com/2009/02/generic-selection-list-controller.html"&gt;generic class&lt;/a&gt; by Jeff Lamarche. This &lt;a href="http://vimeo.com/1655681?hd=1"&gt;video tutorial&lt;/a&gt; helped as well to get an idea of how the code is organised for UITableViews.&lt;br /&gt;&lt;br /&gt;So now I got a pretty decent on-the-fly level editor for the game. I can also select powerups for enemy groups and draw the enemies paths, etc. Still needs polishing, but it's coming together. This week I will try do a decent level, but for now with just one enemy type, and no boss.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-7971464758984333462?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/7971464758984333462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=7971464758984333462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7971464758984333462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7971464758984333462'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/selection-list-in-uikit.html' title='Selection List in UIKit'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-1978010312901552097</id><published>2009-07-03T12:47:00.000-07:00</published><updated>2009-07-03T12:53:27.650-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Texture atlas with Photoshop slicing</title><content type='html'>I needed to create a texture atlas and I wanted to use a tool to read off the coordinates and manage it easily. I tried looking at MapWin but it looked too complicated. So I opted for using Photoshop and just slice the images. But not to create separate images. I just use slicing for easily getting the coordinates and dimensions of the slice. If you double click on a slice with edit slice tool, you will get that information in the dialog box that comes up. That's all I needed. It would be a different story if I had hundreds of images but for now it's manageable. Maybe because it is still a prototype :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-1978010312901552097?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/1978010312901552097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=1978010312901552097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1978010312901552097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1978010312901552097'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/07/texture-atlas-with-photoshop-slicing.html' title='Texture atlas with Photoshop slicing'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-3440634582799981080</id><published>2009-06-30T17:41:00.001-07:00</published><updated>2009-06-30T17:47:47.136-07:00</updated><title type='text'>Saving and Loading Level Data</title><content type='html'>I was tempted to use a plist to save and load data, but I want the data to be as disk-space efficient as possible, so I will be doing a binary saving and loading of the data of the elements that will be dropped in a level while using the in-game editor.&lt;br /&gt;&lt;br /&gt;NSMutableData/CFMutableDataRef did the trick for saving the data, by using CFDataAppendBytes(). Then I created the file using NSFileManager and simply dumped the contents into the created file&lt;br /&gt;&lt;br /&gt;I used NSData for loading the data. I kept track of the offset and passed the pointer of the offset to the objects to load themselves up, and modified that offset which is being passed as a pointer. For loading I simply used getBytes:range, e.g. [data getBytes:&amp;amp;type range:NSMakeRange((*offset)++, 1)];&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-3440634582799981080?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/3440634582799981080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=3440634582799981080' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3440634582799981080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3440634582799981080'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/06/saving-and-loading-level-data.html' title='Saving and Loading Level Data'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-5784356065098869246</id><published>2009-06-30T17:35:00.000-07:00</published><updated>2009-06-30T17:40:22.695-07:00</updated><title type='text'>Mixing UIKit and Opengl</title><content type='html'>For my in-game editor I wanted to create buttons and some textfields, however I did not want to re-invent the wheel and also did not want to complicate switching between views since the UI for the editor will not be complicated at all.&lt;br /&gt;&lt;br /&gt;I know that UIKit elements should not be overlayed on opengl because of a performance hit, but it doesn't seem to effect it that much so far. It's pretty simple to create a UIButton and then just add it to the window: [window addSubview:b];&lt;br /&gt;&lt;br /&gt;I created a helper method to quickly create consistent looking buttons and I'm using some iPhone images I extracted from the sdk. I'm quite happy with the cleanliness of UIKit, I must say.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-5784356065098869246?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/5784356065098869246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=5784356065098869246' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5784356065098869246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5784356065098869246'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/06/mixing-uikit-and-opengl.html' title='Mixing UIKit and Opengl'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6160880983176377693</id><published>2009-06-29T07:25:00.000-07:00</published><updated>2009-06-29T07:31:27.008-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Using iPhone OS images</title><content type='html'>I've come across this &lt;a href="http://snipplr.com/view.php?codeview&amp;amp;id=13894"&gt;code snippet&lt;/a&gt; which extracts the images used by the iPhone OS. You just need to copy paste the code somewhere, e.g. in your delegate, then create the method(selector) signatures in the header file and just execute it when the app finishes loading by calling [self extractArtwork:self];&lt;br /&gt;&lt;br /&gt;It takes a couple of seconds to finish, and I would run it from the simulator. You will find all the PNGs in &lt;em&gt;/Users/[you username]/Library/Application Support/iPhone Simulator/User/Applications/[app guid]/Documents/&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;You can then go through them and see which iPhone OS images you want to use for your app. I suggest you remove the code after doing it once.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6160880983176377693?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6160880983176377693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6160880983176377693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6160880983176377693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6160880983176377693'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/06/using-iphone-os-images.html' title='Using iPhone OS images'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-7487090522397464840</id><published>2009-06-28T06:50:00.000-07:00</published><updated>2009-06-28T06:59:00.874-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Multitouch start and end events</title><content type='html'>I just found out that it's not always the case that you may get the multitouch start and end events, i.e. you can get a multitouch move without a multitouch start. Or you could lift off your fingers but not get a multitouch end event. You have to precisely lift off together your fingers to get a multitouch end event. So it's difficult to know whether the user has two fingers or just one on the screen, because he could have two finger on the screen, but only moving one finger, so you would get a single touch event.&lt;br /&gt;&lt;br /&gt;This is very annoying. I want to do an in-game quick editor where you can pinch to zoom in/out with two fingers and drag with one finger. However I haven't figured out how to do it properly because of the issue described above. So far I have set a flag to true whenever a multitouch start/move is detected and turned the flag off on the end event. So when this flag is on, I cannot do dragging. However, the user would need to do a proper lift off of his two fingers to trigger a multitouch end event. Will leave it as it is for now, unless I get another idea how to solve the issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-7487090522397464840?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/7487090522397464840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=7487090522397464840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7487090522397464840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/7487090522397464840'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/06/multitouch-start-and-events.html' title='Multitouch start and end events'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-3149357223459043757</id><published>2009-06-26T15:30:00.000-07:00</published><updated>2009-06-26T15:41:33.664-07:00</updated><title type='text'>Instruments and mach_msg_trap</title><content type='html'>I think I'm starting to get the hang of Instruments, sort of. Ok so in my previous post I didn't realize what that mach_msg_trap was about. Apparently, it's got something to do with the thread doing nothing (blocked), like waiting for the next frame to start (good) or when allocing and releasing a lot of objects (bad).&lt;br /&gt;&lt;br /&gt;Will see if the above still holds after I get more experience playing around with Instruments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-3149357223459043757?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/3149357223459043757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=3149357223459043757' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3149357223459043757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3149357223459043757'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/06/instruments-and-machmsgtrap.html' title='Instruments and mach_msg_trap'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-8299904734544738292</id><published>2009-06-24T04:45:00.001-07:00</published><updated>2009-06-26T04:08:15.625-07:00</updated><title type='text'>Optimizing OpenGL ES for iPhone OS</title><content type='html'>Ok so my shmup prototype is firing a lot of bullets now and I'm seeing that it is slowing down so I tried sampling the app with Instruments but sincerely I didn't make heads or tails of what's happening. The cpu is being used mostly by mach_msg_trap. I tried drilling down but it seemed like it wasn't related with my code. I still have to learn how to read the results of Instruments. For me it doesn't make any sense that my code is like using 10 samples, and other non-related libraries are taking 2000+ samples.&lt;br /&gt;&lt;br /&gt;So anyways, after seeing ngmoco's presentation on how to optimize opengl (also refer to &lt;a href="http://developer.apple.com/iphone/library/technotes/tn2008/tn2230.html"&gt;apple's documentation&lt;/a&gt;), I thought that I should start optimizing my opengl calls. So I created a wrapper class which batches vertices bound with a texture so I can send all the bullets at one go rather than one by one. But that still didn't improve the performance.&lt;br /&gt;&lt;br /&gt;It turned out that while I was coding the collision detection for bullets I had a TODO that I had written some weeks ago saying that I should to optimize it :). Basically I was creating several Vector objects and releasing them for every collision check. That was killing the CPU, but strangely enough the Bullet's update method only had 10 samples marked. Again... I need to learn how to read the results from Instruments. After creating some temporary vectors just once and reusing them, improved the performance.&lt;br /&gt;&lt;br /&gt;Have to go try understand the results given by Instruments now... otherwise such problems will come back in my face pretty soon. The worse thing would be that I start optimizing code randomly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8299904734544738292?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8299904734544738292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8299904734544738292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8299904734544738292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8299904734544738292'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/06/optimizing-opengl-es-for-iphone-os.html' title='Optimizing OpenGL ES for iPhone OS'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-824707306437400262</id><published>2009-06-21T15:49:00.000-07:00</published><updated>2009-06-21T15:53:36.741-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Migrating to iPhone OS 3.0</title><content type='html'>Ok, so I found some time finally to go through the emails that Apple had sent me regarding the OS 3.0 GM seed, but when I tried accessing the link to see the checklist for migrating an app, it kept on redirecting me to the login page...arghhhhhh. This is also happening if I try to access the forums. Will contact Apple support.&lt;br /&gt;&lt;br /&gt;Meanwhile I'm downloading the huge OS 3.0 SDK as well (since I'm still on Leopard... the Snow Leopard version is approx 1.5g smaller). I don't have a clue from where to get the GM seed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-824707306437400262?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/824707306437400262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=824707306437400262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/824707306437400262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/824707306437400262'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/06/migrating-to-iphone-os-30.html' title='Migrating to iPhone OS 3.0'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-2343981429270618780</id><published>2009-06-21T15:43:00.000-07:00</published><updated>2009-06-21T15:49:30.151-07:00</updated><title type='text'>Interesting Blog and iPhone Development Videos</title><content type='html'>I have found out that Stanford's University have some iPhone development related videos under the iTunes U section. They also had a video on OpenGL optimization specifically for the iPhone delivered by a developer of ngmoco...the creators of several hits on the iPhone including the finger maze game and the topple games. Through this video, I learned about &lt;a href="http://gamemakers.ngmoco.com/"&gt;ngmoco's blog&lt;/a&gt;. Very interesting.&lt;br /&gt;&lt;br /&gt;So I should find some time to implement the mentioned optimizations including&lt;br /&gt;- batching the vertices into one huge array, including texture coordinates and color info rather then sending each object individually&lt;br /&gt;- use texture compression&lt;br /&gt;- use one huge texture&lt;br /&gt;- keeping in mind that I should use less than 24megs texture memory&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-2343981429270618780?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/2343981429270618780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=2343981429270618780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2343981429270618780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2343981429270618780'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/06/interesting-blog-and-iphone-development.html' title='Interesting Blog and iPhone Development Videos'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-1620680079830468476</id><published>2009-06-21T15:23:00.000-07:00</published><updated>2009-06-21T15:41:27.677-07:00</updated><title type='text'>Accelerometer calibration</title><content type='html'>Several weeks have passed and I'm really busy with my day job so things are going really slow on the prototype. I've got some basic weapon pickups code, and weapon placement similar to xenon2's mechanism. Will see how it feels later on. I have also migrated some bezier path code I had done for Swing 'n Strike, where I can follow a bezier path with constant speed.&lt;br /&gt;&lt;br /&gt;The spaceship is controlled with the accelerometer. I would like to keep the finger off from the screen as much as possible since the game will be quite hectic and a finger on the screen would would obstruct the user's view.&lt;br /&gt;&lt;br /&gt;However I would like to calibrate, so to speak, the iPhone's position, i.e. record the offset when the game is launched and assume that position to be the neutral center position of the spaceship. It turned out to be very easy to do, when you know how the accelerometer works. I was puzzled at first and thought that the acceloremeter would only give me values when I moved the iPhone around. It is interesting to know that it will always give you a reading for each axis, roughly between -1 and 1 when it's not moving. Why? Well, gravity (which is acceleration... approx 9.8m/sec^2) is acting on the device). So that 1g acting on it will be represented as a vector acting on the accelerometers. You just record them in some offsets and then subtract that during the game. I'm guessing that astronauts in space are screwed since there will be no gravity acting on the device :) &lt;br /&gt;&lt;br /&gt;So in your accelerometer:didAccelerate: method you need to record the starting offsets if you haven't already done so, and the subtract them from the actual readings later on during the game. I also discovered that the very first view readings of the accelerometer are bogus, so I skip the first few frames. (Averaging a bunch of frames would probably be better)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration {&lt;br /&gt; static int framesLeftToRecord = 30; //the number of frames to skip to record the offset&lt;br /&gt; static BOOL recordOffset = YES; //whether we should record the offset or not&lt;br /&gt; //What we are doing is that we let some time pass to get valid acceleration values as offsets&lt;br /&gt; if (framesLeftToRecord == 0)&lt;br /&gt; {&lt;br /&gt;  if (recordOffset)&lt;br /&gt;  {&lt;br /&gt;   NSLog(@"setting start acceloremeter %f,%f,%f",acceleration.x, acceleration.y, acceleration.z);&lt;br /&gt;   _startAccelerometer[0] = acceleration.x;&lt;br /&gt;   _startAccelerometer[1] = acceleration.y;&lt;br /&gt;   _startAccelerometer[2] = acceleration.z;&lt;br /&gt;   recordOffset = NO;&lt;br /&gt;  }&lt;br /&gt; } else&lt;br /&gt; {&lt;br /&gt;  framesLeftToRecord--;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; //Use a basic low-pass filter to only keep the gravity in the accelerometer values&lt;br /&gt; _accelerometer[0] = (acceleration.x - _startAccelerometer[0]) * kFilteringFactor + (_accelerometer[0]) * (1.0 - kFilteringFactor);&lt;br /&gt; _accelerometer[1] = (acceleration.y - _startAccelerometer[1]) * kFilteringFactor + (_accelerometer[1]) * (1.0 - kFilteringFactor);&lt;br /&gt; _accelerometer[2] = (acceleration.z - _startAccelerometer[2]) * kFilteringFactor + (_accelerometer[2]) * (1.0 - kFilteringFactor);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-1620680079830468476?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/1620680079830468476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=1620680079830468476' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1620680079830468476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1620680079830468476'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/06/accelerometer-calibration.html' title='Accelerometer calibration'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-1277092599061734601</id><published>2009-06-01T18:43:00.001-07:00</published><updated>2009-06-01T18:51:28.809-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Started a shoot'em up prototype</title><content type='html'>Last week I decided that the puzzle prototype I was doing was boring to play so I stopped that and started on a shoot'em up prototype. It will be a 2.5D game, but currently the view is just 2D. I will see how I can change the view soon so enemies appear to fly in, in 3d.&lt;br /&gt;&lt;br /&gt;I've got some interested gameplay ideas to take advantage of the touch interface. The major problem I'm seeing for the development of this game is content. A shoot'em up needs to look nice. For now I'm using squares, spheres and some ugly graphics. This simply won't cut it. When the gameplay feels right, I will need someone to help me with the graphics.&lt;br /&gt;&lt;br /&gt;Well, at least the quick starfield I've done looks semi-decent :). It's simply three layers of stars, each layer moving slower and the stars simply wrap-around the screen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-1277092599061734601?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/1277092599061734601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=1277092599061734601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1277092599061734601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1277092599061734601'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/06/started-shootem-up-prototype.html' title='Started a shoot&apos;em up prototype'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-3890776730395179513</id><published>2009-05-23T10:32:00.000-07:00</published><updated>2009-05-23T10:38:51.608-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>random() on the iphone SDK giving same values</title><content type='html'>I obviously had changed the random seed with srand(time(NULL)) however when generating 4 random numbers they were always the same although always different with each run. I thought I was going insane as when I tried debugging it step by step the numbers generated were different.&lt;br /&gt;&lt;br /&gt;After googling a bit I found that it is better to use &lt;a href="http://developer.apple.com/documentation/Darwin/Reference/Manpages/man3/arc4random.3.html"&gt;arc4random()&lt;/a&gt;. That fixed it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-3890776730395179513?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/3890776730395179513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=3890776730395179513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3890776730395179513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3890776730395179513'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/05/random-on-iphone-sdk-giving-same-values.html' title='random() on the iphone SDK giving same values'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-4311950501877756716</id><published>2009-05-23T06:07:00.000-07:00</published><updated>2009-05-23T06:10:39.476-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><title type='text'>Breakpoints stopped working in XCode</title><content type='html'>Suddenl, the breakpoints stopped working. Usually I just clean all targets and empty XCode's cache. But this time that trick didn't work. Then I found this &lt;a href="http://stackoverflow.com/questions/64790/why-arent-my-breakpoints-working-in-xcode"&gt;solution&lt;/a&gt;, to disable Load Symbols Lazily from XCode Preferences-&gt;Debugging. That worked like a charm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-4311950501877756716?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/4311950501877756716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=4311950501877756716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4311950501877756716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4311950501877756716'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/05/breakpoints-stopped-working-in-xcode.html' title='Breakpoints stopped working in XCode'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-8658620110098564737</id><published>2009-05-20T11:35:00.000-07:00</published><updated>2009-05-20T11:39:57.713-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Got my Apple Developer Program Activation Code</title><content type='html'>Yippeee! Finally after 3 weeks!&lt;br /&gt;&lt;br /&gt;This morning I sent Apple an email telling them that this sending of the activation code was agrivating. I told them that I bought a macbook, switched from windows, bought an ipod touch, but I'm still waiting for the activation code. Later this afternoon I just received the activation code.&lt;br /&gt;&lt;br /&gt;Setting up the device was quite straightforward. They provide a very helpful wizard-like experience. But then I got a CodeSign error when I tried Build&amp;amp;Go. I discovered that the Code Signing properties in the project were not set. I just had to select the developer provisioning certificate and presto... I was debugging my buggy prototype on my iPod touch :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8658620110098564737?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8658620110098564737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8658620110098564737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8658620110098564737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8658620110098564737'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/05/got-my-apple-developer-program.html' title='Got my Apple Developer Program Activation Code'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-5546473073863339330</id><published>2009-05-18T05:57:00.000-07:00</published><updated>2009-05-18T07:09:37.761-07:00</updated><title type='text'>Got my cracked iPod touch</title><content type='html'>Have been busy preparing for a web development course I'm giving right now.&lt;div&gt;I've also been busy with making my &lt;a href="http://time2time.me/iphone"&gt;time logging web app&lt;/a&gt; compatible with iphone. I will soon publish it on apple's webapp listings. &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've got my iPod touch... ok it's cracked, but I will replace the glass later.&lt;/div&gt;&lt;div&gt;It's a pretty cool device, very addictive actually.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm still trying to get the fax through the apple developer program...&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-5546473073863339330?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/5546473073863339330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=5546473073863339330' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5546473073863339330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5546473073863339330'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/05/got-my-cracked-ipod-touch.html' title='Got my cracked iPod touch'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-8683144641343385953</id><published>2009-05-09T04:04:00.000-07:00</published><updated>2009-05-09T04:12:35.645-07:00</updated><title type='text'>iPhone-izing a webapp</title><content type='html'>I need a break from Objective-C :) after fixing some glitches in the collision detection. I'm still waiting for my iPod-touch and yesterday I resent the fax to enroll to the apple developer program. Hope this time they received it fine.&lt;br /&gt;&lt;br /&gt;So I'm currently tempted to convert my mini &lt;a href="http://time2time.me"&gt;time management webapp&lt;/a&gt; to be iPhone-friendly. My eclipse/rad rails setup is still on my windows machine, so I needed a quick way how to test the changes on a simulated iphone. I found this quick &lt;a href="http://labs.blackbaud.com/NetCommunity/article?artid=662"&gt;iphone Windows simulator&lt;/a&gt; that uses Safari for Windows 3.2 underneath (webkit). It's not perfect, but it does the job for now.&lt;br /&gt;&lt;br /&gt;I need the CSS styles and images used to make the iphone native apps look and feel. And in fact there is this &lt;a href="http://code.google.com/p/iui/"&gt;iui open source project&lt;/a&gt; which gives you the necessary CSS and samples to get you started quickly.&lt;br /&gt;&lt;br /&gt;Will see how it goes... the samples provided seem to be exactly what I need!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8683144641343385953?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8683144641343385953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8683144641343385953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8683144641343385953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8683144641343385953'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/05/iphone-izing-webapp.html' title='iPhone-izing a webapp'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-8169482622266447746</id><published>2009-05-06T09:38:00.000-07:00</published><updated>2009-05-06T09:53:26.722-07:00</updated><title type='text'>Windows 7 RC on my Macbook</title><content type='html'>I downloaded the Windows 7 RC which should be fully working until March 2010, after which they said it will start to shutdown every 2hrs.&lt;br /&gt;&lt;br /&gt;I found a &lt;a href="http://blogs.vmware.com/teamfusion/2009/05/windows-7-on-mac-with-vmware-fusion-a-practical-guide-revisited.html"&gt;how-to run Windows 7 RC on a Mac&lt;/a&gt; using VMWare but first I downloaded the Windows 7 RC from&lt;a href="http://www.microsoft.com/windows/windows-7"&gt; Microsoft&lt;/a&gt;. Just need a Live account.&lt;br /&gt;&lt;br /&gt;Ok, why VMWare and not bootcamp? I don't want to depend on Windows. I just want it to be able to run something quickly on Windows without having to reboot. I only plan to do this until I phase out Windows from my life, if I ever manage. I don't want to be switching between computers/OSes. I'm already frying my brain with switching between shortcuts and swapped positions of the minimize/maximize/close buttons.&lt;br /&gt;&lt;br /&gt;The installation was a breeze, although it took some time to finish, but maybe because I only have 1gig on my macbook. It's a pain running a win7 with just 512megs reserved for it, when the recommended amount is 1gig! My macbook came to a crawl haha. First time I saw my macbook on its knees. I will be upgrading its RAM this summer. So I will retry running it then. For now I suggest that if you have just 1gig in your macbook, give up and don't waste your time.&lt;br /&gt;&lt;br /&gt;Final note, I have an original Windows Vista, and I never got myself to install it. It's crap. I have worked with it for a year where I used to work, 8+ hours a day and it was a nightmare. I think Vista should have remained a beta. But Windows 7 looks promising. Personally I prefer the new Windows taskbar than the Mac's dock.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8169482622266447746?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8169482622266447746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8169482622266447746' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8169482622266447746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8169482622266447746'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/05/windows-7-rc-on-my-macbook.html' title='Windows 7 RC on my Macbook'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-8150704544376407994</id><published>2009-05-05T10:46:00.000-07:00</published><updated>2009-05-05T12:41:04.658-07:00</updated><title type='text'>Fast flood fill implementation</title><content type='html'>I'm keeping an array of bytes (unsigned char) to keep some collision map. I could probably later on improve on it to make it use a bit for each pixel, but for now I'm going to keep it simple.&lt;br /&gt;&lt;br /&gt;At first I was going to create a gray scale CGBitmapContext to store the data, but I wasn't going to actually draw it. Just wanted a collision map to be used underneath so I opted for a simple array.&lt;br /&gt;&lt;br /&gt;Of course this meant that I needed some &lt;a href="http://www.cs.unc.edu/~mcmillan/comp136/Lecture6/Lines.html"&gt;Bresenham line algorithm implementation&lt;/a&gt; and also a quick floodfill for the game prototype I'm doing. For the floodfill I first did a naive recursive version of it, but that can easily give you a stack overflow. So I did some searches on faster implementations. I found a couple. The &lt;a href="http://www.codeproject.com/KB/GDI/QuickFill.aspx"&gt;QuickFill algorithm&lt;/a&gt; seemed a bit overkill to convert it to Objective-C (and looked complicated as well). Remember I'm still prototyping, so it's not the right time for a lot of optimizations. I settled for the implementation found at &lt;a href="http://www.codecodex.com/wiki/index.php?title=Implementing_the_flood_fill_algorithm"&gt;codecodex&lt;/a&gt; which seems to be a compromise between recursive and iterative approach. Seems to do the job for now. Not the fastest, but better than the pure recursive version.&lt;br /&gt;&lt;br /&gt;Need to fix some collision detection problems next, and also double check the line algorithm, since I think it's not behaving right at the edges right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8150704544376407994?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8150704544376407994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8150704544376407994' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8150704544376407994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8150704544376407994'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/05/fast-flood-fill-implementation.html' title='Fast flood fill implementation'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-5745757850315067971</id><published>2009-05-04T13:28:00.000-07:00</published><updated>2009-05-04T13:43:51.150-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><title type='text'>Mac - I'm Lovin' it</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-Bme_EOsh_o/Sf9TNtHhrcI/AAAAAAAAASQ/9toPlNoH7Vk/s1600-h/Mac_lovin_it.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 300px; height: 266px;" src="http://1.bp.blogspot.com/_-Bme_EOsh_o/Sf9TNtHhrcI/AAAAAAAAASQ/9toPlNoH7Vk/s320/Mac_lovin_it.jpg" alt="" id="BLOGGER_PHOTO_ID_5332071978744524226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It's been slightly over a month with my second hand MacBook. I'm simply lovin' it. I'm still migrating from windows. I'm only using my windows machine through remote desktop. In fact I unplugged the monitor, keyboard and mouse and hooked them to the laptop :)&lt;br /&gt;&lt;br /&gt;Still getting used to XCode, Objective-C and OpenGl but it's fun.&lt;br /&gt;&lt;br /&gt;The MacBook came pre-installed with MS Office 2008, but I wasn't impressed with it. I must admit that MS Office is better on the Windows platform, more responsive.&lt;br /&gt;&lt;br /&gt;The other complaint I got is when minimizing a window, won't get restored when you switch back to the application. It makes sense when you think that the Macs are application oriented and not window oriented, but still is frustrating having to get hold of the mouse to go over the dock and restore it. The work around using Command-H to hide the window instead.&lt;br /&gt;&lt;br /&gt;But besides these minor details, I still think that a mac is better than windows. We'll see how I'll feel in a couple of months down the line.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-5745757850315067971?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/5745757850315067971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=5745757850315067971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5745757850315067971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5745757850315067971'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/05/mac-im-lovin-it.html' title='Mac - I&apos;m Lovin&apos; it'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-Bme_EOsh_o/Sf9TNtHhrcI/AAAAAAAAASQ/9toPlNoH7Vk/s72-c/Mac_lovin_it.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-8482756764953878515</id><published>2009-05-02T20:12:00.000-07:00</published><updated>2009-05-02T20:20:48.553-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>Be careful of constructor helper methods</title><content type='html'>I forgot that constructor helper methods (e.g. +arrayWithCapacity) would make the array autoreleased leading to an EXC_BAD_ACCESS. Still getting used to the reference counting mechanism and conventions :).&lt;br /&gt;&lt;br /&gt;I was using such a method for an instance variable. The solution was either to retain it or to use the alloc method, which gives you an object with a retain count of 1.&lt;br /&gt;&lt;br /&gt;_replayLines = [[NSMutableArray alloc] initWithCapacity:5];&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8482756764953878515?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8482756764953878515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8482756764953878515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8482756764953878515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8482756764953878515'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/05/becareful-of-constructor-helper-methods.html' title='Be careful of constructor helper methods'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-1025564144582170412</id><published>2009-05-02T04:21:00.000-07:00</published><updated>2009-05-02T04:54:16.300-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>iPod Touch soon on its way</title><content type='html'>I have bought a non-badly cracked iPod touch 8gig 2nd generation on ebay - want to keep expenses as low as possible. However since the guy had several of them, he shipped the wrong one. The screen is badly cracked. Will have to replace the glass later.&lt;br /&gt;&lt;br /&gt;Can't wait to be able to test on the device directly! Just have to wait for the iPod touch to arrive in Malta from the US, since I had to ship it by proxy to a friend of mine who lives there. Here's a photo he took for me to show me what he called "almost artistic" cracks.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-Bme_EOsh_o/Sfw0FrXvflI/AAAAAAAAASI/sjP3CKOKP_k/s1600-h/ipod_touch_screen_cracked.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_-Bme_EOsh_o/Sfw0FrXvflI/AAAAAAAAASI/sjP3CKOKP_k/s320/ipod_touch_screen_cracked.jpg" alt="" id="BLOGGER_PHOTO_ID_5331193331046121042" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-1025564144582170412?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/1025564144582170412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=1025564144582170412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1025564144582170412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1025564144582170412'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/05/ipod-touch-soon-on-its-way.html' title='iPod Touch soon on its way'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-Bme_EOsh_o/Sfw0FrXvflI/AAAAAAAAASI/sjP3CKOKP_k/s72-c/ipod_touch_screen_cracked.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-3493624879579474917</id><published>2009-05-02T04:13:00.000-07:00</published><updated>2009-05-02T04:21:23.978-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Making reproducible bugs</title><content type='html'>I got some bugs lurking around related with collision detection. So the first rule when debugging is to make the bugs reproducible. I'm currently trying to record the user interactions and frame number at which they occurred, into an NSMutableArray, and then dumping it to NSDefaults when exiting the application (should be enough for now). Then I will load them back up when the application is relaunched. At the frame number at which the user interactions (basically lines) were originally made, I recreate the lines. Also I had to remove any randomness if I want that each time I play the recorded actions, I get the same outcomes (i.e. bugs). So the ball(s) will always start from the same position.&lt;br /&gt;&lt;br /&gt;Will try to finish this interactions playback later on. Have to prepare for next week's lectures.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-3493624879579474917?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/3493624879579474917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=3493624879579474917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3493624879579474917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3493624879579474917'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/05/making-reproducible-bugs.html' title='Making reproducible bugs'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-1728983358015522989</id><published>2009-04-28T00:08:00.000-07:00</published><updated>2009-04-28T00:13:56.760-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Interesting iPhone Development Presentation</title><content type='html'>Snappy Touch, a company owned by Noel Llopis who previously has worked on massive console games, is now working on his own start-up. Just a one-person "team" rather than two hundred. He has gone solo and started making iPhone games. He has made an interested presentation at GDC 09 and he shares some knowledge on the process of getting aboard this interesting journey.&lt;br /&gt;&lt;br /&gt;Check out the &lt;a href="http://gamesfromwithin.com/?p=393"&gt;GDC 09 presentation&lt;/a&gt; including audio. You can sink the slides manually with the audio pretty easily.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-1728983358015522989?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/1728983358015522989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=1728983358015522989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1728983358015522989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/1728983358015522989'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/04/interesting-iphone-development.html' title='Interesting iPhone Development Presentation'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-8435435070536324208</id><published>2009-04-24T17:01:00.000-07:00</published><updated>2009-04-24T17:08:26.594-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>The pains of converting from Java to Objective-C</title><content type='html'>I'm still compiling a list of the annoyances I encounter when converting from Java to Objective-C, which I will publish soon. But so far the worst one was to be careful when using the math functions like abs instead of fabs! The abs function works with ints and if you try using it with a float, you are going to get some bogus result. Why why aren't such methods overloaded!?!&lt;br /&gt;&lt;br /&gt;Wasted a good two hours trying to hunt down such a bug in some code which worked fine in actionscript.&lt;br /&gt;&lt;br /&gt;Mental note: remember as well sinf, cosf, asinf, acosf&lt;br /&gt;&lt;br /&gt;Migrating current actionscript code to Xcode... check :D&lt;br /&gt;Next task...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8435435070536324208?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8435435070536324208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8435435070536324208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8435435070536324208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8435435070536324208'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/04/pains-of-converting-from-java-to.html' title='The pains of converting from Java to Objective-C'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-2204189527260886832</id><published>2009-04-23T16:34:00.001-07:00</published><updated>2009-04-24T14:30:02.147-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><title type='text'>Refactoring in XCode needs improvement</title><content type='html'>I'm used to Eclipse refactoring, and the refactoring capabilities in XCode compare to Eclipse are abysmal to say the least. Ok, I know Java is much easier to parse, and so the refactoring tools are "easier" to do, but I would expect that at least renaming a field of an Objective-C class would be done across the header and implementation files, and not just the header file. So instead I have to the use the rename dialog box, which of course is very error prone.&lt;br /&gt;&lt;br /&gt;Maybe I'm doing something wrong, but I don't see what that could be. I'm just selecting the field, Edit-&gt;Refactor-&gt;Rename.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-2204189527260886832?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/2204189527260886832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=2204189527260886832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2204189527260886832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2204189527260886832'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/04/refactoring-in-xcode-needs-improvement.html' title='Refactoring in XCode needs improvement'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-4348945629172160883</id><published>2009-04-17T21:03:00.000-07:00</published><updated>2009-04-17T23:10:36.640-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Killing bugs before they happen on the iPhone</title><content type='html'>You can easily set up a Static Analyzer, which will check your Objective-C code for bugs, like memory leaks, dead assignments, etc, without actually running the app on the iPhone (that's why "static"). Check out this tutorial to setup the &lt;a href="http://www.oiledmachine.com/posts/2009/01/06/using-the-llvm-clang-static-analyzer-for-iphone-apps.html"&gt;LLVM/Clang Static Analyzer for iPhone Apps&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You need to dirty your hands slightly with the Terminal to run the analyzer. You might want to add analyzer to your &lt;a href="http://forums.macrumors.com/showthread.php?t=315941"&gt;path to your .bash_profile&lt;/a&gt; so that you can run the analyzer from anywhere.&lt;br /&gt;&lt;br /&gt;When you run the analyzer, you will see a bug report with links to your source files to show you the exact line where you have a bug. Sweet!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-Bme_EOsh_o/SeluHirsiKI/AAAAAAAAAR4/1PTPN1ZGo6Y/s1600-h/StaticAnalyzerReport.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 201px;" src="http://2.bp.blogspot.com/_-Bme_EOsh_o/SeluHirsiKI/AAAAAAAAAR4/1PTPN1ZGo6Y/s320/StaticAnalyzerReport.png" alt="" id="BLOGGER_PHOTO_ID_5325909110190540962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-Bme_EOsh_o/SeluOhhWTXI/AAAAAAAAASA/RcrbC1103Fc/s1600-h/LeakReport.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 100px;" src="http://4.bp.blogspot.com/_-Bme_EOsh_o/SeluOhhWTXI/AAAAAAAAASA/RcrbC1103Fc/s320/LeakReport.png" alt="" id="BLOGGER_PHOTO_ID_5325909230137789810" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-4348945629172160883?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/4348945629172160883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=4348945629172160883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4348945629172160883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4348945629172160883'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/04/killing-bugs-before-they-happen-on.html' title='Killing bugs before they happen on the iPhone'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-Bme_EOsh_o/SeluHirsiKI/AAAAAAAAAR4/1PTPN1ZGo6Y/s72-c/StaticAnalyzerReport.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-3310661024103052755</id><published>2009-04-17T09:53:00.000-07:00</published><updated>2009-04-17T21:03:32.841-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Drawing a Textured Line in OpenGL ES</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-Bme_EOsh_o/Sei4xterFZI/AAAAAAAAARw/tvK2-zjSl-c/s1600-h/TexturedLines.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 172px; height: 320px;" src="http://4.bp.blogspot.com/_-Bme_EOsh_o/Sei4xterFZI/AAAAAAAAARw/tvK2-zjSl-c/s320/TexturedLines.png" alt="" id="BLOGGER_PHOTO_ID_5325709723526960530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Currently I'm still playing around with the CrashLanding demo app as my sandbox :) Those red spotted lines are my textured lines.&lt;br /&gt;&lt;br /&gt;I wanted to draw a textured line and opengl doesn't support drawing textured lines as such. You need to create a polygon (actually two triangles), and texture them.&lt;br /&gt;&lt;br /&gt;So I created a simple class which takes two points, calculates the length and angle with the horizontal line. Then I calculate the vertex coordinates and the texture coordinates.&lt;br /&gt;&lt;br /&gt;These coordinates are generated as if I am creating a horizontal line. And then before drawing I simply rotate the model view matrix. The vertex coordinates would be something like this&lt;br /&gt;0, -w/2&lt;br /&gt;0, w/2&lt;br /&gt;length, w/2&lt;br /&gt;length, -w/2&lt;br /&gt;where length is the length of the line and w is the width of the line&lt;br /&gt;&lt;br /&gt;The texture coordinates would be calculated as follows:&lt;br /&gt;0, 0&lt;br /&gt;0, 1&lt;br /&gt;length / tw, 1&lt;br /&gt;length / tw, 0&lt;br /&gt;where tw is the texture width.&lt;br /&gt;&lt;br /&gt;Then draw the two triangles to create the textured line.&lt;br /&gt;&lt;br /&gt;glBindTexture(GL_TEXTURE_2D, [_texture name]);&lt;br /&gt;glMatrixMode(GL_MODELVIEW);&lt;br /&gt;glPushMatrix();&lt;br /&gt;glTranslatef(_point.x, _point.y, 0);&lt;br /&gt;glRotatef(_angle, 0, 0, 1);&lt;br /&gt;&lt;br /&gt;glVertexPointer(2, GL_FLOAT, 0, _vertexArray);&lt;br /&gt;glTexCoordPointer(2, GL_FLOAT, 0, _textCoordArray);&lt;br /&gt;glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;&lt;br /&gt;glDrawArrays(GL_TRIANGLE_FAN, 0, 4);&lt;br /&gt;glPopMatrix();&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-3310661024103052755?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/3310661024103052755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=3310661024103052755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3310661024103052755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3310661024103052755'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/04/drawing-textured-line-in-opengl-es.html' title='Drawing a Textured Line in OpenGL ES'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-Bme_EOsh_o/Sei4xterFZI/AAAAAAAAARw/tvK2-zjSl-c/s72-c/TexturedLines.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-2260697139855408778</id><published>2009-04-14T08:38:00.000-07:00</published><updated>2009-04-14T09:17:34.942-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><title type='text'>Adding an SCM SVN Repository to XCode</title><content type='html'>I needed to set up some subversion. Having a subversion (SVN), or any other source control management is very important. Besides backing up the code remotely, I can quickly diff with previous releases, commit with comments, tag files and code branches, etc.&lt;br /&gt;&lt;br /&gt;I googled a bit for  free SVN hosting and found &lt;a href="http://xp-dev.com/"&gt;XP-Dev.com&lt;/a&gt;. After creating my repository I set up XCode to know about my XP-Dev repository. That was a breeze, but then a problem crop up when I wanted to import my existing prototype in the repository. It was complaining about some SCM Error 155007.&lt;br /&gt;&lt;br /&gt;Googled a bit more, and luckily some other guys had the same problems. They suggested to do the initial commit from the terminal. This did the trick:&lt;br /&gt;&lt;br /&gt;svn import /path/to/project http://username@svn.xp-dev.com/svn/&lt;your_repository&gt;/&lt;project&gt; -m “Initial import”&lt;br /&gt;&lt;br /&gt;Remember the to do the &lt;project&gt; name when importing, otherwise you won't be able to do a proper checkout. After the import is done, you need to go to XCode&gt;SCM&gt;Repositories and do a checkout to a different directory. It should prompt you to automatically open the XCode project when it finishes.&lt;br /&gt;&lt;br /&gt;To check if it's working fine, you can simply type something in some existing file and save, and you should see an M to the left of the Groups &amp;amp; Files sidebar, meaning it is modified and can then be committed at your will :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-2260697139855408778?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/2260697139855408778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=2260697139855408778' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2260697139855408778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2260697139855408778'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/04/adding-scm-svn-repository-to-xcode.html' title='Adding an SCM SVN Repository to XCode'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-5109496430826924895</id><published>2009-04-14T08:25:00.000-07:00</published><updated>2009-04-17T10:12:44.381-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><title type='text'>Renaming an XCode Project</title><content type='html'>I found it is pretty painful to rename a project in XCode. Then I found that someone has done a script besides describing how to do it manually. Learn more on &lt;a href="http://mohrt.blogspot.com/2008/12/renaming-xcode-project.html"&gt;renaming an XCode project&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-5109496430826924895?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/5109496430826924895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=5109496430826924895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5109496430826924895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5109496430826924895'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/04/renaming-xcode-project.html' title='Renaming an XCode Project'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-3675021756824743618</id><published>2009-04-13T16:23:00.000-07:00</published><updated>2009-04-13T16:34:45.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Starting Phase 2 of iPhone project</title><content type='html'>I have just finished phase 1 for my little iPhone project, which was basically getting acquainted with Mac OS X, XCode, the iPhone Simulator, ObjectiveC, memory management, brushing up some opengl. That was quite a lot! I'm not as proficient as I am with Java on eclipse, but at least I'm starting to walk.&lt;br /&gt;&lt;br /&gt;Now I will start on phase 2, which is basically migrating my little game prototype I have done some weeks ago in ActionScript on Flash. It's a very simple game, similar to the old &lt;a href="http://www.bbcmicrogames.com/screenshots/frenzy.jpg"&gt;Frenzy game&lt;/a&gt; that we used to play on my cousin's old BBC micro. The concept is similar, but you can do diagonal lines, and the prototype I have done so far uses the mouse to draw the lines. The iPhone version will be obviously using the touch interface. When I imagined this game, I always had a touch interface in my head. I have other ideas I need to experiment with to make the game even more interesting.&lt;br /&gt;&lt;br /&gt;I better check how to setup some source code management (SCM) on XCode...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-3675021756824743618?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/3675021756824743618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=3675021756824743618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3675021756824743618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/3675021756824743618'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/04/starting-phase-2-of-iphone-project.html' title='Starting Phase 2 of iPhone project'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-2487972671148025944</id><published>2009-04-11T21:43:00.001-07:00</published><updated>2009-04-11T21:49:08.246-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><title type='text'>Changing Process Priority on Mac OS X</title><content type='html'>On Windows I used to bring up the Task Manager (Ctrl-Shift-Esc) and quickly change the priority of  a process, e.g. to a lower priority so that some process doesn't make the machine feel slow when some CPU intensive task takes over.&lt;br /&gt;&lt;br /&gt;On Mac OS X I thought I would fire up the Activity Monitor and right click to change the priority. Apparently it's not that easy. I fired up google and found out that &lt;a href="http://forums.macrumors.com/archive/index.php/t-126007.html"&gt;I need to get the PID from Activity Monitor and then launch a terminal and use the renice command&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;E.g. sudo renice +1 -p 3692&lt;br /&gt;&lt;br /&gt;A process can have a priority between +20 (lowest priority) and -20 (highest priority). 0 is the default priority. The above will make the the process with PID 3692 with a slightly lower priority.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-2487972671148025944?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/2487972671148025944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=2487972671148025944' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2487972671148025944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2487972671148025944'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/04/changing-process-priority-on-mac-os-x.html' title='Changing Process Priority on Mac OS X'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-2580920483738964183</id><published>2009-04-08T21:48:00.001-07:00</published><updated>2009-04-11T07:37:26.618-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><title type='text'>Migrating Shortcuts from Windows to Mac</title><content type='html'>&lt;span style="font-size:130%;"&gt;Copy Pasting&lt;/span&gt;&lt;br /&gt;Instead of Control use the Command Key (⌘). So Ctrl-C becomes ⌘-C on the Mac.&lt;br /&gt;First of all, if you plugged in a Windows keyboard, the Start button acts as the ⌘ key.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Undo Redo&lt;/span&gt;&lt;br /&gt;The Undo shortcut is similar, ⌘-Z however the Redo you need to hold the shift key while doing ⌘-Z.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The hash/pound # key&lt;/span&gt;&lt;br /&gt;To type the hash / pound # key, you need to press the Alt together with the 3. I got stuck on this when I wanted to do a #import :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Navigating Text&lt;/span&gt;&lt;br /&gt;In Windows Ctrl-arrow keys would navigate the text word by word. On the Mac you need to use the Alt instead of the Ctrl. (Luckily on XCode, the Ctrl shortcut does the same thing). The End and Home keys will take you the very end and start position of the whole text. Very annoying since on Windows we are used to be related with the current line being edited. To go to the end or start of the line you need to press Ctrl together with an arrow key.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Quick Dark Scheme&lt;/span&gt;&lt;br /&gt;In Windows I use WindowBlinds and my &lt;a href="http://www.wincustomize.com/skins.aspx?skinid=2176&amp;amp;libid=1"&gt;Dark Aqua scheme&lt;/a&gt;, (inspired from the Mac). There are some skinning applications on the Mac, but I haven't found what I'm looking for to be able to switch completely to a black skin. However there's a quick native shortcut which will invert the colors, and so if you feel that your eyes are getting strained during those late night coding hours, you can easily switch to a black scheme by hitting Ctrl-Alt-⌘-8.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Killing processes&lt;/span&gt;&lt;br /&gt;You can either launch Activity Monitor to replace Task Manager. Or you can launch the Force quit menu by pressing Alt-⌘-Esc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-2580920483738964183?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/2580920483738964183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=2580920483738964183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2580920483738964183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2580920483738964183'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/04/migrating-shortcuts-from-windows-to-mac.html' title='Migrating Shortcuts from Windows to Mac'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-798406884226114001</id><published>2009-04-08T20:26:00.001-07:00</published><updated>2009-04-08T20:50:06.347-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Fell in Love with the Mac</title><content type='html'>This is going to be a brain dump of the last two weeks using the MacBook.&lt;br /&gt;&lt;br /&gt;I have been a Windows user from the beginning. I didn't like Macs a lot ("where's the right mouse button?"), until I saw the release of Mac OS X. And finally I got my own MacBook. It felt like an alien dropped by and gave me his laptop. Every shortcut I knew in Windows needs to be rewired in my brain.&lt;br /&gt;&lt;br /&gt;Very nice machine. Besides being impressed by the hardware and OS, I was mostly impressed by getting started to develop for the mac and iphone/ipod touch.&lt;br /&gt;&lt;br /&gt;I love the fact that I can drop into a terminal window and have unix commands at my fingertips. I have done some remote unix server admin, although I still need to learn a lot in this area.&lt;br /&gt;&lt;br /&gt;Installing applications is dead easy...dragging into the Applications folder. You want to uninstall? You just remove it from the Applications folder! Hah. Although I have found a small application called AppDelete which will make sure to remove any config files, etc which won't be used any more.&lt;br /&gt;&lt;br /&gt;Why oh why didn't I switch to a Mac ages ago? Money is always the problem.&lt;br /&gt;&lt;br /&gt;I got the Macbook for development. So I got a second hand Macbook and I want to plug it to a keyboard and monitor (considering KVM switch until I put my Windows machine down). I also got a Mini-DVI to DVI connector, so now I'm using SGI 1600sw as the primary monitor and the Macbook as the secondary monitor. The SGI is quite old now but IMHO it is still a very good monitor :D. I like this dual monitor setup... on the macbook I keep the documentation and on the SGI I keep XCode windows.&lt;br /&gt;&lt;br /&gt;Which reminds me about XCode and Objective-C. Currently I'm learning about Objective-C which apparently was released in the same year as C++, but I didn't hear about it before this year. It has some interesting concepts like categories, and I missed the fact of passing functions as parameters. I have used Java to much now. Got me lazy with that garbage collector :) Finding it annoying now to have to use reference counting to properly release variables. Got a lot to learn...&lt;br /&gt;&lt;br /&gt;I started an OpenGL ES application for the IPhone. That just only means that I let XCode generate the template :) I'm still looking at tutorials. First stumbling block was drawing text. There are two ways how to do that. You either create a texture for the text you want to show, but that leads to a problem if you are changing the text every frame plus its memory inefficient. The second approach is creating a single texture containing all the characters and keep track of each characters kerning and spacing. Ughhh I had done the latter ages ago on Windows. Guess someday I will need to reimplement it unless I find some ready made class (which I have found yet). For now I will create a texture for each string :(.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-798406884226114001?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/798406884226114001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=798406884226114001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/798406884226114001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/798406884226114001'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/04/fell-in-love-with-mac.html' title='Fell in Love with the Mac'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6330492310625545774</id><published>2009-03-23T07:15:00.001-07:00</published><updated>2009-04-08T20:25:51.821-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='IPhone'/><title type='text'>Getting a macbook!</title><content type='html'>It's been a while. Have been busy working with a game company last year, and this year I'm working as a lecturer. Teaching students takes a lot of my time, but hopefully during the summer time I will have some time to do some small game project.&lt;br /&gt;&lt;br /&gt;I'm hoping of developing something small on the iphone and try my luck publishing on the app store. It's not for the money, it's for the fun of it. The iphone is a pretty cool device and I've hear good things about its APIs. I've already got a quick prototype in Flash, but now I will need to port it to iphone SDK.&lt;br /&gt;&lt;br /&gt;First things first... I need some mac machine. So I just bought a second hand macbook through ebay. Waiting for it to arrive on this island! Let the iphone adventure begin...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6330492310625545774?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6330492310625545774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6330492310625545774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6330492310625545774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6330492310625545774'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2009/03/getting-macbook.html' title='Getting a macbook!'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-4036607583514986421</id><published>2007-06-13T16:03:00.001-07:00</published><updated>2007-06-13T16:05:16.221-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lunch Prodigy'/><title type='text'>Lunch Prodigy interview</title><content type='html'>Lunch Prodigy has been featured in the following blog - &lt;a href="http://www.odinjobs.com/blogs/page/thatsinteresting?entry=what_s_for_lunch_log"&gt;http://www.odinjobs.com/blogs/page/thatsinteresting?entry=what_s_for_lunch_log&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-4036607583514986421?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/4036607583514986421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=4036607583514986421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4036607583514986421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/4036607583514986421'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/06/lunch-prodigy-interview.html' title='Lunch Prodigy interview'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6488861211329444786</id><published>2007-06-13T15:53:00.000-07:00</published><updated>2007-06-28T08:57:02.965-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lunch Prodigy'/><title type='text'>Editing of items, printing options and timestamp</title><content type='html'>We have now introduced the facility to also edit the items when the user is in the add items page. Previously (if the user had the privileges), he could just click on the name or price when in the menu and type the new values. But with the introduction of food categories, we needed a page where you could select the new category if you want to move a food item from one category to another.&lt;br /&gt;&lt;br /&gt;We have also introduced some printing options by request. Some companies want to view the ordered food grouped by the item being ordered. Other companies want to view the ordered food grouped by the user who ordered them. So we introduced both options in the Company Profile settings where they can be ticked accordingly.&lt;br /&gt;&lt;br /&gt;By request, the timestamp of when the order is printed is placed on the order print page.&lt;br /&gt;&lt;br /&gt;We have also experienced a bit of problems with a number of concurrent users accessing the service. We are conducting some tests to resolve this issue. UPDATE: after a lot of testing it turned out to be a connectivity issue from a client's side.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6488861211329444786?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6488861211329444786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6488861211329444786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6488861211329444786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6488861211329444786'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/06/editing-of-items-printing-options-and.html' title='Editing of items, printing options and timestamp'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-8547459128072085135</id><published>2007-06-11T15:52:00.000-07:00</published><updated>2007-06-11T15:56:14.461-07:00</updated><title type='text'>Minor fixes for Lunch Prodigy</title><content type='html'>We have fixed some problems encountered by our users.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;backspace in the search field was not behaving properly in IE&lt;/li&gt;&lt;li&gt;added searching capability only in the selected category&lt;/li&gt;&lt;li&gt;minor glitch in the time differences between server and clients&lt;/li&gt;&lt;li&gt;adding of providers can now only be done by privileged users or if users are allowed to edit content&lt;/li&gt;&lt;li&gt;fixed a bug when creating a new provider&lt;/li&gt;&lt;/ul&gt;Coming soon...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;lost password feature&lt;/li&gt;&lt;li&gt;timestamp when printing an order&lt;/li&gt;&lt;li&gt;edit/deleting items in a menu&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8547459128072085135?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8547459128072085135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8547459128072085135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8547459128072085135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8547459128072085135'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/06/minor-fixes-for-lunch-prodigy.html' title='Minor fixes for Lunch Prodigy'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-5760209293224968539</id><published>2007-06-09T09:30:00.000-07:00</published><updated>2007-06-09T09:36:31.185-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lunch Prodigy'/><title type='text'>Lunch Prodigy updated</title><content type='html'>We were contacted by a big company which were interested in using LunchProdigy.com however there were some missing features which they wanted to be in there. So we gave high priority to Lunch Prodigy this weekend and here are the updates:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Support for categories. Food can now be entered into categories and each provider can has it's own categories&lt;/li&gt;&lt;li&gt;Printing also shows who ordered what&lt;/li&gt;&lt;li&gt;Support for comments. Users can now enter a comment when making an order. Very useful for the picky ones who don't like mushrooms or whatever :)&lt;/li&gt;&lt;li&gt;Some options to make adding/editing only for privileged users&lt;/li&gt;&lt;li&gt;Option for roster to be disabled and always the same person will be taking the order.&lt;/li&gt;&lt;/ul&gt;We will be adding soon the possibility to edit an existing item provided by some provider to be placed in some category.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-5760209293224968539?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/5760209293224968539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=5760209293224968539' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5760209293224968539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5760209293224968539'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/06/lunch-prodigy-updated.html' title='Lunch Prodigy updated'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-8158113505515005680</id><published>2007-05-31T09:06:00.000-07:00</published><updated>2007-05-31T09:09:57.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Prodigy'/><title type='text'>Site design updated</title><content type='html'>We have finally updated the design for &lt;a href="http://www.SoftwareProdigy.com"&gt;SoftwareProdigy.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We are busy doing small flash games for &lt;a href="http://www.CartoonDollEmporium.com"&gt;CartoonDollEmporium.com&lt;/a&gt; and we're also doing a multiplayer cooperative &lt;a href="http://www.softwareprodigy.com/gameproto.html"&gt;flash game&lt;/a&gt; prototype. You can find more on &lt;a href="http://www.SoftwareProdigy.com"&gt;our website&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8158113505515005680?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8158113505515005680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8158113505515005680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8158113505515005680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8158113505515005680'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/05/site-design-updated.html' title='Site design updated'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-2742883008213214377</id><published>2007-03-24T05:26:00.000-07:00</published><updated>2007-03-24T05:51:47.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lunch Prodigy'/><title type='text'>Interesting Facts upgraded</title><content type='html'>We have updated the Interesting Facts page for &lt;a href="http://www.lunchprodigy.com"&gt;Lunch Prodigy&lt;/a&gt;. It now displays the providers entered by the company, and how much the company spent at the providers so far. It also calculates the money spent by the user who clicked to view the page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-2742883008213214377?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/2742883008213214377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=2742883008213214377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2742883008213214377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2742883008213214377'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/03/interesting-facts-upgraded.html' title='Interesting Facts upgraded'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-5877054234657054521</id><published>2007-03-17T08:19:00.000-07:00</published><updated>2007-03-17T08:23:02.729-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lunch Prodigy'/><title type='text'>Lunch Prodigy minor fixes</title><content type='html'>We made some minor fixes to some annoyances when using &lt;a href="http://www.lunchprodigy.com/"&gt;Lunch Prodigy&lt;/a&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;When the order has already been taken and the user tries to delete an order item, the user is now informed that he cannot delete anything from an already taken order.&lt;/li&gt;&lt;li&gt;When the user tries to delete a non-empty order, an error is displayed that all orders must first be deleted.&lt;/li&gt;&lt;li&gt;When the user tries to add something to the order, and the order has already been printed, he will be warned that he should inform the person who has printed the order to make sure he gets what he wants.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-5877054234657054521?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/5877054234657054521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=5877054234657054521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5877054234657054521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5877054234657054521'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/03/lunch-prodigy-minor-fixes.html' title='Lunch Prodigy minor fixes'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-6175879593966461767</id><published>2007-03-15T06:27:00.000-07:00</published><updated>2007-03-15T06:36:16.392-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lunch Prodigy'/><title type='text'>Lunch Prodigy beta launched</title><content type='html'>&lt;a href="http://www.lunchprodigy.com/"&gt;Lunch Prodigy&lt;/a&gt; beta has been launched. It is primarily targeted for companies whose employees work on a computer on a regular basis and do lunch orders. Instead of having some employee running around the premises to see what his colleagues will be taking for lunch, everyone simply logs in to Lunch Prodigy and makes their order. When everyone has ordered, someone prints the order and phones up the food provider and makes the order.&lt;br /&gt;&lt;br /&gt;After the beta phase, we will start signing up providers locally in Malta, and then we will go global.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-6175879593966461767?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/6175879593966461767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=6175879593966461767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6175879593966461767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/6175879593966461767'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/03/lunch-prodigy-beta-launched.html' title='Lunch Prodigy beta launched'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-622098964102600551</id><published>2007-03-05T14:41:00.000-08:00</published><updated>2007-03-05T14:43:53.487-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Property Prodigy'/><title type='text'>Polished links</title><content type='html'>I have made the links served by PropertyProdigy.com more search engine friendly and also easier for users to remember and share ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-622098964102600551?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/622098964102600551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=622098964102600551' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/622098964102600551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/622098964102600551'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/03/polished-links.html' title='Polished links'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-8598597376982851301</id><published>2007-02-25T02:00:00.000-08:00</published><updated>2007-02-25T02:02:32.525-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Property Prodigy'/><title type='text'>Random properties splashed on home page</title><content type='html'>We have added a small area in the homepage for PropertyProdigy.com which contains random properties which have at least an image so we can show a thumbnail of the property.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-8598597376982851301?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/8598597376982851301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=8598597376982851301' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8598597376982851301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/8598597376982851301'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/02/random-properties-splashed-on-home-page.html' title='Random properties splashed on home page'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-2247620090691732611</id><published>2007-02-19T15:48:00.000-08:00</published><updated>2007-02-19T15:52:56.720-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Buttonia'/><title type='text'>Minor usability update for Buttonia</title><content type='html'>We have released a minor usability update for &lt;a href="http://buttonia.com"&gt;Buttonia.com&lt;/a&gt;. We are showing more stats to the user and also the "puzzle done" screen has been turned into a splash screen on the puzzle with a big Play Next :). Game on!!&lt;br /&gt;&lt;br /&gt;We are currently checking manually if a game is solvable or not. We shall be trying to automating this process soon hopefully together with some community features for Buttonia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-2247620090691732611?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/2247620090691732611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=2247620090691732611' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2247620090691732611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/2247620090691732611'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/02/minor-usability-update-for-buttonia.html' title='Minor usability update for Buttonia'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-5437507975713453925</id><published>2007-02-06T15:19:00.000-08:00</published><updated>2007-02-06T15:28:13.333-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Buttonia'/><title type='text'>Buttonia launched</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-Bme_EOsh_o/RckO3d2pE7I/AAAAAAAAAAM/Q0kV5XiO7uk/s1600-h/buttonia.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_-Bme_EOsh_o/RckO3d2pE7I/AAAAAAAAAAM/Q0kV5XiO7uk/s400/buttonia.jpg" alt="" id="BLOGGER_PHOTO_ID_5028566805005276082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We have launched &lt;a href="http://buttonia.com/" target="_blank"&gt;Buttonia&lt;/a&gt;, this addictive puzzle game where you have to simply turn on all the buttons. This experimental game being done in our free time was done in collaboration with &lt;a href="mailto:killroy@gmail.com"&gt;Sven Neumann&lt;/a&gt;. The game concept and coding where done by Sven, and I made the graphics and web user interface.&lt;br /&gt;&lt;br /&gt;The game has 4 grid sizes ranging from 3x3 up to 6x6. The 3x3 is usually very easy to do, but it gets much more challenging. Currently generate a random puzzle each day for each grid size, however sometimes they may not be solvable, but we are working on that ;)&lt;br /&gt;&lt;br /&gt;We are still in the alpha phase where we're just gathering some feedback but we'll soon add more stuff such as comments, ranking, playing more than one game per day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-5437507975713453925?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/5437507975713453925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=5437507975713453925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5437507975713453925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5437507975713453925'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2007/02/buttonia-launched.html' title='Buttonia launched'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-Bme_EOsh_o/RckO3d2pE7I/AAAAAAAAAAM/Q0kV5XiO7uk/s72-c/buttonia.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-5614728398390482215</id><published>2006-12-06T16:10:00.000-08:00</published><updated>2007-02-06T14:52:22.100-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Property Prodigy'/><title type='text'>Easier adding to wanted section</title><content type='html'>Users can now add wanted properties easier by just typing some free text in the Wanted section which is then reviewed before being published online.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-5614728398390482215?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/5614728398390482215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=5614728398390482215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5614728398390482215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/5614728398390482215'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2006/12/easier-adding-to-wanted-section.html' title='Easier adding to wanted section'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-116484241033339036</id><published>2006-11-29T15:18:00.000-08:00</published><updated>2007-02-06T14:52:13.317-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Property Prodigy'/><title type='text'>Wanted section</title><content type='html'>We have just rolled out the Wanted section on PropertyProdigy.com.&lt;br /&gt;Users can now save their search queries and get notified when a property which matches their query has been added. They can also add their query to the Wanted section.&lt;br /&gt;&lt;br /&gt;For more information please visit our &lt;a href="http://www.propertyprodigy.com/faq.do?question=FAQ.Wanted.How#FAQ.Wanted.How"&gt;FAQs&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-116484241033339036?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/116484241033339036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=116484241033339036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/116484241033339036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/116484241033339036'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2006/11/wanted-section.html' title='Wanted section'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-116354581056978831</id><published>2006-11-14T15:05:00.000-08:00</published><updated>2007-02-06T14:52:00.397-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Property Prodigy'/><title type='text'>Refined Search fix</title><content type='html'>We have fixed a minor issue with refined searching where it wasn't taking into consideration the manual ticking of locations after a quick search with All zones selected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-116354581056978831?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/116354581056978831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=116354581056978831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/116354581056978831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/116354581056978831'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2006/11/refined-search-fix.html' title='Refined Search fix'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-116073403542558200</id><published>2006-10-13T03:05:00.000-07:00</published><updated>2007-02-06T14:51:48.585-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Property Prodigy'/><title type='text'>Manage Your Properties fix</title><content type='html'>There was a slight problem with users who weren't seeing the Manage Your Properties link. This only occurred for users who had a property for rent only. This is now fixed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-116073403542558200?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/116073403542558200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=116073403542558200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/116073403542558200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/116073403542558200'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2006/10/manage-your-properties-fix.html' title='Manage Your Properties fix'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-115822236869958503</id><published>2006-09-14T01:25:00.000-07:00</published><updated>2007-02-06T14:51:29.307-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Property Prodigy'/><title type='text'>Price on Request</title><content type='html'>We have added the feature where property owners can decide to not show the sale price of their property. They just need to type in 0 for the sale price and it will be shown as a Price on Request property.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-115822236869958503?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/115822236869958503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=115822236869958503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/115822236869958503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/115822236869958503'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2006/09/price-on-request.html' title='Price on Request'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33731376.post-115765060107792815</id><published>2006-09-07T10:34:00.000-07:00</published><updated>2007-02-06T14:51:18.189-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Property Prodigy'/><title type='text'>New fresh look</title><content type='html'>We have given PropertyProdigy.com a fresh look. Send us feedback or suggestions.&lt;br /&gt;&lt;br /&gt;PropertyProdigy.com is now easier to use: images are not required anymore and also adding of a property is faster. We look forward to hear some comments from you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33731376-115765060107792815?l=softwareprodigy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwareprodigy.blogspot.com/feeds/115765060107792815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33731376&amp;postID=115765060107792815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/115765060107792815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33731376/posts/default/115765060107792815'/><link rel='alternate' type='text/html' href='http://softwareprodigy.blogspot.com/2006/09/new-fresh-look.html' title='New fresh look'/><author><name>xenon</name><uri>http://www.blogger.com/profile/10326194693325918193</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://www.softwareprodigy.com/images/neville_attard.jpg'/></author><thr:total>0</thr:total></entry></feed>
