8bitrocket.com
28Feb/080

Destructoid: The Myth Of Casual Gaming = Midcore?

Jim Sterling over at Destructoid has written a very insightful blog about The Myth Of Casual Gaming .  Jim writes:

The truth of the matter is that the hardcore/casual divide is little more than a myth, and the companies that are so desperate to secure themselves a casual demographic are doing little else than chasing rainbows.

Jim seems to be covering some of the same ground that Jeff covered in his original blog about Midcore gamers.  However, I don't think Jim would agree to any term to describe his feelings, especially one thought-up by a little dev blog like 8bitrocket.com.    Still it seems that the idea of there being a majority of gamers that are not described by the terms Casual or Hardcore, abut are simply gamers that want some logical features added to their games  is a growing idea, even if the list of features is a moving target.

We will continue to cover this "idea" using the term Midcore, because we like it and it seems appropriate, but when someone as insightful as Jim has thoughts along similar lines, we will support those as well, even if that same person might not support us.   Thne import part is to spread care about the the concept of "Midcore" in whatever form it might take, not simply to advertise a moniker.

21Feb/080

Flash Game Inter-web Mash-Up: Feb. 21, 2008

Blogs and other cool stuff that might interest the Flash game developer.

Funface Games has an absolutely outstanding article on how to promote your Flash games. This is a must read for anyone serious about making games for a living.

Ira Wiley at One More Blog has recently published an article called How To Make A Successful Flash Game. Ira discusses the criteria he uses to review games for AddictingGames.com. It is a great analysis of what it takes to make a game successful.

The ArmorBlog has a relatively new one on how to become a game developer.It has some very useful information, and points beginners to Flash and AS3.

Scott Bilas, from Drizzle.com, discusses the Oberon development team's experiences in building Flash games. The team is made up of former members of AAA game development teams who decided to try their hand at the casual games market. The article discusses, in detail, what tools and resources a professional game developer will need when he/she starts to work in Flash. It also includes some interesting tricks, tips, and overall is a very useful and full of good information.

20Feb/080

The King Of Kong: The Sociological Inner-Workings Of The Nerdcore

There is a line near the end of the extraordinary documentary The King Of Kong that carries the weight of the entire film. It was spoken by a tween-age girl, but in the context of the film, that girl might be the most "adult" person to show-up on the screen during the movie's 79 minute running time. As her father is talking about getting into the Guinness book Of World records playing Donkey Kong, the girl says back to him "...some people ruin their lives trying to get in there." It is a moment of clarity within an otherwise fascinating yet bewildering yet frustrating series of events depicted in the film. The line does not only stand out because it was spoken by a child, but also because it was not said aloud by any of the adults involved. It's a transcendental moment that takes an otherwise merely likable story and exposes the sociological study that lies at the heart of the movie.

On the surface, The King Of Kong is a movie about a regular guy and perennial also-ran from Seattle (Steve Wiebe) trying to beat the high-score on the coin-op version of Donkey Kong. The high-score that has been held for almost 25 years by guy named Billy Mitchell, who, in the tiny and ridiculous world (a phrase coined by my good friend Brandon Crist in 12th grade) of competitive classic video games that he inhabits, is an incomparable rock star. The mulleted and patriotic tie-wearing Mitchell is a dynamic, successful and charismatic Hot Sauce tycoon from Florida with a trophy wife (his words) who was one of the first video game record holders in the 80's, and remains so to this day. Mitchell's circle of friends and influence extends to most of the competitive classic video game playing field and to the official classic video game score-keepers at Twin Galaxies including their enigmatic leader: the hippie, Zen master, and epic rock song-writer Walter Day. If this description sounds as ridiculous to you, as it was for me to write, then you might be starting to understand how just what kind of of "slice of nerd-life reality" this movie captures. The writers of the Simpsons could not have written more colorful characters nor could the writers of The Office come-up with more uncomfortable situations than the ones these real-life people have placed themselves within.

