<?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-1430070474804062246</id><updated>2011-07-07T17:26:20.559-07:00</updated><category term='computer games'/><category term='2d games'/><category term='sprite games'/><category term='games'/><category term='game'/><category term='rpg'/><category term='role-playing games'/><title type='text'>GeneriQuest</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-5258765723647072663</id><published>2010-07-26T11:55:00.000-07:00</published><updated>2010-07-26T11:56:21.294-07:00</updated><title type='text'>Let's call this version 0.2</title><content type='html'>You can pick up the sword, see it in your inventory, and drop it.  Coming right along.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-5258765723647072663?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/5258765723647072663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=5258765723647072663&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/5258765723647072663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/5258765723647072663'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2010/07/lets-call-this-version-02.html' title='Let&apos;s call this version 0.2'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-6016041053843269915</id><published>2010-07-22T10:37:00.001-07:00</published><updated>2010-07-22T10:38:14.951-07:00</updated><title type='text'>Adding Items</title><content type='html'>I'm working on adding items, now, if anyone was wondering (not that anyone was, because nobody is reading this).  I put a sword in my empty room.  You can't do anything with it - not even pick it up - but it's there, which is a good start.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-6016041053843269915?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/6016041053843269915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=6016041053843269915&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/6016041053843269915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/6016041053843269915'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2010/07/adding-items.html' title='Adding Items'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-128934078841660719</id><published>2010-07-13T07:31:00.000-07:00</published><updated>2010-07-13T07:32:21.090-07:00</updated><title type='text'>GeneriQuest v0.1 is done!</title><content type='html'>You can walk around an empty room!  Yay!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-128934078841660719?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/128934078841660719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=128934078841660719&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/128934078841660719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/128934078841660719'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2010/07/generiquest-v01-is-done.html' title='GeneriQuest v0.1 is done!'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-6552009274606788436</id><published>2010-07-12T12:07:00.001-07:00</published><updated>2010-07-12T12:10:18.523-07:00</updated><title type='text'>Note to self</title><content type='html'>I came up with a great idea on Friday for solving something, and now I can't remember it.  So I'll use this blog as a way to remind myself of ideas that I'm going to come back and solve later.  &lt;div&gt;     Anyway, Future John: create a temporary map cell object when you need to call canEnter or onEnter.  Update the map with a new code if anything changes, like opening a door will change from a closed door cell to an open door cell.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-6552009274606788436?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/6552009274606788436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=6552009274606788436&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/6552009274606788436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/6552009274606788436'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2010/07/note-to-self.html' title='Note to self'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-1857272032338139140</id><published>2010-07-12T12:02:00.000-07:00</published><updated>2010-07-12T12:04:11.796-07:00</updated><title type='text'>Interpreter</title><content type='html'>Fear not, little flock.  I'm working on the interpreter now.  The whole SpriteInfo / Sprite split was actually a useful learning experience for the class / object distinction that I'm working on now.  Fun times.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-1857272032338139140?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/1857272032338139140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=1857272032338139140&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/1857272032338139140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/1857272032338139140'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2010/07/interpreter.html' title='Interpreter'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-2511073466681242546</id><published>2010-07-01T19:44:00.000-07:00</published><updated>2010-07-01T19:47:06.624-07:00</updated><title type='text'>Parser</title><content type='html'>The parser is done, at least in outline form.  All it can really do is "return true" or "return false" statements, but enough of the pieces are there that adding mathematical expressions, if-then-else statements, and do-while loops shouldn't be too hard.  Now I'm working on writing the program that will read the game file and map files, and produce an actual, playable game.  And it's only been a month!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-2511073466681242546?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/2511073466681242546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=2511073466681242546&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/2511073466681242546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/2511073466681242546'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2010/07/parser.html' title='Parser'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-8999008888099081680</id><published>2010-06-28T09:55:00.000-07:00</published><updated>2010-06-28T10:05:49.009-07:00</updated><title type='text'>Wow... been a while...</title><content type='html'>Looks like it's been about 6 months since my last attempt.  I've written basically the same sprite engine about 4 times now, and I think I've finally gotten the hang of it: I've got a SpriteInfo object that holds the sprite name, image filename, width, height, and animation sequences.  The Sprite object has the x and y co-ordinates of the sprite, and the current animation sequence and frame within that sequence.  I'm pretty happy with it.&lt;div&gt;What I'm not happy with is the Java Swing GUI toolkit.  I guess I got spoiled with Microsoft's Visual Studio / C# combo, where making text fields and trees and grids is SUPER easy.  But what I really hate about Swing is that the events are triggered in nonsense order.  When you're editing in a text box, and then click on a tree, the tree node is selected first, then the text box loses focus, then the tree gains focus.  Why doesn't the text box lose focus first?  It's like making a scrambled egg by frying the egg, THEN breaking it open, then eating it.  Ewww.  So basically I have to watch every single keystroke and update my data structures every time a key is pressed in a text box.  Sheesh.&lt;/div&gt;&lt;div&gt;Anyway, my next step is to add Map Cells, from which I will build Levels, and then I can actually start on the program that lets you play the game!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-8999008888099081680?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/8999008888099081680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=8999008888099081680&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/8999008888099081680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/8999008888099081680'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2010/06/wow-been-while.html' title='Wow... been a while...'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-6065014455382314406</id><published>2009-01-13T14:37:00.000-08:00</published><updated>2009-01-13T16:29:02.138-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2d games'/><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='computer games'/><category scheme='http://www.blogger.com/atom/ns#' term='sprite games'/><category scheme='http://www.blogger.com/atom/ns#' term='role-playing games'/><title type='text'>Inspiration Strikes!</title><content type='html'>Hi everyone, sorry I haven't posted anything lately.  I got bogged down with all the details of sprites and storage, and it kinda stopped being fun for a while, so I didn't do anything with it.  But then, my wife got a call from an old friend of hers, and her husband is a game programmer.  I looked at his sites (&lt;a href="http://www.semisecretsoftware.com/"&gt;http://www.lastchancemedia.com/&lt;/a&gt; and &lt;a href="http://www.semisecretsoftware.com/"&gt;http://www.semisecretsoftware.com/&lt;/a&gt;), and I got all excited about games and game programming and stuff.  So I'm back on the wagon!  I did a bit more work on the game last night, trying to figure out how to create a Texture2D object without a GraphicsDevice object.  It's not easy, lemme tell ya.  But I think I got it.  Oh, and I've re-vamped the boxes-within-boxes chart:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RJOJmztBMVE/SW0w4UznTeI/AAAAAAAACs0/wgO2L43zMgo/s1600-h/gqoverview.GIF"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_RJOJmztBMVE/SW0w4UznTeI/AAAAAAAACs0/wgO2L43zMgo/s400/gqoverview.GIF" alt="" id="BLOGGER_PHOTO_ID_5290938881446202850" border="0" /&gt;&lt;/a&gt;Now, the Content is separate from the Level.  The Content is descriptions of the monsters, items, etc., while the Level just has the maps and locations of monsters and items.  The Content was originally part of the Game; I should have known to split it when I needed two paragraphs to describe it.&lt;br /&gt;I'm hoping to have a Content editor done soon; then I'll make a level editor (that will probably be the easiest, since I'm having to make up the Engine and Game as I go along to make the Content editor be able to read and write Content).  The comes the Interface, and we'll have a playable game!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-6065014455382314406?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/6065014455382314406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=6065014455382314406&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/6065014455382314406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/6065014455382314406'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2009/01/inspiration-strikes.html' title='Inspiration Strikes!'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RJOJmztBMVE/SW0w4UznTeI/AAAAAAAACs0/wgO2L43zMgo/s72-c/gqoverview.GIF' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-3026547266806152341</id><published>2009-01-06T18:34:00.001-08:00</published><updated>2009-01-06T20:03:31.710-08:00</updated><title type='text'>A Step-by-Step Guide to Making a Macro Lens for your iPhone</title><content type='html'>The iPhone camera lens can't focus on very close things.  This is a bummer if you downloaded a sweet bar-code recognizer application and it doesn't work.  Colin Devroe published an &lt;a href="http://cdevroe.com/notes/iphone-macro-light/"&gt;article&lt;/a&gt; about a year ago with a quick overview of an idea; I tried the same thing and it works!  So I thought I'd be a good netizen and make a step-by-step guide to making a macro lens for your iPhone.&lt;br /&gt;&lt;br /&gt;Step 1: Buy a used camera from your local thrift store.  Cost: $2&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQjBay8RcI/AAAAAAAACnU/3eWEkQMl7hA/s1600-h/100_3086.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQjBay8RcI/AAAAAAAACnU/3eWEkQMl7hA/s400/100_3086.JPG" alt="" id="BLOGGER_PHOTO_ID_5288390369719633346" border="0" /&gt;&lt;/a&gt;Step 2: Disassemble camera.&lt;img src="file:///C:/Documents%20and%20Settings/john.savage/Desktop/100_3087.JPG" alt="" /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQjP1aS5KI/AAAAAAAACnc/7Paacs1rXnE/s1600-h/100_3087.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQjP1aS5KI/AAAAAAAACnc/7Paacs1rXnE/s400/100_3087.JPG" alt="" id="BLOGGER_PHOTO_ID_5288390617382184098" border="0" /&gt;&lt;/a&gt;Step 3:  You now have 3 lenses (on notebook) and lots of camera guts.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQjoOkpAfI/AAAAAAAACnk/7JEGLUS-mhY/s1600-h/100_3088.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQjoOkpAfI/AAAAAAAACnk/7JEGLUS-mhY/s400/100_3088.JPG" alt="" id="BLOGGER_PHOTO_ID_5288391036453323250" border="0" /&gt;&lt;/a&gt;Step 4:  Hold each lens up to the iPhone camera and see which one works best.  Here's the original bar code picture, with no lens:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQkruEzOeI/AAAAAAAACns/yRExR2972Zg/s1600-h/IMG_0015.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQkruEzOeI/AAAAAAAACns/yRExR2972Zg/s400/IMG_0015.jpg" alt="" id="BLOGGER_PHOTO_ID_5288392195960945122" border="0" /&gt;&lt;/a&gt;Here's what it looked like with the first lens:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RJOJmztBMVE/SWQksCnGo4I/AAAAAAAACn0/_cqSbQrrP30/s1600-h/IMG_0016.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://1.bp.blogspot.com/_RJOJmztBMVE/SWQksCnGo4I/AAAAAAAACn0/_cqSbQrrP30/s400/IMG_0016.jpg" alt="" id="BLOGGER_PHOTO_ID_5288392201473532802" border="0" /&gt;&lt;/a&gt;Yeah, worse.  I was a little discouraged by this.  So I tried the second lens:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQksQLQnII/AAAAAAAACn8/60TkWs82uiQ/s1600-h/IMG_0017.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQksQLQnII/AAAAAAAACn8/60TkWs82uiQ/s400/IMG_0017.jpg" alt="" id="BLOGGER_PHOTO_ID_5288392205114842242" border="0" /&gt;&lt;/a&gt;Much better - too good, actually.  I couldn't get the entire bar code in the frame and still be in focus.  Here's the final lens:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RJOJmztBMVE/SWQksivQZmI/AAAAAAAACoE/zLfJfIIsmt0/s1600-h/IMG_0018.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://1.bp.blogspot.com/_RJOJmztBMVE/SWQksivQZmI/AAAAAAAACoE/zLfJfIIsmt0/s400/IMG_0018.jpg" alt="" id="BLOGGER_PHOTO_ID_5288392210097661538" border="0" /&gt;&lt;/a&gt;Perfect!  So with a rubber band and some scotch tape, I made a thingy to keep it attached to the phone:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RJOJmztBMVE/SWQl310QXKI/AAAAAAAACpE/RbTgwbmE9yU/s1600-h/100_3089.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RJOJmztBMVE/SWQl310QXKI/AAAAAAAACpE/RbTgwbmE9yU/s400/100_3089.JPG" alt="" id="BLOGGER_PHOTO_ID_5288393503709093026" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RJOJmztBMVE/SWQl3k5E6eI/AAAAAAAACo8/dUo4vqMim7I/s1600-h/100_3090.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RJOJmztBMVE/SWQl3k5E6eI/AAAAAAAACo8/dUo4vqMim7I/s400/100_3090.JPG" alt="" id="BLOGGER_PHOTO_ID_5288393499165911522" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RJOJmztBMVE/SWQl3ZBxb8I/AAAAAAAACo0/jnIhrHohOeA/s1600-h/100_3091.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RJOJmztBMVE/SWQl3ZBxb8I/AAAAAAAACo0/jnIhrHohOeA/s400/100_3091.JPG" alt="" id="BLOGGER_PHOTO_ID_5288393495981158338" border="0" /&gt;&lt;/a&gt;Pretty snazzy, eh?  I tested it out on some Lysol wipes we had (note this is not a picture from the iPhone / macro lens combo, this is from our real camera):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RJOJmztBMVE/SWQl3e3amEI/AAAAAAAACos/ERK9q5Ai6ag/s1600-h/100_3092.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RJOJmztBMVE/SWQl3e3amEI/AAAAAAAACos/ERK9q5Ai6ag/s400/100_3092.JPG" alt="" id="BLOGGER_PHOTO_ID_5288393497548331074" border="0" /&gt;&lt;/a&gt;And here's what it had to say about the bar code:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQl2xa6LzI/AAAAAAAACok/gsHw-K7HhW4/s1600-h/100_3093.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RJOJmztBMVE/SWQl2xa6LzI/AAAAAAAACok/gsHw-K7HhW4/s400/100_3093.JPG" alt="" id="BLOGGER_PHOTO_ID_5288393485349170994" border="0" /&gt;&lt;/a&gt;So yeah, it found it.  Mission accomplished.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-3026547266806152341?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/3026547266806152341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=3026547266806152341&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/3026547266806152341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/3026547266806152341'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2009/01/step-by-step-guide-to-making-macro-lens.html' title='A Step-by-Step Guide to Making a Macro Lens for your iPhone'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RJOJmztBMVE/SWQjBay8RcI/AAAAAAAACnU/3eWEkQMl7hA/s72-c/100_3086.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-8362280559199709942</id><published>2009-01-02T13:06:00.001-08:00</published><updated>2009-01-02T13:58:46.073-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='2d games'/><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='computer games'/><category scheme='http://www.blogger.com/atom/ns#' term='role-playing games'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Overview</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RJOJmztBMVE/SV6B-EAKAAI/AAAAAAAAClc/qpKWbPyN7_w/s1600-h/ga950101.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 265px;" src="http://3.bp.blogspot.com/_RJOJmztBMVE/SV6B-EAKAAI/AAAAAAAAClc/qpKWbPyN7_w/s400/ga950101.gif" alt="" id="BLOGGER_PHOTO_ID_5286805915805810690" border="0" /&gt;&lt;/a&gt;So, I thought I'd take a minute here to step back and give y'all the big picture about how this game is going to work.  I envision it in 4 main pieces:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RJOJmztBMVE/SV6Dd833YzI/AAAAAAAAClk/NABLg2hs9UI/s1600-h/gqoverview.GIF"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://3.bp.blogspot.com/_RJOJmztBMVE/SV6Dd833YzI/AAAAAAAAClk/NABLg2hs9UI/s400/gqoverview.GIF" alt="" id="BLOGGER_PHOTO_ID_5286807563159429938" border="0" /&gt;&lt;/a&gt;I think it's easiest to explain top-to-bottom. &lt;br /&gt;1.  The User Interface (UI for short) draws the player, walls, floors, monsters, items, etc., and handles input from the keyboard and mouse. &lt;br /&gt;2.  The Level Content contains the maps for each level and starting locations of the monsters, so the UI knows what to draw where.  It also contains the cutscene information.&lt;br /&gt;3.  The Game contains the rules of the game.  It describes what attributes the player has; for example, you could have AD&amp;amp;D 2nd Edition Strength / Dexterity / Constitution / Intelligence / Wisdom / Charisma, or just Strength / Intelligence, or Fortitude / Cleverness / Wisdom / Book Smarts / Street Smarts / Holiness / Flexibilty / Agility / Nimbleness.  Anything you want.  You also define your combat system here, using attributes from the player and monster to come up with equations for the probabilty of a hit happening, and how much damage it does.  For the first version, this will be hard-coded into the Engine, but I'll make a Game editor later on to allow for some serious customization.  &lt;br /&gt;     You also create the monsters and items here; the difference between the Game monsters and the Level Content monsters is, the Game tells you what a Goblin is (how many hit points, how hard it hits, how much gold it has, how much exp it gives you), while the Level Content tells you where the Goblins are.&lt;br /&gt;4.  The Engine applies the rules in the Game to the player, monsters, items, etc.&lt;br /&gt;&lt;br /&gt;Bear in mind that this is an RPG creator, not a general-purpose game maker.  Thus, there will be certain things that will be the same in every Game:&lt;br /&gt;&lt;br /&gt;1.  The game has a Player.  The Player has experience points, which are gained from killing monsters and completing quests.  The Player has an inventory of Items.&lt;br /&gt;2.  Some Items can be worn on the head (hats / helmets), neck (necklace / amulet), body (armor / clothes), wrists (bracers), hands (gloves), fingers (rings),  feet (shoes / boots).  Some items can be eaten or drunk (food / potions).  All items can be held and wielded as weapons, though some will be more effective than others (swords / maces).&lt;br /&gt;3.  Monsters try to kill the Player.  Killing Monsters will give experience points.  Some Monsters have items that are dropped when they are killed.&lt;br /&gt;4.  NPCs talk to the Player.  Some are Shopkeepers that buy and sell items.  Some give quests.  Some don't do anything.&lt;br /&gt;&lt;br /&gt;So that's what's been swimming around in my head since Tony asked me to make a game.  Don't fret, I won't do the whole thing all at once.  Like I said, the first verison will have the Game built in to the Engine, so I won't have to make a Game-maker application and all the parsers and solvers that go along with it.  We'll let C# take care of that for us.  For now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-8362280559199709942?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/8362280559199709942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=8362280559199709942&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/8362280559199709942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/8362280559199709942'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2009/01/overview.html' title='Overview'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RJOJmztBMVE/SV6B-EAKAAI/AAAAAAAAClc/qpKWbPyN7_w/s72-c/ga950101.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-3549884352364404475</id><published>2008-12-29T09:41:00.001-08:00</published><updated>2008-12-29T09:44:11.660-08:00</updated><title type='text'>XNA, eh?</title><content type='html'>Ian recommended the Microsoft XNA framework for making this game.  I've looked into it, and it looks like that's the way to go.  Thanks, Ian!  (Even though you called me Mr. Savage and made me feel old.  But I guess I should get used to that, seeing as how I'm old and all.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-3549884352364404475?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/3549884352364404475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=3549884352364404475&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/3549884352364404475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/3549884352364404475'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2008/12/xna-eh.html' title='XNA, eh?'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-1177113495848123994</id><published>2008-12-18T19:24:00.001-08:00</published><updated>2008-12-18T19:46:35.314-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='2d games'/><category scheme='http://www.blogger.com/atom/ns#' term='computer games'/><category scheme='http://www.blogger.com/atom/ns#' term='sprite games'/><category scheme='http://www.blogger.com/atom/ns#' term='role-playing games'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Update 12/18 - So Much for SpriteManager</title><content type='html'>So it turns out the Sprite Manager idea was unnecessarily complicated.  It made sense for the map cells to have just one instance per cell type (one wall, one grass, one dirt, etc), because they never change.  Creatures, however, move around, they get hit and lose hit points, they pick up and drop items... it was just too annoying for each creature to have some sort of index key to find the image in the list of images.  So now each creature will have its own sprite.  It's a lot easier to code, but it just doesn't feel right to waste that memory.  Even if it's only a few kilobytes. &lt;br /&gt;So now that I've got memory management sorted out, it's time to start making more progress on the playable-game goal!  Huzzah!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-1177113495848123994?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/1177113495848123994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=1177113495848123994&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/1177113495848123994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/1177113495848123994'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2008/12/update-1218-so-much-for-spritemanager.html' title='Update 12/18 - So Much for SpriteManager'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-2905482799340394055</id><published>2008-12-15T14:41:00.000-08:00</published><updated>2008-12-15T14:53:50.232-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='2d games'/><category scheme='http://www.blogger.com/atom/ns#' term='computer games'/><category scheme='http://www.blogger.com/atom/ns#' term='sprite games'/><category scheme='http://www.blogger.com/atom/ns#' term='role-playing games'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Update 12/15/08</title><content type='html'>I'm just making up this game as I go along, so expect a bit of back-tracking here and there.  For example, the images that will be used for the walls.&lt;br /&gt;I had a file called cellList.txt, which was just a list of the file names of the .gif files that will be used for walls, floors, water, etc.  Then I realized that some cells are walk-through-able (floor, grass), while others (walls, water) aren't.  So I added a "True" or "False" after each filename to indicate whether or not it was a wall.&lt;br /&gt;Then I started to make another file called creatureList.txt, with a list of the file names of the .gif files that contain the monsters, player, npc's, etc.  But creatures need a lot more info - attack, defense, range, hit points, etc.  So I decided to put the info into an XML file instead.&lt;br /&gt;Then I realized I was duplicating a lot of code between the cells and creatures, in terms of loading and saving the list of images.  So I created a new class called SpriteManager, which uses a master list called "SpriteInfo.xml", with a list of ALL the image file names, what type they are, and any relevant info for that type.&lt;br /&gt;I have a very rudimentary level editor:&lt;br /&gt;&lt;img src="file:///C:/DOCUME%7E1/JOHN%7E1.SAV/LOCALS%7E1/Temp/moz-screenshot.jpg" alt="" /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RJOJmztBMVE/SUbezfL4CaI/AAAAAAAAChs/2dIF1AbDQrg/s1600-h/editor+screenshot.GIF"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 275px;" src="http://2.bp.blogspot.com/_RJOJmztBMVE/SUbezfL4CaI/AAAAAAAAChs/2dIF1AbDQrg/s320/editor+screenshot.GIF" alt="" id="BLOGGER_PHOTO_ID_5280152589264488866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;There's not much to see at the moment because I'm in the process of creating the afore-mentioned SpriteManager, but the editor allows you to create a new level, specify the width and height, and add / remove walls.  That's about it.&lt;br /&gt;My next goal is to get the game into the simplest possible playable state - add a player, and let the user move him around in the level.  Keep in mind, though, I'm writing this in C#, and C# was (to put it mildly) not designed for making games.  The hardest part of this step will be handling the keyboard input and re-drawing the screen at the same time.  Fortunately, I happen to know some voodoo magic that will allow me to do cross-thread window updating.  For you techies out there, this means I can handle keyboard input in one thread, and update the window in another thread, without C# complaining about invalid cross-thread operations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-2905482799340394055?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/2905482799340394055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=2905482799340394055&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/2905482799340394055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/2905482799340394055'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2008/12/update-121508.html' title='Update 12/15/08'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RJOJmztBMVE/SUbezfL4CaI/AAAAAAAAChs/2dIF1AbDQrg/s72-c/editor+screenshot.GIF' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1430070474804062246.post-4300004444067074407</id><published>2008-12-15T14:37:00.000-08:00</published><updated>2008-12-15T14:40:05.827-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='2d games'/><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='computer games'/><category scheme='http://www.blogger.com/atom/ns#' term='sprite games'/><category scheme='http://www.blogger.com/atom/ns#' term='role-playing games'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Because I'm sure Certain Persons are Anxious to Know...</title><content type='html'>Hi all,&lt;br /&gt;     My brother Tony commissioned me to make a game for him and his friends.  Since this will take a while, I thought they might like to have occasional status updates as to how things are going.  And, if anyone out there is still interested in the old-school 2d sprite games, this might serve as a little tutorial for how to make one.&lt;br /&gt;&lt;br /&gt; - John Savage&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1430070474804062246-4300004444067074407?l=genericquest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genericquest.blogspot.com/feeds/4300004444067074407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1430070474804062246&amp;postID=4300004444067074407&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/4300004444067074407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1430070474804062246/posts/default/4300004444067074407'/><link rel='alternate' type='text/html' href='http://genericquest.blogspot.com/2008/12/because-im-sure-certain-persons-are.html' title='Because I&apos;m sure Certain Persons are Anxious to Know...'/><author><name>John &amp;amp; Jennifer Savage</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
