8bitrocket GameStorm! Podcast #3: Family Edition
OK, here is Podcast #3. We are still tinkering with the format, so this one is a bit different from the previous two. Jeff and I were on a vacation this week, so this one was done with our kids around. In some cases it works (interesting ideas), in others (background noise) it doesn't.
Download The Podcast Now!: http://www.8bitrocket.com/podcasts/gamestorm3.mp3
8bitrocket Diatribe: Separated at Birth: Sarah Palin and Tracy Flick
I was up late last night finishing my latest tutorial, so I was a little late to the game hearing the announcement that Alaska Governor Sarah Palin will be the vice presidential candidate on the ticket with John McCain. This certainly is not a political blog, and since both Steve and I are pretty "middle of the road" when it comes to politics (I especially think anyone who goes strictly down a party line, no matter the party, is a little suspect), I will not publicly endorse any candidate. Anyway I haven't even heard anything good from any candidate on some subjects that concern me :Net Neutrality, DRM, etc. Since we are retro here, and one of my favorite all time movies, Election is pretty retro nowadays I decided to post something that struck me as I watched video of her introduction. In the film, a young Reese Witherspoon perfectly portrays a high school over achiever, student council candidate. I wanted to point out that Sarah Palin speaks, acts and looks a lot like Witherspoon's character, Tracy Flick. Especially in the way she talks and pauses and doesn't move her lower lip as much as you'd expect when she wants to make a point clear. They don't have the same color hair, and the facial features are different, but their mannerism and overall persona remind me of one another. You have to watch video of both of them to fully appreciate it. By the way, I am fully aware that people also compared Hillary Clinton to Tracy Flick. No comment.
Videos to ponder:
Election Trailer From Youtube
Sarah Palin Video
Pretty Funny Video About Sarah Palin
The Clinton / Flick compare video
I am a media junky and have stations tuned to both conservative talk radio, Air America, John Stewart, Stephen Colbert, and others. I don't take it as seriously as that might sound, but I like to know a lot about a subject and try to find funny things about it if possible. By the way, I like all 4 of the people on the presidential tickets, even if I don't agree with a some of what they might stand for. They all bring something unique to the table, have interesting background stories, and are mavericks in their own unique ways. If you are in the USA and of age, please pick a candidate and vote. I don't care which one, but please exercise your right to do it. This is going to be a very interesting election.
Some Flash / Retro Stuff so this blog entry seems relevant:
Squize has some new good stuff up on his blog. His latest is on unique collision detection schemes and it has created a good discussion.
The 8bit City Blog has an interesting entry on a game that was never released in the USA, Battle Loderunner. This might make a cool Flash game.
Armchairarcade.com has an interesting discussion going on about the 80's video game crash.
Gamasutra has a best of indie games article up now.
I just bought Mario Cart for the Wii with a second steering wheel controller. I have been trying to find a game for my 3 year old son to play (besides hitting buttons and getting tickets for toys at Chucky Cheese). This game is finally it! He can use the steering wheel and press the 1 and 2 buttons to accelerate and brake. It has been a blast having a second player around the house the last couple days. My wife has even been playing it!
Rapid Wars kicks ass and is the latest Mochi Weekly winner!
Mochiland also has an interesting graph of the locations for their Flash Game developers...
Tutorial: AS3 Basic Blitting #2 : Rotation – Part 1
Tutorial: AS3 Basic Blitting #2 : Rotation - Part 1
In this tutorial will will explore basic blitting from a tile sheet to a single blit canvas. We will do so by implementing a common animation problem - rotation. We will also demonstrate the simple math tricks that are used to find the starting point to copy from the tile sheet given the tile number and width and height of the sprite to be copied.
As part of my 24 hour game challenge, I am creating a game similar to Atari 2600 Air-Sea Battle mixed with the game Point Blank.
This has opened up an opportunity for me to deliver a tutorial based on one of the game display concepts that I need to achieve: Blitting an object around a center point in space. I want to tackle radial rotation around a center point, and we will get there in part 2. We must first take a look at simple rotation using a sprite sheet before we get to that slightly more advanced topic. As you will see, they are very much related.
First, here is the tile sheet we will be using. The enemy in this case is a helicopter that is a simplified version of one that I will be using for my game. In this version, the helicopter has one frame of animation and 36 different angles it can be positioned in. We will do this in both the clockwise and counter clockwise directions. This gives us 72 different frames of animation that must be pre-rendered. There certainly are other ways to do the same thing, but they are more advanced. In this instance we will use the basic sprite sheet method of blitting from png sheet to the screen canvas. Whatever angle the helicopter is rotated in will be the angle that it is traveling and it will do its traveling around a center point on the screen. I would usually have more than one frame for the helicopter (maybe have the rotor look like it's spinning for example). I have left out the second frame of animation for this basic tutorial so what we have below are the 36 frames needed to render the helicopter at angles 0-359 with 10 degrees in between each step. I have split the clockwise and counter clockwise rotations into two separate sheets. I have done this purely out of convenience. This certainly could have been on one sprite sheet, but splitting it into two makes finding the right sprite to use easier.
Here is the clockwise sheet:
![]()
Here is the counter clockwise sheet:
![]()
These were both created in Fireworks. I started by pixel drawing the first frame (actually with a cool green pallet, but it didn't work well on a black background). I then copied it to the subsequent tiles and rotated it 10 degrees each time. One note on rotating a bitmap, always make sure you use the original tile for each new rotated tile. For example, I rotated the first tile by 10 degrees to make the second tile. I did NOT rotate the second tile by 10 degrees to make the third, but rotated the first by 20 degrees. Unlike rotating vectors in Flash, bitmaps degenerate into what can only be described as PIXEL MUSH on each rotation because of deformations. If you look closely even at the single deformations I have created, all but the direct right angles look a tab bit strange close up.
Also, I have chosen a pretty ugly pink sprite because it will contrast well with the black background we are going to use in our demo. My pretty green sprites were hard to pick out from the background because I used a green that was too dark in places.
The basics of circular motion
We have covered the basics of blitting and blitting with transparency before, so if you want to look up the details, feel free. We will cover them in summary a little later. The first example we will run through is how to do a simple blit of our sprite sheet corresponding to the angle we want to rotate our sprite. It will end up looking like the helicopter is simply rotating in place, This is really easy if we are using display objects, we just need to set the rotation property with a value of -180 through 180. But with blitting, we need to use a different approach. That is why I spent the time creating the rudimentary sprite sheets above. We can simulate rotation simply by running through the sprites in order like a flip book animation. That is exactly what we have done before in the earlier blitting lessons. In this case, we will take it a step further and force our blitted sprite to appear to point in the direction of a calculated angle.
In the clockwise sprite sheet above, the first sprite cell is a helicopter pointed to the right. That sprite will correspond to the angle 0. The last sprite in the sheet (#35, 0 relative) corresponds to angle 350 (360 is the same as 0). If we know our angle, we can display the right sprite cell to correspond to the direction we want to helicopter to face.
To rotate an object using math, rather than the built in functions for display objects, we need to first choose a center point for our object. In this case I have chosen 50x and 50y as the center point. We then choose a radius from that center point (the distance from the center) that we want out object to be placed. If we choose a radius of 0, then our object will appear to rotate in place like an Asteroids ship. If we choose a radius other than 0, our object will appear to rotate AROUND the center point at the radius distance.
Some Math that you won't need for this example, but will prepare you for part 2
So, for our first example, we will have the object appear to rotate in place. To find the x and y values for the location of our object in space, we use the cosine and sine of our angle (cos for x, sin for y) and multiply by the radius. We add this to our start position 50x and 50y to get the location in space for our object.
Because we are going to be rotating the object in place, our radius is 0. This calculation is completely unneeded for a radius of 0 because it will always return 0 to be added to both the x and y value, leaving your object exactly where it is, but rotating it on the center point. Here is the calculation anyway:
x=centerX+Math.cos(angle) * radius; or x=50+Math.cos(0)*0; or in other words, 50;
y=centerY+Math.sin(angle) * radius; or y=50+Math.sin(0)*0; or in other words 50;
For this lesson the math is not as important because we are simply rotating on a center point. In lesson 2 we will complicate this more by actually using a radius to give the illusion of radial circular motion.
That is where we will start our first example we will leave out this calculation because we just want to blit the object around a center point.
Here is what we are going to try and accomplish:
Obviously there is nothing earth shattering about simply rotating an object in Flash. Our version uses a high-speed blitting technique rather than the standard display object rotation. I only have 36 frames of animation, so the spinning helicopter looks a little choppy. Plus, I may have been off a pixel or two from my center point on a couple frames, but you get the general idea of when we are doing this.
Here is the code:
[cc lang="javascript" width="550"]
package
{
import flash.display.Bitmap;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.display.BitmapData;
import flash.geom.*;
import flash.events.*;
public class BlitRadial1 extends MovieClip
{
trace("class radial 1");
var tileSheet:BitmapData;
var backgroundBD:BitmapData;
var backgroundRect:Rectangle;
var backgroundPoint:Point;
var canvasBD:BitmapData;
var canvasBitmap:Bitmap;
var tileWidth:int;
var tileHeight:int;
var heliRect:Rectangle;
var heliPoint:Point;
var heliX:int;
var heliY:int;
var heliTilesLength:int;
var animationIndex:int;
var animationCount:int;
var animationDelay:int;
var spritesPerRow:int;
public function BlitRadial1() {
tileWidth=36;
tileHeight=36;
backgroundBD=new BitmapData(400,400,false,0x000000);
backgroundRect=new Rectangle(0,0,400,400);
backgroundPoint = new Point(0, 0);
canvasBD=new BitmapData(400,400,false,0x000000);
canvasBitmap=new Bitmap(canvasBD);
tileSheet=new heli_sheet(360,144);
heliRect=new Rectangle(0,0,36,36);
heliX=50;
heliY=50;
heliTilesLength=36;
animationIndex=0;
animationCount=0;
animationDelay=3;
spritesPerRow=10;
heliPoint = new Point(heliX, heliY);
addChild(canvasBitmap);
addEventListener(Event.ENTER_FRAME, gameLoop);
}
public function gameLoop(e:Event) {
drawBackground();
drawHeli();
}
private function drawBackground():void {
canvasBD.copyPixels(backgroundBD,backgroundRect, backgroundPoint);
}
private function drawHeli():void {
if (animationCount == animationDelay) {
animationIndex++;
animationCount = 0;
if (animationIndex == heliTilesLength){
animationIndex = 0;
}
}else{
animationCount++;
}
trace("animationIndex=" + animationIndex);
heliRect.x = int(animationIndex % spritesPerRow)*tileWidth;
heliRect.y = int(animationIndex / spritesPerRow)*tileHeight;
canvasBD.copyPixels(tileSheet,heliRect, heliPoint);
}
}
}
[/cc]
This does seem like a lot of code to simply rotate an object, but there is a lot going on here that can be useful for more complicated projects.
Let's go through some of this code in detail code to ensure you understand the basics of blitting from a tile sheet as well as the basic math involved. We have added a concept to our blitting in this example. We now have 36 sprite sheet tiles to use and that will necessitate some simple sprite sheet math needed to find the location of the sprite to blit onto the canvas.
The Sprite Sheet
The sprite sheet is embedded in our .fla library with a class name of "heli_sheet". It is a 360x144 tile sheet with the 36 frames of animation needed just for the clockwise motion of the helicopter.
We bring it into use like this: [cc lang="javascript" width="550"]tileSheet=new heli_sheet(360,144);[/cc]
The basics of tile sheet blitting can be found in this tutorial.
The Canvas
We will be using a single canvas as our drawing surface for all objects (in this case we have just one object); We need a 400x400 blank canvasBD BitmapData object and we need a way to display it on the screen, so we also have a canvasBitmap display object that is added to our displayList
[cc lang="javascript" width="550"]
canvasBitmap=new Bitmap(canvasBD);[/cc]
The Helicopter
If this was a more elaborate game, we would have some sort of helicopter object to hold all of the properties and many of the methods used for it. In this simple case, we just have a few global variables that are used for that purpose:
[cc lang="javascript" width="550"]
heliRect=new Rectangle(0,0,36,36);
heliX=50;
heliY=50;
heliPoint = new Point(heliX, heliY);
[/cc]
The heliX and heliY do nothing more than give us a location for the the top left corner of our helicopter object. This is also the center point of any radial circular rotation we might want to display. Since this first example if just rotating an object in place, we don't need any other calculations to find the x and y values for the helicopter. They will be heliX and heliY (50,50) nd will not change.
The heliRect variable is used for our blitting of the helicopter to the canvasBD. It defines a rectangle of that starts at 0,0 and goes to 36x and 36y. It tells the blitting method how much of the sprite sheet to put on the canvasBD.
The heliPoint is always the current x and y value where we want the sprite to be blit onto the screen. In this case is will remain 50,50 the entire time.
The Background
The background we are using is a simple black 400x400 square. We don't need to do anything difficult to create this other than specify it when we create out background BitmapData object:
[cc lang="javascript" width="550"]
backgroundBD=new BitmapData(400,400,false,0x000000);
backgroundRect=new Rectangle(0,0,400,400);
backgroundPoint = new Point(0, 0);[/cc]
The backgroundPoint and the backgroundRect are used when blitting them to the canvas. The point will always be 0,0 (the top left of the screen) and the rect will always be a 400x400 rectangle covering the entire background.
Using blitting from a tile sheet with multiple rows and columns
In the previous blitting tutorials we have covered how to blit a finite row of tiles in a loop to create a simulated animation. In this example we will take it a bit further and show how to blit from all 4 rows to the canvas, not just from one row. The size of each tile we are going to use is 36x36 and we have 36 tiles. There is no extra significance for the use of the number 36 and it is just a coincidence that I used that number for the tile width and height as well as the number of angles for a rotation.When we have more than one row of tiles to blit from (there are three full rows of 10 and one row of 6 sprite tiles) we can use a simple math trick to tell the program where to start cutting from the tile sheet to paste onto the canvas.
[cc lang="javascript" width="550"]
heliRect.x = int((animationIndex % spritesPerRow))*tileWidth;
heliRect.y = int((animationIndex / spritesPerRow))*tileHeight;
canvasBD.copyPixels(tileSheet,heliRect, heliPoint);
[/cc]
The heliRect.x and heliRect.y values need to be updated each time a new frame of animation is to be shown. Note: In the above example I do it on EVERY frame, but this can be optimized further to have it only calculated when a new frame is to be shown.
What we need to know here first is the current frame of animation we want to display. That is represented by animationIndex and is a number from 0-35. We also need to know the maximum number of tiles per row in our spriteSheet. That is represented by the spritesPerRow variable. Since animationIndex starts ar 0, the first sprite tile to blit is 0:
(you will notice that I decided to break out the green helicopters for this example - I didn't want them to go to waste - Maybe Steve's entry on the Temptation of the Unreleased to explains why)
![]()
To find the starting x value on the spriteSheet to copy from, we use this simple formula:
x=int(animationIndex % spritesPerRow)*tileWidth;
For tile 0 on our sheet, the calculation would look like this:
x=int(0 % 10)*36.
0/10 = 0 with 0 remainder, so 0 % 10 =0; 0*36=0; Our start x location is 0;
To find the starting y value on the spriteSheet to copy from, we use this simple formula:
y=(animationIndex / spritesPerRow) * tileHeight
For tile 0 on our sheet, the calculation would look like this:
y=int(0/10)*36.
0/10 =0, so 0*36=0; the start y location=0;
This seems pretty simple for the first spriteSheet tile, so now we'll test it out on the 15th tile (the 15th tile would be the 16th on our sheet because we start at 0).
![]()
For tile 15, the x calculation would be:
x=int(15%10) * 36.
15 % 10 =5 (5 is the remainder from the division of 15 by 10);
5*36=180;
Our x start location is 180;
For tile 15, t he y calculation would be:
y=int(15/10) *36.
15/10 = 1 (as an integer).
1*36=36;
That gives us a y start location of 36.
So, the upper left-hand corner of the 15th tile is 180x and 36y. That is where out spriteSheet copy will start and it will use the heliRect and heliPoint values to blit that tile to the canvasBD.
Again, it will look like this:
[cc lang="javascript" width="550"]
heliRect.x = int((animationIndex % spritesPerRow))*tileWidth;
heliRect.y = int((animationIndex / spritesPerRow))*tileHeight;
canvasBD.copyPixels(tileSheet,heliRect, heliPoint);
[/cc]
Slowing down our animation
One last thing we do in this simple second part to our blitting tutorials is create a delay between the display of animation frames for our rotation. We do this so the helicopter does not spin too fast on the screen.
[cc lang="javascript" width="550"]
if (animationCount == animationDelay) {
animationIndex++;
animationCount = 0;
if (animationIndex == heliTilesLength){
animationIndex = 0;
}
}else{
animationCount++;
}
[/cc]
Basically this counts 3 frames and then increases the animationIndex by 1.
When the animationIndex is greater than 35 it sets id back to 0;
Where is the rotation code?
Good question. As you can see by analyzing the above code, we didn't use any of this formula:
x=centerX+Math.cos(angle) * radius; or x=50+Math.cos(0)*0; or in other words, 50;
y=centerY+Math.sin(angle) * radius; or y=50+Math.sin(0)*0; or in other words 50;
The reason for this is simple. The outcome of each of those formulas is still just the current center point. Also, since we are using the animationIndex value to loop through our spriteSheet, we just need to multiply it by 10 to get the current angle that the heliCopter is facing. We did not need that information in this first part, so I left it out. It will be needed when we rotation with a radius around a center point and especially when we turn the helicopter to face the direction of this radial motion.
The Temptation Of The Unreleased Game
The second installment of my History Of Atari for gamasutra.com was published last week. It was very difficult to write Part II (1978-1981), not for a lack of information, but because there is simply too much . Believe it or not, since there is not much written material about Atari from 1972-1977, the first part of the article was a easier to create because I could focus on what was known, secure interviews from key players on some questionable areas, and cover the finite number of products and events in a swift, but thorough manner. I thought I had done a pretty good job, but one comment about the article struck me. It was on Atariage.com, and the person who wrote it asked why I did not cover the Atari Game Brain. For those who don't know, the Atari Game Brain was one of several competing, unreleased cartridge-based platforms that Atari created from 1976-1979 when trying to perfect a video game system with interchangeable cartridges, and explore the successor to the Atari 2600 VCS. The Atari Game Brain was built very early, and scrapped before the VCS was released in 1977. It is an interesting footnote, but since I was attempting to cover all known and released coin-ops, consoles, and cartridges, it seemed to me that covering unreleased games and hardware was simply unnecessary.
However the topic has had me thinking for the past few months about the concept of unreleased products, and just why collector's of nostalgia want them so badly. What exactly is the lure of something that has remained "unreleased" as time passed? Rock bands have been using the "temptation of the unreleased" for years to sell re-packaged albums with "bonus tracks" to established fans who already own everything else. However, these "bonus tracks" are rarely great songs (although "Naked Eye" by The Who is one notable exception). Most of the time they contain flubs, missed notes, poor melodies, experimental song structures, alternate mixes, etc. While they are interesting, you can usually hear exactly why they were left off an officially released album. To casual fans, there really is no use for these unreleased tracks, but for die-hards fans, they are essential. In fact, many die hard fans start listening to ONLY unreleased tracks because they are convinced they are better than the material that made the band popular in the first place. A fan crosses the line to "die hard", is when the "temptation of the unreleased" takes a firm grip of their conscience mind.
Over the course of the past 37+ years of video game history, there have been 100's, if not 1000's of games and gaming devices that have gone "unreleased". You can find many of them at places like system16.com and atariprotos.com, as well as many others. The truth is, a multitude of these games and gaming devices deserved to remain unreleased. For ex maple, the aforementioned Atari Game Brain was not really a game console at all, but a receptacle for the ICs from unsold Atari dedicated-game consoles (i.e. Super Pong, Stunt Cycle, etc). It was a ploy to get rid of old hardware, and it would have been a confusing customer relations disaster if it was released. The same can be said about the Atari Cosmos, an LED based game system that used non-interactive holograms as backgrounds. The holograms were cool, the games were not. It was never released. The Atari VCS game Wizard by Chris Crawford remained unreleased until it was included on the Atari Flashback 2 console in 2005. The game was never released originally because it was primitive looking 2K game in an era when 4K games were the norm, and because it was really not much fun to play. When Activision Anthology was released for the PS2 and PC in 2002, it contained two unreleased games: Kabobber and Thwocker. While both are interesting, neither looks like it was developed in the Golden Age of home video games, or would make you forget classics like Pitfall! or River Raid. This same story can be multiplied across every platform and gaming device. Even here on our own site, we have a list of "Demos" that are really games that we started and never finished (and there are three times are many that I have not spent the time to post). Why did we never finish them? The ideas were simply not good enough to spend any more time exploring. Still, the "temptation of the unreleased" continues to persist, and it has very little to do with quality.
So what if the "temptation of the unreleased" is it not really about the quality of the products, then what is really about? To me, it is a form of grief. Going back to those rock bands and their "unreleased songs", one can observe a pattern to the desires of many die-hard fans when it comes to unreleased material. If the band has long-since broken-up, they might want to anything the band might have produced and not released. If the band is still a going concern, then die-hards might only be looking to find "unreleased tracks" from a time when the band was at the (purely subjective) height of their creativity. Either way, the "temptation of the unreleased" is all about the death of something the person truly loved and truly affected them in some important way.
When is comes to video games, the "temptation of the unreleased" is usually the strongest when a game system or game company has experienced an untimely demise, leaving legitimately good products un played. Sometimes these products are finished, or close to it, sometimes they are not even close. The great video game crash of 1983 killed of so many game companies so quickly, that many good games never saw the light of day. In fact, some games are still be being unearthed 25 years later (for instance, Rob Fulop's Actionauts ) that were at least as good as many of the games released at the time. Like a rock band that suddenly broke up, video game fans were left hanging when suddenly exited the market. The most significant of these deaths was Atari. In 1984, the consumer division of Atari Inc. was not simply put-down, it was shot point blank in the stomach and left to suffer. Over the next 12 years it slowly bled to death. Atari was such a significant part of the lives of many people, this death was something they could simply not put behind them. Nothing new will ever be created with the Atari name on it (the real Atari anyway), so trying to locate and experience anything that might have been created when Atari was still alive, no matter how insignificant, is of paramount important to these die-hard Atari fans. Even something that had little merit when it was first designed, the Atari Game Brain for example, is significant because it means the spirit of Atari can live on in a product that very few if anyone has ever experienced.
Did I miss this concept in Part 1 of my History Of Atari ? Should I have included something about the Atari Game Brain, even single a sentence, to make sure that these still grieving die-hard Atari fans could get a modicum of solace from its mention? Probably, but I also believe focusing too much attention "unreleased" products can be be a trap unto itself, especially if it is not something significant. Atari history from 1972-1977 is all about innovation and successfully released products that changed the face of electronic entertainment the world over. If I had focused too much on things that never made it to market, they might have taken away some of the importance of the story I was trying to tell. I mentioned a few unreleased products in Part II, but will I cover even more in Part III? Probably, because the death of Atari in 1984 left such a huge number of unreleased products that they make-up a significant part of the story. While I believe that these "unreleased" products don't deserve any more space than things that legitimately made it to stores, it is definitely cathartic for grieving fans to focus on "unreleased products", at least for a little while.
However, while "the temptation of the the unreleased" might be an interesting diversion for die-hard fans, it can be deadly for artists and game developers. Especially if the unreleased game becomes an obsession that always remains "90% complete". Take Brian Wilson's "Smile" album for instance. It was never released in the last 60's, then Wilson became a recluse. He tinkered with the album for nearly 40 years. In that time, there was talk of how "brilliant" it was, or how it was Wilson's "masterpiece". When he finally released it a couple years back, it might have been good, but was it worth 40 years? Maybe to die-hard Wilson fans, but to anyone else? What other great music was not created while Wilson toiled on his magnum opus?
Game designers and developers can fall victim to the very same trap. They come up with what they think is a great game idea, and try to implement it, but fail. There are a multitude of reasons why it might be a failure (technical, design, game mechanics, etc), but the inability to "let a project go" could mean that the world might miss other significant, fully-realized games that were otherwise never created because of this focus on something "unreleased". Several game developers have told me that they have as high as a 75% rate of projects that end-up in grave yard of ideas because they could not work them through fully. For people who make their living creating things, this seems like a very healthy attitude. If it doesn't work, move on. If there is time to revisit it later, fine, but make sure you complete something else before you go back to it.
There is one game that I have been tinkering with for almost 4 years. The idea started as a "turn the tables" version of Star Castle where you played the bad guy from the original game (i.e. the big space cannon inside the rotating vector walls). I worked on it for a couple weeks, but when I could not get the collision detection to work correctly, I put it aside for some time. Months later, I was at an actual car-wash and it occurred to me that a game where you cleaned cars might be fun. When I got home I converted the aforementioned game into something I call "Extreme Car Washer". The game was fundamentally the same as before, but instead of shooting at on-coming ships trying to destroying your space fortress, dirty cars come at you from all sides and you need to "wash" them before they run into your base. I could not think of any way to enhance the game beyond that point, and even though I have gone back to it many times, I've never found a way to make it work as a game. However, many times in "GameStorming" sessions, when Jeff and I are stuck, I will say something like" hey, there's always Extreme Car Washer!" Which always elicits a sad laugh from him. A laugh that says "yeah, sure, when will you get that piece of s**t completed so you can move onto something else?"
So while I don't fault die-hard fans and their desire for "unreleased" material, the negative aspects of spending too much time focused on them seem apparent. I can understand why die-hard fans (of which I am one myself), still in the process of grieving over a band, gaming platform or something else entirely, might focus on unreleased content to fill the void. However, in the long-run, it can't be healthy to not only live in the past, but live a past that really never was. In reality, every time I spend one extra minute trying to mold my work on "Extreme Car Washer" into a workable game concept game is a minute wasted on something worthwhile. A minute I will never get back. Keep that in mind next time you realize the project you are working on might not be going in the direction you first intended. If you have to cut it off, throw it away, and start over, go ahead. Otherwise it might remain in that "unreleased" state, haunting you for years to come.
Norm Soule's Pixel Blitz Engine Released
Norm Soule's Pixel Blitz Engine Released
The incredible Mr. Soule as been hard at work on an engine that will help you created blit rendered games.
Features include (from his site)
* Pixel-level collision detection
* Layer effects
* Horizontal and vertical scrolling
* Parallax scrolling
* Virtual timeline nearly identical to the s
* Memory efficient
* Fast, fast, fast
I will be working with this engine tonight and have a full report on it tomorrow.
SoundSnap.com – awesome free sounds for your games
My buddy, Chris Cutler, sent me a link to this site today (www.soundsnap.com) and I have been exploring it on an off in the limited free time I have had tonight. There are literally 1000's of great sounds and music free for you to use in your games.
Here are just a few great ones I found tonight:
Flash Game Development Inter-web mash up:August 25, 2008
The latest in Blog entries and articles that might interest Flash game developers. It's time to hit my favorite Flash sites and see what's new in game development.
This time we cover The difference between "distance between points" methods in AS3; MAME Goes the way of Flash; 50 ways to improve your web site; the latest Mochi winner; Tutorials on Photoshop and Adobe Air; How to design game that won't numb the player; 4 cool Mochi games and lots lots more.
Squize, over at Gamingyourway.com has posted some more of his speed tests with AS3 and has come up with some very interesting results. It seems that the Point.Distance built in method for computing the distance between two points isn't the quickest draw in the west. Speaking of quick draws, how about a game of Law Of The West?
I want all of you to go take a look at Photon Storm if possible. It is run by Rich, a legend in Retro Gaming circles (especially on the Atari systems). He has some very cool entries on Richard Cabello's new FPS/Micro Second/Memory counter, and one I am very excited about, a version of MAME that runs in Flash! Also, if you have any interest in the Atari ST world, check out his Little Green Desktop site.
Mr. Sun continues his series on hate (in a good way) with 50 ways to make us hate your web design. Also, check out his awesome 6 part series on Creating a vertical Shooter in AS3.
FreelanceFlashGames.com has put together a list of the most popular Flash Game Blogs (by Alexa ranking). We come in at a healthly # 6. Also, if you are looking for an excellent 1941 style vertical shooter, his Naval Fighter is one of the best ever made.
Mochiland has announced the latest Flash Friday Winner, Addup by Deadwhale.com. Addup is a match 2 style game where the sum of the numbers you select much "add-up" to the a certain number. It's a fun little diversion and a unique match style game.
The flashenabledblog.com has a huge wealth of goodies for you all to check out: Photoshop Tutorials Round-up, the Adobe Air Tutorials Round-Up, Flash-filter.net filter give-aways, and much more, including a very cool Data Visualization Round-Up.
As has been the case for a long time, Game Poetry has another wonderful article, this time on game design. It deals with giving the player breaks in game play and is called Numbing the Player. Also, the tool SFXR (something we have highlighted 2x before also) is discussed in Sound Effects on a Budget. It is a great 8-bit sound generator.
Over at Sokay.net , Chris Rock has posted an update to his great AS2 Trace Manager. Also, those guys have a very fun, retro inspired game called Luv Tank.
The always prolific Emanuele Feronato, has a new entry on obstacle avoidance for enemy AI, Part 5 of creating a Flash Arcade in Word Press, and Creating a game like Cirplosion.
Hero Interactive has a couple cool looking new games to check out: Microbe Combat (unfinished), and Bubble Tanks 2 (which needs some help to make it to the Kong #1 spot).
Frozen Haddock has a slew of interesting things to on offer including the 3 parter on making a simple avoidance game.
Some Fresh Kill From Mochiads.com (games that are keeping me from making my own)
ColourPod2: Dimension Pod
As always, check out Flashgameblogs.com for your daily dose.
Atari: The Golden Years A History, 1978-1981 Update #2

I reported on Thursday that my second article on Atari History launched on Gamasutra:
Atari: The Golden Years A History, 1978-1981 , and then I updated with the news that it had hot the front page of SlashDot (http://games.slashdot.org/article.pl?no_d2=1&sid=08/08/21/2135202
Today I noticed that it has been picked-up by Kotaku. They had something very nice and insightful to say about the article:
"It's stuffed with quotes, so the length isn't simply 'and then ... and then ... and then ....'". I know that doesn't sound like much, but it just so happens to be the one major thing i was trying to do with the article. I did not want a long diatribe of my own personal prose vomited on the page with no outside perspective. I'm so very happy they like the approach.
Th story has also been picked-up by: Techmeme , ConsoleCity , Wildest Ride In The Wilderness, Propeller , GamePad , GLinkster , Boing Boing Gadgets , GiantRoBeast and a few others.
Atari History Part 2: 1978-1981 Launches On Gamasutra: Updated!

The second part of my "History Of Atari" launched today on Gamasutra. "Atari: The Golden Years A History, 1978-1981" is long, and self-indulges a lot with the history of the Atari computer line (because the story has told in many places before). If have a bit of time, please go by and read it.
Update: Hey, the story just hit SlashDot: http://games.slashdot.org/article.pl?no_d2=1&sid=08/08/21/2135202
(Typical 80/20 positive/negative reaction in comments). Still pretty cool.
8bitrocket GameStorm! Podcast #2: Secret Sauce
OK, we are back much sooner than expected. Since we launched the GameStorm! Retro Casual Game Idea Generator (see below) today, we decided to use it to formulate another podcast. Today we discuss several different game ideas and designs including an idea that uses one of our all-time favorite arcade games. BurgerTime!
As well, we have expanded a bit to include news and views on the state of the Indie Flash Game Scene. This one is about 30 minutes, and the audio has been vastly improved over last week.