I don't want to ruin the events in the movie for people who have not seen it, so I'll just say this: the movie tracks Steve Weibe's attempts as a West Coast outsider to "break-in" into the insular world of classic video game competitions (a mostly Mid-West and East Coast activity) ,and follows all the tricks, backhanded compliments, blockades, and subterfuge many of the "regulars" who inhabit that world(many are friends of Billy Mitchell) throw in his way to stop him. The first time I watched the movie (and I've watched it several times now with and without the included DVD commentaries), I sat with my mouth agape in bewilderment. I was so angry at the the events that unfolded on the screen, it was difficult to sleep the night I first watched it. I forced my wife to watch the movie the next night, just so I could have someone to talk with about the movie. She was shocked too, but for a different reason. My very insightful wife caught-on instantly to why the movie bothered me so much, and she reminded me of something I had pushed to the back of my subconscious: I'd lived it. Well, sort of anyway.

You see, back in 1995 I wrote a rock history of the 80's band The Alarm. It was published Goldmine Magazine, at the time, the premiere tome for music collectors in the USA. It just so happened that the same month it was published, Mike Peters, the lead vocalist and songwriter for The Alarm was traveling in the USA. He read the article, and when he came to California, he called me on the phone, and asked my wife and I to come out and meet he and his wife. We struck-up a firm friendship that exists to this day. In 1996, Mike needed a web master for his new web site, and he asked me to do it. I've been running http://www.thealarm.com ever since. In 1997 I traveled to Wales, UK to The Gathering, Mike Peters' annual music festival for fans of The Alarm. I looked forward to the trip very much, and was excited to meet other Alarm fans from around the globe,. However, what I found there was not what I expected. While there were many nice, regular people at The Gathering, there was also a "core" set (a "nerdcore" if you will) of die-hard fans of The Alarm who treated me like, well, complete crap. As I learned from others, these people were part of "the family", a set of Alarm fans who had followed the band from the very early days in the UK, and had been close to it's inner circle. Since I lived in the USA on the West Coast, I had never met or even known about this "elite" crew of fans. Even though I had been a fan of the band just as long as they had, none of them believed I had the "street cred" to be friends with Mike Peters or run his web site. For several years these people attempted to have me removed from being the web master of TheAlarm.com, pulled dirty tricks, etc. I know, it sounds unbelievable, but in the tiny ridiculous world of The Alarm that these people inhabited it made complete sense. Die-hard nerdcore fans of old rock bands are just as nerdy, and just as territorial it seems, as the denizens of the classic gaming competition underground.

To me, this "nerdcore" is one step beyond hardcore: they are the hardcore of the hardcore. Usually they are fans of something (a band, a tv show, a game, etc) that has long-since left the mainstream.  They have stuck around long-enough to become subject matter experts on something that only they really care about.  However, in many cases this "nerdcore" would like nothing better than to have the object of their fandom once again regain the popularity and acceptance that it once held, and along with it, they would be held in high regard as the ones who "stuck it out" while the rest of the world was so ignorant of the greatness of the thing they hold dear.  To this end, they might try to "keep" out others who might threaten their position when this eventual "judgement day" comes to pass.  Of course, in reality they are pushing out any people who might help their cause,  and sometimes end-up hurting the very thing they want to support.  It is an example of irony at its finest.

So for me, watching a guy named "Steve" (look at the byline above), in this instance Steve Weibe, travel to distant locations with honest intentions, while being foiled at every turn by a nerdcore who wanted to protect the territory they had felt was rightly theirs for the past 25 years, struck a chord. It took the movie from being just a simple survey of classic gaming culture into a study of just how far die-hard fans of something, no matter what it is, will go to protect what they believe is rightfully theirs. This is especially true if these fans are adults, and the object of their fandom was something they they loved as kids (or teenagers) but were never able to let-go of. In that sense, it is something I've never seen on film before. King Of Kong provides a view of how small, growth-stunted subcultures feed off their own and ultimately build a wall to protect themselves from the outside world. It also shows how far some of these people will go to stay afloat and on-top of said subculture, because to them it is the most important place they could possibly be. The insightful words of the young girl in the film come back to haunt me when I think of this. "...some people ruin their lives trying to get in there." Yes they do. Some people get so wrapped-up in their own little nerdcore world, that they will protect it all costs. It's an instance when adults act more like children than children themselves. If this hurts outsiders and leaves their own lives stunted or ruined, so be it, as long as they stay "in the know" and at the "top of the heap", no matter how small that heap might be. This propels King Of Kong from an interesting documentary into a must-see, must-own DVD. It is also one of the most compelling and insightful movies I have ever seen.

The amazing documentary King Of Kong is available now on DVD. Buy it from the official site so the filmmakers can try to recoup their costs. The DVD contains a multitude of bonus content and footage that add greatly to the impact of the film.

Filed under: Game Reviews No Comments
18Feb/080

King of American Kong

I have been feverishly trying to put the final touches on my latest game, Pumpkin Man, but have been stalled by the movie King Of Kong. Steve and my sister were discussing it today, and even though I have been itching to see it, I haven't had time. I was jealous that they had seen it, so I ran out and rented a copy. After watching it, all of the special features, and listening to all of the commentaries, I am in awe. The best documentary I had seen before this was a little know opus on middle American film makers called American Movie. King of Kong is just as good or better.

American Movie told the story of Mark Borchardt and his struggles to a create a horror film will little money, poor equipment, but a lot of heart and some talent. The film is filled with real life American wonders in its characters. Some of them seem too far fetched to be actually real, but I have never heard anyone claim they were anything but. Very much in the same vein, King of Kong is filled with interesting characters that almost seem impossibly surreal. Like most cinema (and much of today's new media), some information is left out to tell a good story. Don't worry about that until after you watch the film though. It is a riveting underdog story with touches of treachery and that will keep you glued to your seat.

It tells the story of Steve Weibe, a school science teacher who is trying to beat the Twin Galaxies posted high score on Donkey Kong. Steve is very much a West coast outsider threat to the old boy network protected Donkey Kong high scores of the Twin Galaxies own Billy Mitchell. Steve struggles (seemingly alone) against a cast of over-the-top villains that wouldn't seem out of place in episodes Knight Rider, or the A-team. Mitchell is made out to be a little shifty and dishonest, while the Twin Galaxies gang's one-sided poor treatment of Weibe (for the most part) will leave a bad taste in your mouth. Of course, it is mostly a one-side take, and I know it has come under fire a little for compressing time, and leaving out some material. All that being said, it is a great work of art, and a must see for any film fan, especially a retro fanatic like myself.

Filed under: Atari Nerd No Comments
14Feb/080

Flash Game Development Inter-web mash up : Feb. 14, 2008

The latest in Blog entries and articles that might interest Flash game developers.

On GamingYourWay.com, Squize has finished his latest commercial game - a Rainbow Islands (at least to me) inspired platformer with a Valentines Day theme. Leading up to the release, he has a series of blog entries detailing the development. It is some interesting reading.

Mochiland has the story of Will Hankins's Filler, a game that to me seems inspired by the classic Qix, but with ball physics. Basically, the article details how Will agonized over taking one of a few Exclusive offers for his game, but finally chose to go the non-exclusive route and made much more money. It is a good read, and very important for those of us that don't want to feel pressure to give up our own developed IP to someone at a very low (most of the times insulting) excusive offer price. You will read that Will did get some non-insulting offers, but most of us have received dreg offers for games we have worked countless hours on. If more people follow Will's lessons, maybe the market rate for good games will go up to a deserving rate rather than drop to an even more embarrassing level than today.

We, at 8bitrocket have released the third part of the multi-part lesson on creating an Asteroids game in AS3. In this part I show how to use a sprite sheet to animate missile animations to a single BitmapData canvas.

Jess Hansen has the first part of what might prove to be a very nice set of tutorials for Flash Game developers called, Common Flash game programming challenges, part 1: Rotation with radius. It covers the topic of how to use AS3 to create a moon style object rotate around another object. He goes on to create a game that is similar to some of the 2D Super Mario Galaxy clones being developed right now. This is a great tutorial! His blog is pretty new, but promising. Here is a link to his first game is a physics based puzzled called Minelink.

Real World Software Development has the interesting take on why Silverlight and Microsoft will dominate the Internet.

13Feb/080

Tutorial: Using Flash CS3 and Actionscript 3 to create Atari 7800 Asteroids Part 3

In Part 1 we covered creating an array of pre-calculated vector values for animating our player ship. We also covered caching the rotated frames of the ship in an array of BitmapData objects. We then added the ship to the screen and move it with the keyboard.

In Part 2 we covered adding the asteroids to the screen. The asteroid animation was cached into an array in a different manner then the ship rotation. With the asteroids, we took the frames of a timeline animation and drew each one into a BitmapData image that was placed into an array.

In this lesson, we will cover shooting the missiles from the player ship. We will use a third type of BitmapData animation caching by implementing a sprite sheet. We will cache the frames from the sprite sheet into an array and play them back when the missiles are in flight. We will also add code to capture the [z] key for firing missiles, and implement a method to limit the number of missiles the player can have in flight at any one time.

Creating the missile sprite sheet.

To create the missile sprite sheet I first fired up Fireworks (my graphic editor of choice). In Fireworks, I create a new image with a width of 40 and a height of 4. I plan to have 10 frames of animation and a 4x4 missile. Using the limited creativity at my disposal, I created 10 missile frames by changing the color of the missile on each of the 10 frames. I saved it as a PNG file and imported it into the library of my 7800asteroids3.fla. If you want to use the Flex SDK to make this game, I have provided the .png sprite sheet in the the .zip of for this tutorial.

The missile sprite sheet in Fireworks looks like this (at 800% zoom):

In the library in my .fla file I changed the linkage id of this file to be missile_sheet. That is all the setup needed inside the .fla file. Now, on to the code needed to get our missiles on the screen. Like part 2, I will just be showing and explaining the changes I have made to the code since part 1 and 2. The entire new .fla and .as files available at the end of this tutorial.

In our Main.as class, I had added a class import:

[cc lang="javascript" width="550"]
import flash.display.Bitmap;
import flash.display.MovieClip;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.display.BitmapData;
import flash.geom.*;
import flash.events.KeyboardEvent;
//** added for part 3
import flash.utils.getTimer;
[/cc]

We added the getTimer class. It will be used for figuring out when the ship is allowed to fire another missile. This delay can be changed to add massive amounts of missiles to the screen. If all of these optimizations work correctly, we have the horse power to make some awesome effects.

In the variable definition section I have added in the new game variables needed for animating the missiles on the screen.
[cc lang="javascript" width="550"]
//*** part 3 variables
var missleTileSheet:BitmapData;
var aMissileAnimation:Array;
var aMissile:Array; //holds missile objects fires
var missileSpeed:int=4;
var missileWidth:int=4;
var missileHeight:int=4;
var missileArrayLength=10;
var missilePoint:Point=new Point(0,0);
var missileRect:Rectangle=new Rectangle(0,0,4,4);
var missileMaxLife:int=50;
var missileFireDelay:Number=100;
var lastMissileShot:Number=getTimer();[/cc]

The missileTileSheet variable is a BitmapData object that will hold an instance of the missile_sheet (exported name) in our library.
The aMissileAnimation array will hold the 10 frames of animation for our missile. These will be BitmapData objects.
The aMissile array will hold all of the missile the ship fires that are currently in flight.
Our missileSpeed will be 4 pixels per frame tick. As well, our missileWidth and height will also be 4 pixels. There is no reason why the speed and the height and width are the same, the speed can be anything you want, but the faster you make it, the more of a chance there will be that our missile will go through a rock and collisions will not be detected.

Next we pre-calculate missileArrayLength and set it at 10. Pre-storing this will help speed up our loops, and save execution time. We also pre-create missilePoint, and missileRect. The missilePoint will change for the current x and y coordinates of the missile, but by pre-creating the Point object, we will save execution time during our game loop. The missileRect will always be the same, and we pre-create it here to save execution time later in the update and draw cycles.

The last three things we do effect the life of the missile (the number of frame ticks it will be on the screen), and the amount of missiles that can be on the screen at any one time. By changing the missileMaxLife variable, you will change the number of frames each missile remains on the screen. By changing the missileFireDelay to a lower number, you will allow more missiles to be fired in a shorter amount of time. Conversely, making his number higher will limit the amount of missiles the player ship can have on the screen at the same time. The final new variable is a getTimer object that holds the last time a missile was fired. We will explain more on this later.

In the createObjects() function, we have added lines to create the tile sheet for our missile sprite, and cache the 10 frames into an array of BitmapData objects.

[cc lang="javascript" width="550"]
private function createObjects():void {
//create generic object for the player
playerObject=new Object();
playerObject.arrayIndex=0;
playerObject.x=200;
playerObject.y=200;
playerObject.dx=0;
playerObject.dy=0;
playerObject.movex=0;
playerObject.movey=0;
playerObject.acceleration=.3;
playerObject.maxVelocity=8;
playerObject.friction=.01;
playerObject.centerx=playerObject.x+spriteWidth;
playerObject.centery=playerObject.y+spriteHeight;
playerRect=new Rectangle(0,0,spriteWidth*2,spriteHeight*2);
playerPoint=new Point(playerObject.x,playerObject.y);

//init canvas and display bitmap for canvas
canvasBD=new BitmapData(400,400,false,0x000000);
canvasBitmap=new Bitmap(canvasBD);

//init background
backgroundSource=new Background();
backgroundBD=new BitmapData(400,400,false,0x000000);
backgroundBD.draw(backgroundSource,new Matrix());
backgroundRect=new Rectangle(0,0,400,400);
backgroundPoint=new Point(0,0);

//part 3 init tilesheet for missiles
aMissile=[];
aMissileAnimation=[];
missleTileSheet=new missile_sheet(40,4);
var tilesPerRow:int=10;
var tileSize:int=4;
for (var tileNum=0;tileNum<10;tileNum++) {
var sourceX:int=(tileNum % tilesPerRow)*tileSize;
var sourceY:int=(int(tileNum/tilesPerRow))*tileSize;
var tileBitmapData:BitmapData=new BitmapData(tileSize,tileSize,true,0x00000000);
tileBitmapData.copyPixels(missleTileSheet,
               new Rectangle(sourceX,sourceY,tileSize,tileSize),new Point(0,0));
aMissileAnimation.push(tileBitmapData);
}

}
[/cc]

First, we in initialize the aMissile array. This will hold all of the missiles that the player fires so we can updated them on the screen and eventually allow us to do collision detection between the missiles and the rocks.
Next, we initialize the aMissileAnimation variable. This will hold the 10 frames of BitmapData representing the animation frames for our missile.
We then create an instance of our missile_sheet library png. Since a .png file imported into the library is essentially a Bitmap object (pixel BitmapData), our missileTileSheet BitmapData object is assigned the new instance of the missile_sheet. We pass in the width and height of the missile_sheet when we create an instance of it.

Our next task is to actually loop through the 10 tiles in the tile sheet and create a BitmapData object out of each tile. First we set our tilesPerRow variable to be the number of tiles in the row (40/4=10). We then set our tileSize to be 4. Our tile is a square of 4x4. If the width and height were not the same, we would have to create a tilewidth and tileheight set of separate variables. I specifically created square tiles to eliminate this need. We then create a loop with 10 steps in it.

Within each step, we first need to find the upper left hand corner x position of our current tile to cache and put that in the sourceX variable. This is done by taking the remainder from out tileNum/tilesPerRow calculation and multiplying it by our tile size. So, one the first pass, our source x should be 0. The first tileNum is 0 also. 0%0*4=0. Our sourceX=0; Our sourceY=0/0*4 or just 0 also. On the next line, create a new BitmapData object called tileBitmapData, and give it a a size of 4x4 with a transparent background and no fill color. We then copyPixels from our missileTileSheet into that new tileBitmapData object. We need to supply a rectangle bounding the area we want to copy and a starting point to copy into. The starting point will always be 0,0 or the top left-hand corner of our tileBitmapData object. The rectangle will start at our sourceX and sourceY and extend 4 pixels in each direction. This allows us to cut out the slice of the BitmapData we want and then we place it in the aMissileAnimation array with a push() function call.

[cc lang="javascript" width="550"]

private function runGame(e:TimerEvent) {
checkKeys();
updatePlayer();
updateRocks();
updateMissiles();
drawBackground();
drawPlayer();
drawRocks();
drawMissiles();
}
[/cc]

Our runGame() method has been updated. We have now added updateMissiles() and drawMissiles() methods to each game timer tick. As you can see below, we also added some code to the checkKeys() function. This allows us to capture the [z] key press and fire off a missile when it is pressed.

 

[cc lang="javascript" width="550"]
private function checkKeys():void {
if (aKeyPress[38]){
//trace("up pressed");
playerObject.dx=aRotation[playerObject.arrayIndex].dx;
playerObject.dy=aRotation[playerObject.arrayIndex].dy;

var mxn:Number=playerObject.movex+playerObject.acceleration*(playerObject.dx);
var myn:Number=playerObject.movey+playerObject.acceleration*(playerObject.dy);

var currentSpeed:Number = Math.sqrt ((mxn*mxn) + (myn*myn));
if (currentSpeed < playerObject.maxVelocity) {
playerObject.movex=mxn;
playerObject.movey=myn;
} // end speed check

}
if (aKeyPress[37]){
playerObject.arrayIndex ;
if (playerObject.arrayIndex <0) playerObject.arrayIndex=shipAnimationArrayLength-1;

}
if (aKeyPress[39]){
playerObject.arrayIndex++;
if (playerObject.arrayIndex ==shipAnimationArrayLength) playerObject.arrayIndex=0;

}
//*** added for part 3
if (aKeyPress[90]){
fireMissile();

}

}
[/cc]

The fireMissile() method is called above when the [z] key is pressed.

[cc lang="javascript" width="550"]
private function fireMissile():void {
if (getTimer() > lastMissileShot + missileFireDelay) {
var tempMissile:Object=new Object();
tempMissile.x=playerObject.centerx;
tempMissile.y=playerObject.centery;
tempMissile.dx=aRotation[playerObject.arrayIndex].dx;
tempMissile.dy=aRotation[playerObject.arrayIndex].dy;
tempMissile.speed=missileSpeed;
tempMissile.life=50;
tempMissile.lifeCount=0;
tempMissile.animationIndex=0;
aMissile.push(tempMissile);
lastMissileShot=getTimer();
}
}
[/cc]

When the [z] key is pressed, we first check the value of the lastMissileShot variable. Remember, in the variable initialization section of code for the class, we set this to be the value of getTimer(). Before a missile is shot for the first time, it holds the number of milliseconds that have elapsed since that initialization. We check to see if the current value of the getTimer() is greater than this lastMissileShot value + our missileFireDelay (100 milliseconds). If so, we can fire off a new missile.

We do this by first creating a generic object called tempMissile. We set the current x value of the missile to be the playerObject's centerx value, and its y to be the playerObject's centery value. This way, it will appear that the missiles start from the center of the player's ship. We next set the dx and dy values to match the direction the player is currently facing. We do this by finding the current arrayIndex of the playerObject and using it in the pre-calculated delta x and delta y movement vector array.

We set the life of the missile to be 50 frame ticks, and set its starting life count to be 0. When it counts up to 50, it will be removed from the screen. We set the animationIndex value of the missile to be 0. That will put the missile on the first (red) graphic. The index will be increased on each frame tick. When it reaches 10, it will be set back to 0 and start over.

The final two things we do are push the new tempMissile object into the aMissile array, and make sure to reset of lastMissileShot value to be the current value of a getTimer() call. This will start over the 100 millisecond delay count and won't let another missile be fire until that delay has been reached.

 

[cc lang="javascript" width="550"]
private function updateMissiles():void {
var missileLen:int=aMissile.length-1;
for (var ctr:int=missileLen;ctr>=0;ctr ) {
var tempMissile:Object=aMissile[ctr];
tempMissile.x+=tempMissile.dx*tempMissile.speed;;
tempMissile.y+=tempMissile.dy*tempMissile.speed;

if (tempMissile.x > stage.width) {
tempMissile.x=0;
}else if (tempMissile.x < 0) {
tempMissile.x=stage.width;
}

if (tempMissile.y > stage.height) {
tempMissile.y=0;
}else if (tempMissile.y < 0) {
tempMissile.y=stage.height
}

tempMissile.lifeCount++;
if (tempMissile.lifeCount > tempMissile.life) {
aMissile.splice(ctr,1);
tempMissile=null;
}

}
}
[/cc]

The updateMissile function is called on each frame tick by the game loop. It is virtually identical to the updateRocks() method with one big exception. The missiles will expire when 50 frame ticks have passed. For that reason, we cannot use a FOR EACH statement to loop through the array of missiles. We much use an iterator (for loop) that has a variable as an incrementor. Above, you see that we have a for statement that starts with the current length of the aMissile array (minus 1). We loop backward through the array of missiles.

First we set the new x and y values for the missile by multiplying the dx and dy values (respectively) by the speed of the missile. After that, we check the new x and y values against the stage bounds to apply the WRAP AROUND warp to the missiles. If they leave one side of the screen (or top or bottom) they will wrap around to the other side.

The final thing we do is increment the lifeCount variable and then remove the missile if the count is greater than the life value of the missile. If it is, we splice the missile from the aMissile array and set it to be null so the garbage collector will sweep it up on a future pass. The reason we loop backward through the array is evident here. If we looped forward, when we spiced a value from the array, it would change all of the future array values for this frame tick and the next value in the array (after the splice) would suddenly become the current value. Because we increase our counter loop counter (ctr) right away, we would actually skip checking the missile object that comes after the spliced object. It might sound crazy, but this small item has chased away hours and hours of my debug time.The way around this of course is to loop backward through the array. When we splice a value while looping backward we don't effect the missile objects that are lower than the spliced object.

WHEW!

Now on to the final new section of code for this lesson.

[cc lang="javascript" width="550"]

private function drawMissiles():void {
var missileLen:int=aMissile.length-1;

for each (var tempMissile:Object in aMissile) {

missilePoint.x=tempMissile.x;
missilePoint.y=tempMissile.y;

canvasBD.copyPixels(aMissileAnimation[tempMissile.animationIndex],missileRect, missilePoint);

tempMissile.animationIndex++;
if (tempMissile.animationIndex > missileArrayLength-1) {
tempMissile.animationIndex = 0;
}

}

}
[/cc]

The drawMissiles() method is actually ALMOST exactly like the drawRocks version also. We are simply looping through all of the missiles and calling a copyPixels() method on each on. We copy the current BitmapData object from the aMissileAnimation array to the canvasBD. We first need to set the missilePoint.x and y values to be the current x and y for the missile. Remember, the missileRect was created earlier and doesn't change. It is a Rectangle(0,0,4,4) rectangle that doesn't change, and can be used for all of the missiles.

The only difference between the missiles and the rocks is that we are not going to have a frameCount for the missiles. The missiles will update the animationmIndex on each frame and not wait 3 frames like the rocks do.

Any, my few friends who have made it this far, we are done with part 3.

Use the left and right arrow keys to rotate the ship. The up will thrust, and the [z] key will fire missiles.

The source files are here: 7800 Asteroids Tutorial Part 3 source files

Read Part 4

13Feb/080

Bookworm Adventures Review

Bookworm Adventures

 


Platforms:
PC


Links:

  • Official Site

    Game Play:
    A serious update to the Pop Cap classic Bookworm Deluxe. Fight monsters by creating words from a grid of 16 letter tiles. Play through three separate books and several mini-games. Collect experience to gain levels and increase your health and attack power. Use crystal tiles to increase your attacks. After you finish each quest, you receive a special item that can be used to gain bonuses in your attack or defense. Unlike the original Bookworm game, letters do not have to be touching to be used to form a word. A seemingly simple concept that is, in reality, insanely addictive.
    9/10


    Intangibles:
    The game includes a thin, but welcome story to ties together the increasingly difficult set of word battles. Letters do not seem to arrive in a completely random manner, which helps make the player feel like they are in control. Creating extra-long words that bash enemies to smithereens might be the best use of 6th grade vocabulary words ever devised.
    8/10


    Save Anywhere/Respect Our Time:
  • Perfect. The player can quit the game at any time, and the their progress will be saved. Battles last about 2-5 minutes, with a full level lasting 10-15 minutes. You can extract some satisfaction from this game no matter how much time you have to play it.

    10/10


    Games Should be Affordable:
    $19.95 is an absolute steal.

    10/10


    Reasonable Graphic Choices:
    Graphics and sound are nice and serve the game well. Sounds and special FX are satisfying and should not tax any video card.
    9/10


    Players:

    Single Player Games:
    This is primarily a single player game, although you might find others huddling around the computer trying to help you form words.

    Cooperative Games On One Screen:
    N/A

    Multi-player Games
    N/A . A head-to-head mode would have been a nice addition

    8/10


    Casual Games Don't Have To Be Simple Games:
    Bookworm Deluxe was watershed moment for "casual games" that required real brain-power to complete. Bookworm Adventures takes the concepts of the earlier game and expands them into a deeply addictive contest.
    9/10


    Size Does Not Matter
    Very small footprint:. 43MB of hard drive space required. A perfect example of a quality game with almost no bloat.
    10/10


    No need to be mature for the sake of being mature:
    Some of enemies are a bit scary, but nothing that would keep the family or your non-geek girlfriend/boyfriend away
    .
    9/10


    Yes To One-Time Fees, Rarely To Monthly Fees:
    Pay once, but no options to update with more levels.

    8/10


    Final Mid-Core Gamer Score:

    One of the best Mid-Core game available for the PC

    90


    12Feb/080

    Alien Shooter Vengeance Review

    Alien Shooter Vengeance

     


    Platforms:
    PC


    Links:

  • Official Site

    Gameplay:
    Blast scores of aliens in this 2.5D isometric shooter. The game has the feel of the "Fallout" series put into an action game.
    8/10


    Intangibles:
    Feels old school, but plays very smooth. Explosions and FX are very satisfying. Addictive to the core.
    7/10


    Save Anywhere/Respect Our Time:
    Auto save after completing a mission.
    5/10


    Games Should be Affordable:
    $20.00 is right on target. The quality price ratio for this game is outstanding.
    10/10


    Reasonable Graphic Choices:
    Plays on most PCs. Incredible 3rd person, above perspective 3d visuals. It looks and plays like the best Genesis, Amiga, or Atari ST game you have ever seen.
    8/10


    Players:

    • Single Player Games:
      This is primarily a single player game.
    • Cooperative Games On One Screen:
      N/A for this game. No two player action that I can find on one screen. This doesn't hurt the game in the least.
    • Multi-player Games
      Free cooperative and death match multi-player

    7/10


    Casual Games Don't Have To Be Simple Games:
    This is basically a shooter. There are RPG elements though that help it to be more involving.
    9/10


    Games Do Not Need to Be 5.5 GB To Be Good:
    Relatively small footprint. 500MB of HD space required. Not out of the ordinary for the quality of the game
    7/10


    No need to be mature for the sake of being mature:
    Very violent, a lot of blood and dead aliens.
    6/10


    Yes To One-Time Fees, Rarely To Monthly Fees:
    Pay once. Free multi-player.
    Manifesto Score 10/10


    Final Mid-Core Gamer Score:
    77


  • 7Feb/080

    Flash Game Development Inter-web mash up : Feb 7, 2008

    The latest in Blog entries and articles that might interest to Flash game developers.

    Scott Jeppesen, a friend, and recent new hire at Electrotank, has created an awesome logging tool for Flash CS3 and Flex in AIR. In his blog entry, he describes some of the cool features such as the ability to filter log messages by the logger instance -so if you have multiple apps running, you can just see log messages from the one you are interested in.

    On the GamingYourWay blog, Squize has a new series of diary entries on his latest game - a Valentines Day themed platformer. If you are interested in a peak at the game development process from a seasoned, consummate pro, check this out.

    Mochiland has posted the latest in Steve's (8bitrocket's very own Steve) series on making an object oriented shooter in AS3.

    Make it big in games has a new feature on 80 Ways to Add Community Features In Games. This is not NEW, but it is relatively recent and very much worth a read.

    GameProducer.net has a very interesting feature on To Clone or Not To Clone. It discusses the time honored decision of how much to innovate when trying to create a game.

    Venture Beat has a new article called Four startups talk about making casual games work

    20 Tutorials To Create Your Own Flash Game is a new entry on the dezinerfolio.com site. This is a very nice resource for the beginning, novice, and even intermediate Flash Game designer/programmer.

    5Feb/080

    Anatomy of a Flash Game: Lesson 2 – Creating Enemies And The Game Environment

    The good people over at Mochiland have posted part two of my four part tutorial on making a game in Flash AS2 using object oriented methodologies while incorportaing Mochibot, Mochiads, and Mochi Leaderboards

    This lesson covers creating enemies, creating a score board, and various other topics in the quest to create a reusable framework for making games.

    Please check out the lesson here:

    Anatomy of a Flash Game: Lesson 2 - Creating Enemies & The Game Environment

    Filed under: Tutorials No Comments
    This site is protected by Comment SPAM Wiper.