Mobile Web Games In HTML5 – Hit and Miss

I have spent the first three days of this week working on a couple HTML5 games that will eventually make it into our book on the Canvas and will also probably show up here in some form or another (and maybe even in the various App Stores). I chose to make two relatively simple games, each targeting different functionality.

The first game I created was a simple BullSh*t Bingo app. It is a 5×5 grid that let’s the user play a game of bingo with buzz words that might be said in a boring meeting. There are quite a few of these out there (5 in the iTunes app store) and we even had one up ages ago (written in .net, so I have to re-code it to show it here again).  The functionality I wanted to test was to draw everything using a single Canvas and target the Mobile Safari browser. The app has the user click on the 25 buttons, each representing a word or phrase. The buttons  change state, and play a sound embedded with the HTML5 Audio tag when clicked. After a little trial and error with sound file types (mp3 works best in Mobile Safari), I was able to get application working pretty well. I targeted a 600×600 browser window and it worked pretty well in Safari on the desk top.

I uploaded the files to our web server and I was able to get the app to show up in Mobile Safari and even play sound! The problem was that the Mobile Safari browser has a strange DPI setting (very high) so my app looked tiny and none of the buttons and words could be read very well. I was able to find a couple meta-tags that force the screen into a “no scale” mode and this seemed to do the trick nicely. I had to scroll the page up/down/right and left to see all 25 squares, but I was satisfied with my first test.

Next I started a new project in Xcode  to create a PhoneGap application out of the game. This takes a little trial and error, but within about 15 minutes I had it up and running on the simulator. I noticed that on the real (or simulated) device, running as a native application, the landscape mode would not automatically become invoked. I played around with he “-info.plist” file for my PhoneGap project and was able to set it to be in Landscape mode only. I then had to resize all of the buttons and write some new text parsing functions so  I could get all 25 buttons on the screen without scrolling.

Once this was complete, I plugged in my iPod touch, and then went  through the long and complicated steps to register my Apple account, device, and computer into the Apple Borg. Once assimilation was complete, I was able to test the app directly on the device and it worked perfectly!

Encouraged, I broke out a much more processor intensive HTML5 app, Geo Blaster Basic. This app is an Asteroids variant that has a lot going on and many screen updates. After fashioning some very crude buttons to the bottom of the app (to replace the keyboard controls),  I created an Xcode PhoneGap project and tested it in the simulator. It worked pretty well. I then tested it on the device and was sad to see it move at a sluggish pace. The little device just didn’t have enough power to force Javascript to run at a fast speed and update the Canvas 30-40 times a second.  The buttons also didn’t work well at all, and the “click” event didn’t fire off nearly as much as needed for an action game.

The game is not optimized though, as every graphic is re-drawn each frame using paths (a little like drawing vectors on every frame with code in Flash). Also, I didn’t pre-calculate the vector movement math or use object pooling. While it looks like the various desktop browser implementations of the canvas can handle some pretty unoptimized code, the mobile versions still cannot.

From this little testing it looks like relatively simple HTML5 games (word, puzzle, etc) will work fine on Mobile Safari and even as native applications, but games that require constant screen updates will need a lot of optimization before they even come close to performing at an acceptable rate.

My next goal will be to optimize the GeoBlasterBasic game with bitmap graphics instead of paths drawn every frame. This will be akin to creating a BitmapData pre-rendered tile sheet in AS3.  We’ll see if this improves the performance.  As soon as I have something worth showing I will put it up here on the site.

Posted in iPod/iPad Develpment | View Comments  

Spil Launches $50K HTML5 Game Contest

August 31, 2010 5:00 amtoFebruary 28, 2011 5:00 am

The Spil Group thinks HTML5 will surpass Flash on the web very soon, and they are willing to put money where their mouth is: specifically $50K! Here is a link the the article: HTML5 Mobile Game Sites and an HTML5 Developer Contest.

Here is what you need to know:

HTML5 Developer Contest:

As part of its commitment to HTML5, SPIL GAMES is inviting game developers to bring HTML5-based games to market through a contest. The contest boasts a total prize pot of $50,000, and winning games will be featured on all SPIL GAMES’ mobile sites. The contest will run for six months, and each month SPIL GAMES will select new games to be awarded. Developers can submit their games and find all related information at www.html5contest.com.

Posted in Contest Tracker | View Comments  

Atari Greatest Hits Finally Coming to the Nintendo DS!!

I have been waiting for a good version of some Atari retro c classics to hit the DS for a while now. The old DS Atari pack is a pathetic POC, but this new one looks to make up for it and more!

This $29.99 pack has about 50 games included. There are both arcade classics as well as Atari 2600 favorites:

Atari Arcade Classics
Asteroids, Battlezone, Centipede, Gravitar, Lunar Lander, Missile Command, Pong, Space Duel, Tempest

Atari 2600 Favorites
3D Tic-Tac-Toe, Adventure, Air-Sea Battle, Asteroids, Atari Video Cube, Basketball, Battlezone, Bowling, Centipede, Championship Soccer, Dodge ’Em, Flag Capture, Football, Fun with Numbers, Gravitar, Hangman, Haunted House, Home Run, Human Cannonball, Math Gran Prix, Miniature Golf, Missile Command, Outlaw, Realsports Baseball, Realsports Boxing, Realsports Football, Realsports Tennis, Realsports Volleyball, Sky Diver, Slot Maching, Slot Racers, Sprintmasters, Starship, Stella Track, Submarine Commander, Surround, Swordquest Earthworld, Swordquest Fireworld, Swordquest Waterworld, Tempest, Video Checkers

You can even play head to head via Wifi with other DS players in the same room.  Space Duel is one of my favorite games of all time, and I cannot wait to try it out on the DS.  I hope they make a 7800 + Atari 5200 + Atari XE pack next. Maybe they can follow that up with an Atari ST Pack, and then a Jaguar / Lynx Pack!!!

We are looking to get a copy to give away, so keep your fingers crossed that we do. We’ll probably have some sort of a micro-retro game development contest to pick the winner.

Posted in Atari Nerd | View Comments  

Commodore To Make PC in Classic Commodore Case: Pong Ball’s In Your Court, Atari

It turns out, a company has bought the “Commdore” name and is planning to create a PC housed in a Commdore 64 case.  that’s awesome. However,  personally can’t buy one as it is simply against my Atari sensibilities to do so.   However, if Atari would do the same thing, with the Atari 800 (too large actually), 65XE (too small) or the 800 XL (just right), I’d buy it in a second.

So how about it Atari?

Full press release below:

COMMODORE ANNOUNCES EXCLUSIVE WORLDWIDE LICENSING RIGHTS
Companies ink deal to produce new line of All-In-One keyboard computers.

FT. LAUDERDALE, FL and OLDENZAAL, THE NETHERLANDS, August 25, 2010 – Commodore USA, LLC and Commodore Licensing B.V., a wholly owned subsidiary of Asiarim Corp (OTCQB: “ARMC”), today announced their licensing agreement whereby Commodore USA, LLC will produce a full line of new Commodore branded “AIO” (All In One) keyboard computers, under an exclusive worldwide license granted by Commodore Licensing B.V. for this newly revitalized computer category.
Mr. Barry Altman, President and CEO of Commodore USA, LLC states “We are ecstatic to be partnering with Commodore Licensing B.V. in this new, exciting product launch. The legacy of the Commodore C64, which sold over 30 million units, making it the best selling computer of all time, and our reintroduction of this legendary form factor, combined with the world’s most recognizable consumer electronics brand, is a once in a lifetime opportunity. We look forward to bringing these new products to market, and welcoming a whole new generation of computer users to the Commodore experience”.

In response to an overwhelming demand from former Commodore users worldwide, Commodore USA’s CTO Leo Nigro announced today that their new Commodore PC64 will be available for purchase this holiday season. Featuring an exact replica of the original beige chassis Commodore C64, this new addition to our lineup will include an Intel Atom 525 CPU with NVIDIA Ion2 graphics, 4GB DDR3 memory, 1TB Hdd, HDMI, DVD/CD optical drive (Blu-ray optional), dual-link DVI, six USB ports, integrated 802.11n WiFi, bluetooth and a 6-in-1 media card reader.

With the recent introduction of their flagship Phoenix model, Commodore USA has once again catapulted the Commodore namesake to the forefront of consumer electronics brand recognition. Other Commodore keyboard computers include the Amigo, a basic entry level computer featuring a system on chip configuration, and the Invictus, featuring a small portable form factor with an embedded LCD screen display.

About Commodore Licensing B.V.:

Commodore Licensing B.V., a wholly-owned subsidiary of Asiarim Corporation (OTCQB: “ARMC”), is the licensor of the trademark Commodore, and grants other parties licenses in connection with specific products or services. Asiarim Corporation is also investing in companies engaged in, or related to, the development, sales and distribution of computer, mobile and multi-media products marketed under the brand name Commodore.

About Commodore USA, LLC:

Commodore USA, LLC designs, produces and markets a series of all-in-one Commodore branded keyboard computers, and other unique form factor computers and consumer electronics.

Barry S. Altman is the President and CEO of Commodore USA, LLC, based in Fort Lauderdale, Florida. Spanning a 25 year career in the bleeding-edge electronics and satellite/space telecommunications industry, Mr. Altman founded and served as CEO & President of Cabletech Satellite Systems, Inc. U.S. Cable Technology, Inc., The Cabletech Satellite Network and United Broadcasting Co. This group of companies built NOC’s (Network Operation Centers) for cable television programmers, and cable television head ends for cable companies throughout the United States, They designed and constructed the satellite uplink network operation centers for such companies as Viacom International, Warner Amex, Viacom and MTV Networks. They directed and produced the domestic satellite telemetry downlink for the Live Aid concert for MTV, which was at that time the largest world wide deployment of a live satellite television broadcast. Cabletech has manufactured, designed and installed systems for Grumman Aerospace, The United Nations, government and private industry, and over 45,000 TVRO C& Ku band satellite systems for businesses and consumers nationwide. Cabletech was a developmental partner with General Motors & Hughes Communications in the small aperture DBS system that later became DirecTVv.

Posted in Atari Navel Gazing, Atari Nerd, Uncategorized | View Comments  

Does The Droid-X Blockbuster OnDemand Commercial Make Sense?

I have seen this commercial quite a few times and have always had a little “itch” in the back on my mind as I see it. I didn’t have much time to ponder this “itch” until this morning.

I can’t find the commercial on-line (but I see it in online video pre-rolls all the time, especially on the Comedy Central Site). The commercial shows a dude, sitting in from of some HUGE Apple iMac-like monitors (presumably at work?) as he watches “giant” (as described in the commercial) Blockbuster onDemand video on his mobile Droid-X phone.

Note: I found the commercial. It looks like the guy is using Windows. In the final cut away shot his other monitor does look like a 36 inch iMac. In any case, especially since he is in Windows, why watch the onDemand on his tiny mobile screen?

What’s wrong with this picture? Why would he watch the video on a relatively tiny mobile screen (tiny in comparison to the 36 inch iMac monitors right next to him?). This was really bugging me because I would much rather watch the Bourne Supremacy (the movie he is watching in the commercial) in HD wide-screen on one of those giant iMac monitors next to him.

So, I ventured over to the Blockbuster site to have a look at the onDemand library on my iMac, and this is the message I get:

So, it seems they left some of the story out of the commercial. That dude first tried to watch the video on the giant iMac screen in front of him, but since Blockbuster’s site won’t work with any operating system other than Windows (plus IE or IE + Firefox bastardization tab) he got frustrated, pulled out is mobile device and was able to see the video there.

Wow, that makes sense now.

Posted in diatribe | View Comments  

(not) Royalty Free H.264 (Might) Boost HTML5 Video & The Canvas, But Flash Still Has A Chance (Analysis) : Updated

Yesterday it was announced that MPEG LA, the patent holder for H.264 (MPEG-4) will “never” charge a licensing fee for video encoded as H.264 and delivered for “free” over the internet.

What does this mean? Well it means that Firefox and Opera, two browsers that have so far held-back implementing support for H.264 because of the potential cost of the license, will probably go ahead and implement the format for HTML5.  (Or maybe not.  See that note below)   It also means that the  Theora (OGG) and WebM formats might fall out of favor.  It also means that developers, who have so far needed to encode their HTML5 video three different ways (.mv4, .ogg, webm) might get to settle on one format.

That one format, that has the potential to work across all platforms, both desktop and mobile, will probably send Flash video back to the niche it started from.  This does not mean that Flash video will not be used, but it does means the adoption curve of HTML5 video over Flash will start to accelerate.  There are still many technical reasons to choose Flash for video on the web over HTML5 (i.e. HTTP streaming, better control, progressive download, etc.) but it will become quickly apparent that the majority of developers will choose “ease of use” over features, and most end-users will not know the difference.

At the same time, the continuing adoption of the HTML5 Canvas will probably force Adobe to support the Canvas as a (limited) output option for the Flash IDE.  This is not necessarily a bad thing, as it will extend the life of the Flash IDE.   The HTML5 Canvas will soon be supported by all major browser platforms and mobile devices, something that Flash will not be able to achieve without a legal victory (no thanks to Apple).  For standard interactivity on web pages, HTML5  & the Canvas will become the king, especially for common elements like UI and targeted advertising units.

My feeling though, is that if Adobe makes the right decisions,  most users of the Flash IDE will never know the difference.  To do this, Adobe needs to implement HTML5 Canvas support into the next version of the Flash IDE.   They need to make the support transparent to most end users, and make it part of the standard Flash IDE export options. If they don’t, Flash will die a slo death.   Yes, I’ve said it.  If Adobe does not embrace HTML5 and the HTML5 Canvas, the future of Flash is in jeopardy.

Adobe should be able to create a way for the Flash IDE to export 80-90% of Flash’s functionality to the HTML5 Canvas.    A Flash IDE, an “export” to a web page could include a .swf and the packaged assets and JavaScript for the HTML5 Canvas.  The Flash <embed> could also include the ability to switch between the .swf or HTML5 Canvas version of the app depending on the platform executing the HTML page.  If Adobe can achieve this in the next version of Flash, they can help transition their core audience of web developers to the HTML5 standards, while keeping their customers dedicated to the Flash IDE.

However, For the Flash .swf format to survive, more need s to be done and it needs to be accomplished quickly.  This means a migration towards higher-end applications and games that simply cannot be created in HTML5.  Adobe needs to get those robust 3D features into Flash as soon as possible, and continue on a path of supporting motion, touch, and gesture based interfaces across all platforms.   They need to enhance and promote the audio features of the .swf, which right now (and into the foreseeable future)  outstrip HTML5 on every level.  They also need to make sure that the Flash IDE can target as many platforms as possible, hopefully with a native compile  (Air for the Wii or XBox 360 anyone?).

I am a huge fan of Flash, but I’m not a technology bigot.  I love Flash because of what it brought to my development efforts.  I still think it is a great tool.  However, the reality of the situation is that HTML5 and the HTML5 Canvas will be able to achieve much of what Flash can do now, and they will do it across nearly all platforms.  That will make HTML5 the lowest common denominator.  For Flash to survive, it needs to be enhanced and differentiated before it goes the way of Java Applets, Shockwave, and all the other technologies that were once defacto standards until the day they suddenly were not.

Update:  This link has a good analysis of why people have gotten the wrong idea about this announcement. Our analysis of the HTML5 Canvas and Flash still stands, but as far as video goes, Flash still might be the top platform for some time.  Thanks to all the people who commented to clear this up

Posted in Uncategorized | View Comments  

Going Solo (from the corporate beast) #6 – The First Month

Working at home and on your own without a corporate sponsor has its advantages and disadvantages. The advantages are that I am home every day and can work the hours I choose. I get to see my family much more than ever before and even a couple times a week we can take a break in the middle of the day to go to the park or the beach with the kids. I can even visit the gym or go for a run in the middle of the day when I catch some free time, so all in all, time-wise I have been able to see some advantages.

On the other-hand, my work-day stretches from 7:00 AM until 11:00 PM on a good day. Most days there are ample breaks in this schedule, but it certainly is no 9-5 job with glorious benefits and amazing pay (yet). Obtaining health, life, and dental insurance has been quite a little pickle with the individual market for those services being just as bad or worse than I imagined (and had been told). I won’t name any company names, but I applied for an individual family health insurance policy a couple weeks ago and I have not heard back from yet. I was wondering why (when I was told that they get back within 3 days) and then I read today that the company was approved for a 14% increase in rates. My feeling is that they stopped all new policies until they can enforce those new rates.

Earnings-wise the first month as pretty dreadful, but I knew what I was getting into when I started this. I had quite a few jobs lined up at the end of July but by the second week of August all of them had fallen through. I did get a couple decent paying gigs (in the final 2 weeks) through people I have known for a while, but those were certainly not enough to make up the difference in the contracts that evaporated.  I will not elaborate on numbers, but the actual money earned in August was roughly 1/4 of the income I made in July. Now, as contracts heat up and clients become more plentiful I hope to move that to 50-60% in September and maybe 75% by then end of the year.

I’m not yet convinced that doing client-work exclusively is best route to health, well being, and financial success, so I have also started to look into creating software engines and other items to sell to the professional ranks (and possibly to end-users as applications).  You would think that I would have had ample to get his going, but much of my August time as spend on developing for projects that “died on the vine”.

My plan is to take some of the dead projects and use them as the basis for engines that I sell. The first I put up was a re-package of the first AS3 re-skinnable game engine I created, called the Micro Robot Maze engine.  This basically Pac-man on steroids that is completely editable via XML (with a few changes needed to the .fla). It is an AS3 engine that was built for a blit optimization test and it grew into a nice little re-skinnable product focused at professionals who need a quick engine to re-skin.

That idea is fueling my latest project, an on-line book/comic book viewer application focused on professionals who want to show off hi-end graphic novels or comics in a slick AS3 interface.  I plan to have this engine complete by the end of next week.

Here are the other AS3/HTML5/Mobile game engines I plan to create. If anyone needs one of these soon, let me know. I will prioritize it:

-Re-skinnable classic game engines: Asteroids, Space Invaders, Centipede, Star Castle, Food Fight, a single screen Donkey Kong style platform engine, a multi-screen platform game engine, and a RPG / Quest style over-head 2-d engine.
- An e-learning system what uses video clips and allows for tracking calls back to the server.
- A Match-N style traditional casual game engine
- Both a path defense and a tower defense traditional Flash-style games engines
- A physics-based platform game engine
- A solitaire card game engine
- Chain reaction style game engine

The challenge is making these as easily re-skinnable as possible. Planning takes a lot of time when the goal it to allow others to create their own custom games easily with your game engine.

Where I can I will turn the games into showcase FlashGameLicense and Mochi products that integrate social and coins style features.

I also plan to put up a shop to sell 44K high quality wav file clips of music and sound effects. That one is on the back-burner until I can find a good digital asset sales system that will integrate with WordPress or an offsite service that works well with digital content and has good payment gateway integration.

On to September…

Posted in 8bitrocket History | View Comments  

More Games I Might Play Again (Flash Game Micro Reviews)

Ahh, here I am, its a beautiful Sunday afternoon in Southern California, and I am in doors, playing YOUR games. God I hope they are good this time…

Hikouki Tomodachi (FGD) (82% Retrotastic) – A very fun, and well done 1 or 2 player vertical scrolling blast-fest.

Darts and Beer (FGD) (75% Retrotastic) – Just as the title states. Play a pretty decent version of Flash darts and chug some beer (virtual) between each round. The more you drink the more difficult the game becomes.

Megapolis Traffic (FGD) (79% Retrotastic) – I love the look of this game.   The object is to navigate public transportation to get to your desired end point. A novel concept.  There are some interesting game design ideas in this one.

Protect The Treasure (FGD) (70% Retrotastic) – A simple, but pretty well presented shooter. You must protect your treasure from the attacking horde of zombie-like creatures.

Britney Spears (FGD) (10% Retrotatsic) – This dress-up game is notable only for how little the avatar looks  like Britney Spears.  It gets 10% because they did a good job looping the music sample. Let’s note that I don’t despise these games and understand they have and audience and hopefully make some money for the developers. This is not a good one though.

Santa Pod Racer (FGD) (80% Retrotastic) – Now, this is a well done little “Dragster” style game. It reminds me of the Atari 2600 classic.

Gunzy (FGD) (80% Retrotastic) – Another fun little game. You keep the can in the air while earning badges and shooting other little critters that make an appearance. It really is a cool little time waster.

Zombie Beast Stampede (FGD) (83% Retrotastic) – A deep and fun little “Tower” not “Path” defense style game combined with an arcade shooter.

E7 (FGD) (90% Retrotastic) – A cinematic masterpiece hiding in a very well crafted physics-based side-scrolling adventure.

Posted in Flash Games, Reviews | View Comments  

Vacation Game Brainstorm: Mark Twain was here…?

So I’m on a short trip with my family on California Highway 49, in the Gold Country.  Specifically, we have been roaming Calaveras County, the very same county made famous by a certain Samual Clemons in his story the local Frog Jumping Contest.

Now, there is a lot of history up this way.  100′s of towns and mining camps sprung up and wound down within a very short time span in 1850′s during the gold rush.  Most still exist in some form, and offer a lot of historical significance for those who bother to take the time to look.

However, in Calaveras County, one thing is perfectly clear.  Mark Twain rules.  Except, in some places there are very tenuous ties to the man himself.

Take this cabin to the left for instance.  The sign on the road said “Mark Twain Cabin”.  We drove-up there, only to find that this was was was “thought” to be Mark Twain’s cabin.  Huh?  I “think” that sucks.

Obviously, the desire to grasp to history, no matter how tenuous, overshadows the fact that there is a whole lot of really great, easy to access, rich and deep history in this place regardless of whether. Mark Twain visited it or not (I’m a Twain fan, but not at the expense of reality).  However, that basic truth does not necessarily make a fun game.

So, here is my game idea.  You have just bought Calaveras County.  Not reason to make-up  a story, you simply own the whole thing.  Your job is to mark every spot that Mark Twain ever set foot upon.    You first goal is to “discover” some of Twain’s DNA.

After that, you have to buy a “DNA detector” and go wondering the hills looking for every spot Mark Twain “visited”  in the woods,  When you find one, you erect a beautiful marker, like this one:

When you have 10 markers, you can create a “tour”.    I’d call it, “If Mark Twain Took A Cr*p In The Woods…”

Posted in Uncategorized | View Comments  

Tutorial: Turn Your Flash Game Into A Google Chrome Web App (beta)

While the Google Chrome App Store will not be available until October 2010, you can still package-up your apps and test them as Chrome Web Apps.   Google has some extensive documentation on the subject, but we are going to slice it down and show you the easiest path to success.

Step 1: Get The Right Browser…Windows Only!

Yep, the only Chrome build that supports the installation of Chrome Web Apps, right now, is Chrome for Windows.  You will have to subscribe to the Chrome “Dev Channel” and then download the browser.  This is really simple.  I didn’t really “subscribe” at all, I just downloaded the dev channel version of Chrome to my Windows machine.

Step 2: Set-up The Browser To Load Apps

After you have downloaded Chrome, you need to create a short-cut in Windows so you can change the path to the Chrome.exe executable.  You need to do this so you can add the “–enable-apps” option to the execution path.  This option allows you to test the “loading extensions” functionality which is the basis of the Chrome Web App technology.

Here is an example of the link to put in the Target box of a short-cut in Windows XP:

1
"C:\Documents and Settings\username\Local Settings\Application Data\Google\Chrome\Application\chrome.exe" -enable-apps


Step 3: Prepare Your Flash Game

Now you need to get all the assets together in a folder/directory that you will provide as part of the Chrome App installable package.  This includes:

  1. .swf file
  2. An HTML file that holds your .swf
  3. a 24×24 px .png icon
  4. a 124×124.png icon
  5. Any other assets the .swf needs to load externally

For this example, I decided to use our game “Palindromes Plus“. First I found the Mochi version of palindromesplus.swf and the converted the cartridge icon image we use into  24×24 and 124×124 icons.

I then created a palindromesplus.html page.  To make it simple, I made the background of the HTML page black, and centered the game on the screen.

Step 4: Create Your Manifest.json File

The manifest.json file is required for every Chrome Web App.  It describes  meta-data about the game you are creating, and where to find some essential assets.  Most of this file is  (like name, description, version) self-explanatory.   However, a couple items could use a little sunlight to make them clear:

  • “app:launch” section:  The “app:launch” section contained describes how this app will execute:
  • web_url: This is the complete URL to an app that exists on the web.  You can deploy an app a s a Chrome web app without embedding the code in your directory/.crx file (more on that later)
  • local_path : a relative path to the html file that will launch your app.  This is required for a “server-less” app that can run offline.  This is the style we are creating for our Flash game.
  • “permissions” section:  This section defines some security constraints around your app for specific Chrome APIs and storage.   This is where you would place urls that your app might call for web services and xml rpc requests. We don’t really use this, so we left the default from the Google example ( here)
    • notifications : Allows the app to use the proposed HTML5 notifications
    • unlimited_storage : Allows for unlimited HTML5 Server-side storage.

There are other options you can read about all the manifest.json file options here: http://code.google.com/chrome/extensions/manifest.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"name": "Palindromes Plus",
"description": "Unscramble The Palindromes",
"version": "1",
"app": {
"launch": {
"local_path": "palindromesplus.html"
}
},
"icons": {
"24": "24.png",
"128": "128.png"
},
"permissions": [
"unlimited_storage",
"notifications"
]
}

Step 5: Create Your Application Folder

After you have your manifest.json, .html file, .swf, and and .png file files,  you need to create a folder file to hold them all.  Create a folder and place all of the files inside of it.

Step 6: Launch The Chrome Developer Version

Find the shortcut you created to the Chrome Browser  with the “-enable-apps” command line option and launch it.

Step 7: Install The Extension (Chrome Web App)

  1. Find the Wrench icon in the upper right hand corner of Chrome and click it.
  2. Choose The Tools Menu
  3. Choose The Extension menu
  4. Click the (+) next to Developer to open Developer mode

You should see the following screen:

To load your extension, click the [load packed extension] button and find the folder you put the files into.  Once you find it and click [OK], the extension will load.

Now, to try the Chrome Web App, simply click on a New Tab, and you should see the icon you created:

Click the icon to play the game.

Step 8: Create a .crx File

A .CRX file will be needed to distribute your app in the Chrome App Store.  This is very easy to create.  Follow the directions to get back to the developer mode.   Then click the [pack extension] button.

This will bring-up the following screen:

For the “extension root directory”, find the folder you created with the manifest.json, etc.

Click [OK]

A .crx and .pem license file will be created for your app.  Hold on to these for when the Google App Store is ready to accept new applications, or for when Google Chrome can load packed extensions (not available yet).

A .crx is simple a .zip file with the extension changed.  You should be able make these without using Chrome very easily.

That’s It…But It’s Still Beta

Google says all of this could change wholly or partly by the time the Google App Store launches, but we thought it would be cool to give some idea of what the process and work flow will look like once the Chrome Web App Store is ready for action.

Here is a zipped directory for the Palindromes Plus extension: palindromes.zip that you use to try this on your own.  It includes the .swf, a sample manifest.json file, and icons.

Here is the .crx  abd pem files we created for Palindromes Plus:  palindromes.crx and palindroms.pem (.zip)


Posted in Flash Game Development, Tutorial-Flash, Tutorials | View Comments  

Atari Nerd Interweb Mash-up

Here are some of the more interesting Atari related retro gaming related tidbits I found while trolling across the infobaun.

The Classis Game Room HD Reviews Atari 2600 Video Olympics – The only way to play pong on the 2600! (literally and hyberbole). Who doesn’t like Ice Hockey Pong with 4 players?

The Classic Game Room HD Review Atari 2600 Home Run – If they called it “Over The Line” or “Pickle” it would have been a better description.

Curt Vendel has added some new stuff to the AtariMusem.com site:
-Pictures and some descriptions of his Atari Corp  document, blueprint, etc cataloging project.
- The pre-release issue of Atari Connection Magazine (circa 1981) was added to the archives.
-New an interesting Jaguar docs including the payment amounts to game developers and  a licensing agreement to use Jaguar tech in set top boxes.

Here is one of the numerous reports that quoted Nolan Bushnell as calling himself stupid for having sold the original Atari.

The ISO50 Blog’s awesome set of “would-be” Atari design concepts.

The Music from Alternate Reality (The City)  for the Atari 800. It’s as good as the Mule Music but a little more ethereal.

The SteelBerry Clones blog has a sweet Atari 8-bit demo scene piece of “zar jaz”.

The Retroist provides Atari rainbow logo wall paper.

And finally, and absurd apology (via Gizmodo) on the screen of an Atari TT used to test Jaguar Games.  I wonder what the “transgression was…”.

Posted in Atari Navel Gazing, Atari Nerd | View Comments  

The Future Of Web Games: The Google Chrome App Store

1Up.com is running a story from GDC Europe about the Google Chrome App Store.   From the details provided, it looks like Google has a real winner on their hands.  Here are the highlights from the article.

Google Chrome App Store

Launch Date: October 2010

Supported Technologies: Flash, HTML5/JavaScript, C++

Installation: Users “install” web apps on their device/machine.  Permissions are granted at install time.

Google’s Cut: 5%

Store Features: Free and paid apps, free trials, subscriptions. No micro transactions (yet), but you can use other solutions or roll your.

Steps To Deploy Your Game

  1. Create a web based game
  2. Create a wrapper (manifest file with icons, metadata)
  3. Upload: Create pricing, description, add videos, etc.
  4. Publish

We are very excited about this.   8bitjeff is developing a strategy right now to put it through it’s paces with a real-world test very soon.

Posted in Uncategorized | View Comments  

Games I’ll Play Again #3 – Flash Game Distribution and Mochi Reviews

I find it easier to get into my day if I play a few games first.  Digging through the Mochi Latest and Flash Game Distribution feed, here are some games that were good or bad enough for me to want to take a second look (at some ethereal unspecified future date).

Deep Diver (FGD) (83% Retrotastic) – A well made arcade / exploration game with mellow music (I was almost lulled to sleep by the long intro and the music, but it is a great game for kids)

Crazy Race Arena 2 (FGD) (85% Retrotastic) – An ambitious (if slightly flawed) first person 3D “smash-em-up derby game”. This took some technical wizardry.

Cork Blaster (Mochi) (65% Retrotastic) – This isn’t a deep game, you simply try to shoot the corks off the tops of bottles, but if you miss and shoot the bottles it makes a satisfying explosion. That’s enough to get me excited this morning.

Zombie Miner (Mochi) (80 % Retrotastic) – Well made, fun little mining game (shoot to grab treasure from the top of the screen style) with a Zombie(?) theme.

Paint Man (Mochi) (65% Retrotastic) – Better than it looks 8-bit (or even 4-bit) style game.  It’s hard to explain, so watch the tutorial.

Cavity Crusade (Mochi) (88% Retrotastic) – I was getting bored and ready to stop reviewing games, but then this gem came along. Shoot the baddies and save the teeth.

Space Mission (Mochi) (75% Retrotastic) – There are both English and Spanish versions of this little arena / avoider game. Not incredible, but it was fun for a few plays a little unique.

Soviet Conquest (Mochi) (75% Retrotastic) – Hmm, I don’t know about this one, but I would try it out again. You don’t find too many traditional war games on Mochi. if I have time I will come back…

Oil Spill Escape – (Mochi) (82% Retrotastic) – Very well crafted little side-scroller where you avoid the gulf oil spill.

Posted in Flash Games, Reviews | View Comments  

8bitsteve Interviews Steven Levy, Author Of The Classic Computer Industry Book: “Hackers”

Steven Levy is one of my heroes.  He’s genius author who has the rare ability of making technology subject not only palatable, but down-right fascinating.   He has written tons of great books, and written for magazines such as Wired and Newsweek. Steven Levy’s book, Hackers: Heroes Of The Computer Revolution is one of the best books ever written about technology.  It is one the required reading list for 8bitrocket.com

I caught-up with Steven today, and he was kind enough to answer a few questions.

8bitsteve: “Hackers” is one of the classic books about the computer industry.   When you started the project, did you have any idea of the impact it would have when it was finished?

Steven Levy: I did understand when I was working on the book that I was trying to tell an important story.  When the book came out it didn’t take off right away, so I had no idea that it would eventually find such a great and wide audience.

8bitsteve: Have you kept-up with any of the principal characters in “Hackers” over the past three decades? (Steve Russell, Ken Williams, John Harris, etc.)?

Steven Levy: Of the ones you mention, I have had sporadic contact with Ken.   The ones I see more often are Lee Felsenstein and, some of the Apple people. And Bill Gates, of course, who is part of my regular journalism beat.   I run into a few of the MIT people, too.  It was good to check in on Greenblatt and Stallman for the update.

8bitsteve: Do you think the book  “Hackers” can have the same impact today they might have had just 15 years ago?  Are there three “Hackers” you would write about now, given the chance?

Steven Levy: This is a time of groundbreaking changes, and there are great stories to tell.  Of course the way to do this would not be to emulate “Hackers” but deal with a narrative of today on its own terms.   As for the people I would write about now, I think a major story of our time is Google, particularly on the nexus of its aspirations, its technical philosophy, and the way its leaders handle the impact of their products on the public.  That’s the book I’m just finishing now.

8bitsteve: What is your perspective on the whole “Apple vs. Adobe vs Google” situation?  Where do you think Microsoft sits in all this?

Steven Levy: Well, Microsoft will do anything it can do mess  up Google.  In general, the competitive triangle of Apple, Google and MS is a juicier tale than “Twilight.”  I talked about this a bit in the Wired cover about the iPad.

8bitsteve: Can you tell us something about what the latest  project you have been working on?

Steven Levy: As above, a substantial book about Google, out early next year.  I was given extraordinary access to its people.   I think it’s the closest thing I’ve written to “Hackers.”

8bitsteve: What did you think about the 2010 “25th Anniversary” Edition Of Hackers?

Steven Levy: I was thrilled to have a new version out from O’Reilly and hope it can find a new generation of readers–as well as re-readers who have lost their original copies.

We’d like to thank Steven for taking time away from writing to answer these questions.  Check out the new version of Hackers  here.

Posted in Atari Nerd, Interviews | View Comments  

Games I’ll Play Again 8/16/2010 – Flash Game Distribution and Mochi Reviews

It would be easy to just go to the Mochi featured game list and hit those as they have been pre-screened for me. No can do, bud. That would leave out the wonderful world of games that don’t get much attention (most deservedly so). Today I will be going through some more of the FGD feed and the Mochi Latest Games list to discover games that I would actually play again (if I had the time to play games).  Each of these is special in its own way (good or bad). If you would like me to take a look at your game, send me and email to info[at]8bitrocket[dot]com.

All games get a score from 0-100 on the Retrotastic scale (a first impression of game’s overall quality biased by my completely biased likes and dislikes). A game doesn’t have to be retro in any way to get on this scale, but it helps because I will play it longer.

Anti Invasion Fighter - (FGD) Arcade blaster (82% Retrotastic) – A fun, well made game.

Blockies Breakout (FGD) – Awesome Breakout/Arknoid game (88% Retrotastic). It doesn’t hurt that I am a HUGE Dave Munsie fan, but that aside this is a wonderfully crafted game.

Royal Envoy – (Mochi) – (No Score). It’s not that games like this are not well crafted and professionally made…it’s that they ARE! This is a demo of a a pay to buy game and it shows. I don’t plan on reviewing too many games like this, but I fully support what they are doing. The production values and scope of this strategy / kingdom style game are well above what an individual indie can produce. That being said, it is a wonderfully made game. I don’t have time to give it the due it needs, but you certainly should. These are the types of games (if purchased by players) that will keep the indie game business going strong.

Deadly Road Battle – (Mochi) – Classic top-down scrolling shooter with 360 shooting action. (80% Retrotsatic). Fun, but not deep. Good for a fun basting time.

Sub-zero condition – (Mochi) – 8-bit looking adventure / zombie shooter. (83% Retrotastic). I can’t honestly give this one a score yet as it looks awesomely fun but I need more time with it.

Miranda Kerr Dress-up (Mochi) (75% Retrotastic) – As dress-up games go, this one is not technically too shabby (clothes stick to the correct spots, etc). Plus, it has a surprisingly accurate depiction of the Victoria Secret cutie to dress-up. Yes,  there probably are some issues with IP here. Would I play it again? Probably not, but it shouldn’t stop you from trying it. Also, I can’t completely ignore a genre like this.

Shoot Down (Mochi) (75% Retrotastic) – An interesting take on breakout / Arknoid. It has some issues but the kernel of a great game is in here. It needs polish to become a big hit.

That’s all the time I have for today, but there are mountains of games to look through. Send me a link to yours so I don’t have to find it in the pile…

Posted in Flash Games, Reviews | Tagged , , | View Comments  

See It Quick: Actual Deleted Scene From Return Of The Jedi: Luke Becomes A Jedi

I know this is totally off topic, but it will probably be removed very soon.   This is an actual deleted scene from Return Of The Jedi that shows Luke’s transformation into a Jedi.  It’s less than 1 minute and better than Episode I-II-III combined.

Note: Try this link if the above no longer works.

Posted in diatribe | Tagged | View Comments  

Games I’ll Play Again #1 – Flash Game Distribution Reviews

Using the last few days of the Flash Game Distribution feed, here are a list of games that I played quickly and were interesting enough for me to want to play again. I have given each a quickie  grade based on my first impression.  Take the grades with a grain of salt. Also, I give every game a “retrotastic” grade even it it is not retro in any way. (TJTWIR).

The Little Bee (80% Retrotastic) – Classic Shooter

Bob the Thief (81% Retrotastic) – Puzzle/Arcade

Street Speed (88% retrotastic) – Awesome 2D Racser

Boozoids (85% Retrotasic) – Platformer

Escape The Noddy (No grade, just check it out, it will give you nightmares).

Space Invader Classic (70% Retrotastic) – Retro Shooter

Callow Drift (83% Retrotastic) – Jaunty platformer

The Super Zero (80% Retrotastic) – Side scrolling blaster

Jump ++ (78% Retrotastic) – It would get a higher score if I could figure it out. Nicely made arcade game though.

Pixel Shooters (83% Retrotastic) – Arcade game (not a version of the game with a similar name from our book).

Save The Birds (80% Retrotastic) – Cute physics based puzzler

Potboy’s Adventure (81% Retrotastic) – Surprising fun if crudely drawn platformer.

Bieber Bottle Bash (No score) – Simple game, but boy does this little dude deserve whatever he gets.

Posted in Flash Games, Reviews | View Comments  

Going Solo (from the corporate beast) #5 – A Valuable Lesson Learned

I knew it was going to happen some time, but I didn’t think it would be so soon. I don’t want to give out too many details, but I just want to say that getting taken by a  client is no fun. I guess everyone must go through this, and I am sure most clients have been taken by developers at one time or another so I don’t claim this to be a unique problem that only happened to me. In fact, because I always put 100% into every job no matter the size (or now that I understand it better, the likelihood I will be paid), I might have done this to myself.

I got this project through a 3rd party and I went for it because I was not working on any other paying gigs at the time. There was no set deadline, no contract, and no formal documentation of any kind…you see, I’m THAT kind of idiot. I simply trusted that once I completed the described work I would be paid the quoted amount. Also, since it was through a 3rd party and the first party was also a third party, I am sure I if I ever do get paid it will be from Kevin Bacon. Anyway, to make a long story short, I was told last Thursday at 4:00 PM that I needed a decent alpha by the next morning. I pulled an “all-nighter” to deliver it, and then was told to get a beta by Monday morning. I was planning to work over the weekend when a relative was put in intensive care and I needed to take my mom there to visit. So, we flew to our destination and I camped out in the hospital, working on the project for two days straight. I was able to deliver a really nice beta by Sunday night, but then I found out I had been had. It turns out that the client decided to go with someone else before he even saw my finished product.

Anyway, the third party, who got me the gig, is really embarrassed and we are going to bill for the work I completed, but honestly, I know it was simply a lost 40+ hours that I will not get back. I will chalk it up to experience and maybe finish the project as an engine for sale.

So, I learned that it is really easy to get excited about a project, no matter the size, and also learned to never start something without a contract in place. I know, I know, that last one makes me look really really stupid, and I have now been educated on the full consequences of this stupidity.

(update: This is Steve.  I embedded an “oldie–but-a-goodie” youtube video about vendors vs. clients… sorry for the the trouble Jeff)

(Update2: Nice find, that was brilliant, Steve. Simply brilliant)

Posted in Flash Game Development | Tagged , , | View Comments  

8bitrocket.com Interviewed!

Steve Savage over at Fan To Pro took the time to interview us last week about all things 8bitrocket.  If you are intersted in that sort of thing, go over here and take a look:

http://www.fantopro.com/blog/2010/08/an-interview-with-steve-and-jeff-of-8-bit-rocket.html#more

Also, we have added  the Fan-To-Pro RSS feed to our Industry Feeds page…

Posted in 8bitrocket History | Tagged | View Comments  

HTML5 Canvas Resize On The Fly, In An HTML Page

I’ve been playing around a lot with the HTML5 Canvas lately, and I discovered some very interesting things that about the size of Canvas as displayed on an HTML page.

The best way to show these is to show a demo of what I’m talking about first.  Here is a link to the demo:
http://www.8bitrocket.com/wp-content/uploads/2010/08/CanvasResizeBlog.html

Note: This demo works best in Google ChromeThe Range controls listed below will not appear in Firefox…yet.

What you will notice on the demo page is a 500×300 Canvas with the text “Text Wrangler” applied to to it.  Below the Canavs are 4 HTML form controls:

  1. A Text box to change the text
  2. An HTML5 Range Control to change the size of the text
  3. An HTML5 Range Control to change the width of the Canvas
  4. An HTML5 Range Control to change the height of the Canvas

Changing the size of the text is a no-brainer.  I added that to show that the Canvas itself could be manipulated with a form control on an HTML page.   However, the range controls for the width and the height of the Canvas are what I’m concentrating on here.  If you play with them you will notice that the width and size of the Canvas can be changed on a page dynamically.  I coded the text to stay in the middle of the Canvas, no matter what the size, with this code:

1
2
3
4
var metrics = context.measureText(message)
var textWidth = metrics.width;
var xPosition = (theCanvas.width/2 - textWidth/2);
var yPosition = (theCanvas.height/2);

The measureText() method is native to the Canvas context object.  It only has one property, width.    Since text has a default baseline of “middle”, you can center text vertically by placing it at the middle pixel on the screen.  However, text default to a horizontal alignment of “start”, which means you need to either set it to “center” or subtract 1/2 the width of the text to get a proper horizontal center at the midpoint of the Canvas.

Now, if you play with the range controls to chnage the width and the height of the Canvas, notice how it interplays with rest of the page.   The form elements move up and down the page as the the height is changed.   The text on the Canvas stays the same scale and centered, no matter how big or small the Canvas might be.   This appears to be the opposite of what is specified in the Canvas API:

The intrinsic dimensions of the canvas interface element equal the size of the coordinate space, with the numbers interpreted in CSS pixels. During rendering, the image must be scaled to fit this layout size.

The image does not appear to scale when the Canvas is resized.  In fact, it simply allows for more of the Canvas to be viewed.  I saw the same effect in Safari.  It is possible that I’m reading the API spec wrong too.  No matter, the cool part is that the Canvas can completely redisplay itself, on the fly, with updated width and height without reloading the page.

It appears to me that the HTML5 Canvas is built to allow for the same types of free-flowing liquid user interfaces that can be created in Flash using “noscale” and JavaScript, but with the added feature of being able to resize the entire Canvas on the fly in real-time.  I’ve NEVER seen that done with Flash.  I’m not saying you can’t do it, I’ve just never seen it done before.

Here are some code highlights:

The HTML5 form controls below the Canvas interact with the Canvas by listening for events only.  When any control is changed, event handlers are used to capture that change and then render it on the Canvas.

1
2
3
4
5
6
7
8
9
10
11
12
var context = theCanvas.getContext('2d');
var formElement = document.getElementById("textBox");
formElement.addEventListener('change', textBoxChanged, false);

formElement = document.getElementById("textSize");
formElement.addEventListener('change', textSizeChanged, false);

formElement = document.getElementById("canvasWidth")
formElement.addEventListener('change', canvasWidthChanged, false);

formElement = document.getElementById("canvasHeight")
formElement.addEventListener('change', canvasHeightChanged, false);

Here are the Event Handlers functions.  Notice that to change the width and height of the Canvas, we simply update the the width and height attributes of the Canvas object. (Note: theCanvas is the id of the the Canvas object in the HTML page)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function textBoxChanged(e) {
var target = e.target;
message = target.value;
drawScreen();
}

function textSizeChanged(e) {
var target = e.target;
fontSize = target.value;
drawScreen();
}

function canvasWidthChanged(e) {
var target = e.target;
theCanvas.width = target.value;
drawScreen();
}

function canvasHeightChanged(e) {
var target = e.target;
theCanvas.height = target.value;
drawScreen();
}

Here is the code in the drawScreen() function that renders the text based on the current width and height of the Canvas.

1
2
3
4
5
6
7
8
9
var metrics = context.measureText(message)
var textWidth = metrics.width;
var xPosition = (theCanvas.width/2 - textWidth/2);
var yPosition = (theCanvas.height/2);
var tempColor = "#000000";
context.fillStyle = tempColor;
context.fillText ( message, xPosition ,yPosition);
context.strokeStyle = "#FF0000";
context.strokeText ( message, xPosition,yPosition);

Check out the demo again:

http://www.8bitrocket.com/wp-content/uploads/2010/08/CanvasResizeBlog.html

Posted in Tutorial-HTML5 Canvas, Tutorials | Tagged , , | View Comments  

Space Gate Enemy Path Tutorial by Barnaby Byrne

Barnaby Byrne (Aka Badger Manufacture) has just released is latest retro inspired Flash Masterpiece, Space Gate, at Odo Games. I was some impressed with the games and the intricate enemy patterns within that I asked if he would be kind enough to explain to our readers exactly how it is implemented. Luckily he agreed.  We are very happy to now present to you his tutorial:

Here is what Barnaby has to say:

It’s exciting that after such a break from game development in the engineering industry designing buildings, I am now really enjoying it again.  I’ve often been asked how I do the enemy paths for my shooters, and like Jeff I am a firm believer in sharing rather than hoarding knowledge.

This game of mine SpaceGate has been a long time coming.  I started coding Space Invaders clones way back in the 80s on the ZX Spectrum here in the UK.  The game is really just a natural progression of that game with a few elements of Blaster Mines, Galaga, Xenon II and bullet hell thrown into the mix.  I have studied every skill on this site and in the 8bitrocket book The Essential Guide to Flash Games and hopefully my game will demonstrate what is possible if you follow the tutorials with some useful insight into my shoot em up spawning technique too.  Where relevant I have provided links to tutorials on this site where I first learnt the blitting and memory optimisation techniques.

Supplied files in this tutorial

Main.as

The main class has functionality for loading the maps, moving the camera, and caching, updating and rendering all the graphics.

Ship.as

Provides an update function that moves the ships along targets[] using a targetlength[] to specify each targets length in frames.

Tile.as

Simple object with no update function, only stores each tiles xpos, ypos and ID.

Tilemap.txt

Exported from mappy, all the tiles positions and tile id (only 2 used) in the example level.

Spritemap.txt

Each enemy waves start position.

ship1.png

Enemy ship graphics

tiles.png

Tile strip

Overview

Enemies are drawn onto a sprite layer in an editor such as mappy.  When it comes time to export the map I tend to use csv maps instead of xml, but I appreciate the divide on this.  Multi-layer maps are still possible with csv although attaching meta data to objects is not so well catered for.  The resulting csv file can vary from editor to editor, and if you are using maps with a different format just rewrite the loadLevel() function.

The tilemaps, xml, and bitmapdata tutorial on this site for loading maps is also a good resourcet if you are unsure about this process.  If you want to match the format in this tutorial you may want to get an exporter script for Mappy or even learn lua, it’s scripting language.  At the very least I’d suggest reading around the subject of csv vs xml.  Each enemy in the csv file represents an wave of enemies in the game, so when designing the level I only had to place about 15 or 20 enemy ships per level, each one spawns 8,10 or 12 enemy ships by the engine.  You are encouraged to open the supplied text files (Tilemap.txt and Spritemap.txt) if only to appreciate how little data is actually in the sprite map but also to appreciate how the map is loaded and functions with the rest of the code.

Preparing the main class

First of all the main canvas (backbufferdata) is initialised and added as a child to the stage.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//----------------------------------------------------------------------------------------
// Screen
//----------------------------------------------------------------------------------------
private var screenWidth:int=320;
private var screenHeight:int=300;
private var backBuffer:Bitmap;
private var backBufferData:BitmapData=new BitmapData(320,300, false , 0x111563);
private var blitRect:Rectangle=new Rectangle(0,0,0,0);
private var point:Point = new Point(0, 0);
private var backgroundRect:Rectangle;
private var backgroundBD:BitmapData = new BitmapData(320,300, false , 0x111563);
private var backgroundPoint:Point = new Point(0, 0);
private var gameTimer:Timer;
...
backBuffer = new Bitmap(backBufferData);
backBuffer.y=0;
addChild(backBuffer);

Before loading the map there are a few steps to take in order to embed the png graphics and store them frame by frame in arrays.

1
2
3
cacheBlitObject(ship1BmpData,ship1BmpDataArray,24);
cacheTileStrip(stripBmpData,stripBmpDataArray,16);
cacheTrigVelocities();

cacheBlitObject uses a single frame of bitmap data to rotate itself 90 times and populate it’s second parameter a bitmap data array.  That is more than sufficient to achieve smooth snake like movement.

generateRotation provides this functionality by using a standard matrix rotate also explained elsewhere in more detail on this site.

cacheTileStrip uses a whole strip to populate it’s second parameter, also a bitmap data array.

cacheTrigValues does all the cos and sin calculations in advance and stores them so we don’t ever have to do real time trig for the snake movement.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public function cacheBlitObject(bitmapDataToCache:BitmapData,arrayToCacheTo:Array,widthOfEnemy:int):void
{
// caches 90 frames at 4 degrees each

var sourceX:int=0;
var sourceY:int=0;
var sourceRect:Rectangle=new Rectangle(sourceX,sourceY,widthOfEnemy,widthOfEnemy);
var destPoint:Point=new Point(0,0);

for(i=0; i&lt;91; i++)
{
arrayToCacheTo[i] = new BitmapData(widthOfEnemy, widthOfEnemy, true, 0x00000000);
sourceX=0;
sourceY=0;
sourceRect=new Rectangle(sourceX,sourceY,widthOfEnemy,widthOfEnemy);
arrayToCacheTo[i].copyPixels(bitmapDataToCache,sourceRect,destPoint, null, null, true);
arrayToCacheTo[i]=generateRotation(arrayToCacheTo[i],i*4);
}
}

//----------------------------------------------------------------------------------------
// generateRotation
//----------------------------------------------------------------------------------------

private function generateRotation(DATA:BitmapData,ROTATETO:int):BitmapData
{
var degrees:int=ROTATETO;
var angle_in_radians:Number = Math.PI * 2 * (ROTATETO / 360);
var rotationMatrix:Matrix = new Matrix();
var width:int=DATA.width/2;
rotationMatrix.translate(-width,-width);
rotationMatrix.rotate(angle_in_radians);
rotationMatrix.translate(width,width);
var matrixImage:BitmapData = new BitmapData(width*2,width*2, true, 0x00000000);
matrixImage.draw(DATA, rotationMatrix);
return matrixImage;
}

//----------------------------------------------------------------------------------------
// cacheTileStrip
//
// Paramaters:
// bitmapDataToCache - the bitmap data to cache
// arrayToCacheTo - the array to store the bitmap data cache
//----------------------------------------------------------------------------------------

public function cacheTileStrip(bitmapDataToCache:BitmapData,arrayToCacheTo:Array,widthOfTile:int):void
{
var sourceX:int=0;
var sourceY:int=0;
var sourceRect:Rectangle=new Rectangle(sourceX,sourceY,widthOfTile,widthOfTile);
var destPoint:Point=new Point(0,0);

for(i=0; i&lt;(bitmapDataToCache.width/widthOfTile); i++)
{
arrayToCacheTo[i] = new BitmapData(widthOfTile, widthOfTile, true, 0x00000000);
sourceX=i*widthOfTile;
sourceY=0;
sourceRect=new Rectangle(sourceX,sourceY,widthOfTile,widthOfTile);
arrayToCacheTo[i].copyPixels(bitmapDataToCache,sourceRect,destPoint, null, null, true);
}
}

//----------------------------------------------------------------------------------------
// cacheTrigVelocities
//
// caches velocities from 0 to 360 degrees
// to avoid any real time cos or sin calculations
//----------------------------------------------------------------------------------------

public function cacheTrigVelocities():void
{
for (var ctr:int=0;ctr&lt;361;ctr++)
{
rotnCacheX.push(Math.cos(2.0*Math.PI*(ctr-90)/360.0));
rotnCacheY.push(Math.sin(2.0*Math.PI*(ctr-90)/360.0));
}
}

A timer system is employed to establish recurrence of the main loop.  The tile strip is cached frame by frame, whereas the single frame ship.png is cached then rotated 90 times (once for each 4 degrees).  You can find out more about caching bitmapdata and it’s benefits elsewhere on this site.  It has become second nature for me now that I have studied and practised Jeff’s tutorials to such an extent.

Next, I created 2 object pools.  The idea is to avoid using the ‘new’ operator in real time, and also to restrict the number ever created.  Since I know I’ll never have more than 400 tiles and never have more than 100 enemies I can confidently restrict these object pools in advance.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
prepareSpritePool();
prepareTilePool();

//----------------------------------------------------------------------------------------
// prepareSpritePool
//
// set up some blit objects
// the game will cycle through this capped pool
//----------------------------------------------------------------------------------------

public function prepareSpritePool():void
{
for(i=0;i&lt;maxNoSpritesOnScreen;i++)
{
spritePool[i]=new Ship(rotnCacheX,rotnCacheY);
}
}

//----------------------------------------------------------------------------------------
// prepareTilePool
//
// set up some tile objects
// the game will cycle through this capped pool
//----------------------------------------------------------------------------------------

public function prepareTilePool():void
{
for(i=0;i&lt;maxNoTilesOnScreen;i++)
{
tilePool[i]=new Tile();
}
}

Now that we have cached all our graphics and trigonometric calculations, it’s time to load the map.

We load the map layer by layer, tiles first:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//----------------------------------------------------------------------------------------
// loadLevel
//
// loads the map
//----------------------------------------------------------------------------------------

public function loadLevel():void
{
noMapTiles=-1;

for(i=0;i&lt;10000;i++)
{
tilesMapPositionsX[i]=-100;
tilesMapPositionsY[i]=0;
tilesMapIDs[i]=0;
}

var cols:Array=new Array();
var rows:Array = new Array();

var widthInTiles:int;
var heightInTiles:int;

rows=TilesMapData.split("\n");

heightInTiles = rows.length;

for(r = 0; r &lt; heightInTiles; r++)
{
cols = rows[r].split(",");
widthInTiles = cols.length;

for(c = 0; c &lt; widthInTiles; c++)
{
if((uint(cols[c]))&gt;0) // found a tile
{
noMapTiles++;
tilesMapPositionsX[noMapTiles]=(c*16);
tilesMapPositionsY[noMapTiles]=r*16;
tilesMapIDs[noMapTiles]=int(cols[c]);
}
}
}
currentTileMapItem=noMapTiles;
...

Then the sprites:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
...
noMapSprites=-1;

for(i=0;i&lt;10000;i++)
{
spritesMapPositionsX[i]=-100;
spritesMapPositionsY[i]=0;
spritesMapIDs[i]=0;
}

cols=new Array();
rows = new Array();

rows=SpriteMapData.split("\n");

heightInTiles = rows.length;

for(r = 0; r &lt; heightInTiles; r++)
{
cols = rows[r].split(",");
widthInTiles = cols.length;

for(c = 0; c &lt; widthInTiles; c++)            {                                       if((int(cols[c]))&gt;0) // found a sprite
{
noMapSprites++;
spritesMapPositionsX[noMapSprites]=(c*16);
spritesMapPositionsY[noMapSprites]=r*16;
spritesMapIDs[noMapSprites]=int(cols[c]);
}
}
}
currentSpriteMapItem=noMapSprites;
}

Now that we have all the tiles and sprite locations and ids stored in arrays we can examine how the main loop accesses them.  The currentTileMapItem and currentSpriteMapItem are now equal to the total number of tiles and sprites in the map.  We can lookup the current tile and sprite at the top of this stack and see if it’s y coordinate is less than 2 pixels higher than the top of the screen (the camerYpos).  If so we spawn a wave of enemies, keeping track of the wave number so that we can do different spawning code for each.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//----------------------------------------------------------------------------------------
//
//
// UPDATE
//
// calls updateBlitObjects and renderBlitObjects
//
//
//----------------------------------------------------------------------------------------

public function update(e:Event):void
{
updateBlitObjects();
renderBlitObjects();
}

//----------------------------------------------------------------------------------------
// updateBlitObjects
//
// calls each blit objects update function
//----------------------------------------------------------------------------------------

public function updateBlitObjects():void
{
cameraYpos--;
checkMap();
for each(var ship:Ship in spritesOnScreen)
{
ship.update();
ship.update();
}
checkForSplice();
}

//----------------------------------------------------------------------------------------
// checkMap
//
// checks to see if the cameray is approaching a new tile or enemy
//----------------------------------------------------------------------------------------

public function checkMap():void
{
while(tilesMapPositionsY[currentTileMapItem]&gt;=cameraYpos-16 &amp;&amp; currentTileMapItem&gt;1)
{
tilePool[currentTilePoolItem].xpos=tilesMapPositionsX[currentTileMapItem];
tilePool[currentTilePoolItem].ypos=tilesMapPositionsY[currentTileMapItem];
tilePool[currentTilePoolItem].id=tilesMapIDs[currentTileMapItem];

tilesOnScreen.push(tilePool[currentTilePoolItem]);

currentTilePoolItem++;
if(currentTilePoolItem&gt;maxNoTilesOnScreen-1)currentTilePoolItem=0;
if(currentTileMapItem&gt;1)currentTileMapItem--;
}

while(spritesMapPositionsY[currentSpriteMapItem]&gt;=cameraYpos-16 &amp;&amp; currentSpriteMapItem&gt;1)
{
spritePool[currentSpritePoolItem].xpos=spritesMapPositionsX[currentSpriteMapItem];
spritePool[currentSpritePoolItem].ypos=spritesMapPositionsY[currentSpriteMapItem];
spritePool[currentSpritePoolItem].frameIndex=0;

currentWaveNumber++;

for(i=0;i&lt;10;i++)
{
if(currentWaveNumber==1)
{
var spacing:int=35;
spritePool[currentSpritePoolItem].targets=[3,15,10,15,10,3];
spritePool[currentSpritePoolItem].targetlengths=[50+(i*spacing),150,150,50,50,500];
spritePool[currentSpritePoolItem].xpos=160-12;
spritePool[currentSpritePoolItem].ypos=(i*spacing)*-1;
}
else if(currentWaveNumber==2)
{
if(i&lt;5)
{
spacing=25;
spritePool[currentSpritePoolItem].targets=[1,14,11,14,11,1];
spritePool[currentSpritePoolItem].targetlengths=[50+(i*spacing),150,150,50,50,500];
spritePool[currentSpritePoolItem].xpos=340+(i*spacing);
spritePool[currentSpritePoolItem].ypos=150;
}
else
{
spacing=25;
spritePool[currentSpritePoolItem].targets=[2,10,15,10,15,2];
spritePool[currentSpritePoolItem].targetlengths=[50+(i*spacing),150,150,50,50,500];
spritePool[currentSpritePoolItem].xpos=-40-(i*spacing);
spritePool[currentSpritePoolItem].ypos=50;
}
}
if(currentWaveNumber==3)
{
spacing=35;
spritePool[currentSpritePoolItem].targets=[3,11,13,11,13,3];
spritePool[currentSpritePoolItem].targetlengths=[50+(i*spacing),150,150,50,50,500];
spritePool[currentSpritePoolItem].xpos=160-12;
spritePool[currentSpritePoolItem].ypos=(i*spacing)*-1;
}

spritePool[currentSpritePoolItem].currentstep=0;
spritePool[currentSpritePoolItem].distancethisstep=0;

spritesOnScreen.push(spritePool[currentSpritePoolItem]);

currentSpritePoolItem++;
if(currentSpritePoolItem&gt;maxNoSpritesOnScreen-1)currentSpritePoolItem=0;
}
if(currentSpriteMapItem&gt;1)currentSpriteMapItem--;
}
}

//----------------------------------------------------------------------------------------
// checkForSplice
//
// see if there are any enemies to remove from the on screen array
//----------------------------------------------------------------------------------------

public function checkForSplice():void
{
i=-1;
for each(var ship:Ship in spritesOnScreen)
{
i++;
if(ship.currentstep&gt;0 &amp;&amp; (ship.ypos&gt;300 || ship.ypos&lt;-30 || ship.xpos&lt;0 || ship.xpos&gt;320))
{
spritesOnScreen.splice(i,1);
}
}
i=-1;
for each(var tile:Tile in tilesOnScreen)
{
i++;
if(tile.ypos&gt;cameraYpos+300)
{
tilesOnScreen.splice(i,1);
}
}

}

Let’s isolate one of these spawns as an example and see how the map position is translated into a screen position.

Check map is called once every frame tick, although if you wanted to optimise you could change this so it’s called only once every two frame ticks.  I actually use duality in my main loops although in this example I have not.  In SpaceGate, I use a task number so if task==1 do collisions if task==2 do checkMap.  Duality is another topic though but who knows I may get the chance to blog on that sometime too.

checkMap is called by our update function and if it finds a ship in the map close enough to the camera it spawns a new wave.  The wave is assigned targets and targetlengths.  Each of the batch is given a fresh counter (distancethisstep) and has it’s currentstep defaulted to 0.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public function checkMap():void
{
while(spritesMapPositionsY[currentSpriteMapItem]&gt;=cameraYpos-16 &amp;&amp; currentSpriteMapItem&gt;1)
{
spritePool[currentSpritePoolItem].xpos=spritesMapPositionsX[currentSpriteMapItem];
spritePool[currentSpritePoolItem].ypos=spritesMapPositionsY[currentSpriteMapItem];
spritePool[currentSpritePoolItem].frameIndex=0;

currentWaveNumber++;

for(i=0;i&lt;10;i++)
{
if(currentWaveNumber==1)
{
var spacing:int=35;
spritePool[currentSpritePoolItem].targets=[3,15,10,15,10,3];
spritePool[currentSpritePoolItem].targetlengths=[50+(i*spacing),150,150,50,50,500];
spritePool[currentSpritePoolItem].xpos=160-12;
spritePool[currentSpritePoolItem].ypos=(i*spacing)*-1;
}
spritePool[currentSpritePoolItem].currentstep=0;
spritePool[currentSpritePoolItem].distancethisstep=0;

spritesOnScreen.push(spritePool[currentSpritePoolItem]);

currentSpritePoolItem++;
if(currentSpritePoolItem&gt;maxNoSpritesOnScreen-1)currentSpritePoolItem=0;
}
..
if(currentSpriteMapItem&gt;1)currentSpriteMapItem--;

spritePool

is the array of type Ship that we created in advance. The spawn method

above assigns however many of these is needed

to the spriteOnScreen array.

The Ship pool members are updated twice per frame tick, so let’s have a look at the Ship class, the only other class of any

considerable length in the example.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Ship
{
// GLOBAL VARIABLES

public var xvelocity:Number;
public var yvelocity:Number;
public var xpos:Number;
public var ypos:Number;
public var width:int;
public var height:int;
public var health:int;
public var frameIndex:int;
public var currentstep:int=0;
public var distancethisstep:int=0;
public var targets:Array;
public var rotFrameIndex:int=0;
public var mvctr:int=0;
public var targetlengths:Array;
public var radians:Number;
public var radius:Number=0.05;
private var rotnCacheX:Vector.&lt;Number&gt;=new Vector.&lt;Number&gt;();
private var rotnCacheY:Vector.&lt;Number&gt;=new Vector.&lt;Number&gt;();
public var angle:int=0;
public var rotateframes:int=360;
public var qucircle:int=rotateframes/4;
public var hacircle:int=rotateframes/2;
public var tqcircle:int=qucircle+hacircle;
public var fucircle:int=rotateframes;
public var step:int=0;
public var rotinc:int=1;
public var temp:int=1;
public var targetArray:Vector.&lt;Array&gt;=new Vector.&lt;Array&gt;();

Most of the work is done in the update function.

As we know, in the example wave, our objects have these characteristics:

1
2
3
4
5
6
7
8
9
10
11
for(i=0;i&lt;10;i++)
{
if(currentWaveNumber==1)
{
var spacing:int=35;
spritePool[currentSpritePoolItem].targets=[3,15,10,15,10,3];
spritePool[currentSpritePoolItem].targetlengths=[50+(i*spacing),150,150,50,50,500];
}
}
spritePool[currentSpritePoolItem].currentstep=0;
spritePool[currentSpritePoolItem].distancethisstep=0;

Now we update them like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
public function update():void
{
mvctr+=1;
distancethisstep++;
if(distancethisstep&gt;=targetlengths[currentstep])
{

step=currentstep++;
mvctr=distancethisstep=0;
}
temp=((distancethisstep/targetlengths[currentstep])*qucircle);
if(targets[currentstep]==1)
{
xpos-=1;
angle=270;
}
else if(targets[currentstep]==2)
{
xpos+=1;
angle=90;
}
else if(targets[currentstep]==3)
{
ypos+=1;
angle=180;
}
else if(targets[currentstep]==4)
{
ypos-=1;
angle=270;
}
else if(targets[currentstep]==10)// q1 clockwise
{
temp+=hacircle;
xpos+=rotnCacheY[temp]; ypos+=rotnCacheX[temp]*-1;
}
else if(targets[currentstep]==11) // q2 clockwise
{
temp+=tqcircle;
xpos+=rotnCacheY[temp]; ypos+=rotnCacheX[temp]*-1;
}
else if(targets[currentstep]==12) // q3 clockwise
{
temp+=0;
xpos+=rotnCacheY[temp]; ypos+=rotnCacheX[temp]*-1;
}
else if(targets[currentstep]==13)   // q4 clockwise
{
temp+=qucircle;
xpos+=rotnCacheY[temp]; ypos+=rotnCacheX[temp]*-1;
}
else if(targets[currentstep]==14) // q1 anticlockwise
{
temp+=0;
xpos+=rotnCacheY[temp]; ypos+=rotnCacheX[temp];
}
else if(targets[currentstep]==15)// q2 anticlockwise
{
temp+=qucircle; //*qucircle for cached values;
xpos+=rotnCacheY[temp]; ypos+=rotnCacheX[temp];
}
else if(targets[currentstep]==16) // q3 anticlockwise
{
temp+=hacircle;
xpos+=rotnCacheY[temp]; ypos+=rotnCacheX[temp];
}
else if(targets[currentstep]==17)// q4 anticlockwise
{
temp+=tqcircle;
xpos+=rotnCacheY[temp]; ypos+=rotnCacheX[temp];
}

if ((targets[currentstep]&gt;=10) &amp;&amp; (targets[currentstep]&lt;=13)) {angle=180+temp+qucircle;}              if(angle&gt;(fucircle-1)){angle-=(fucircle);}

if((targets[currentstep]&gt;=14) &amp;&amp; (targets[currentstep]&lt;=17)) {angle=180+qucircle-temp;}

if(angle&lt;0){angle+=(fucircle);}              if(angle&gt;(fucircle-1)){angle-=(fucircle-1);}

while(angle&lt;0)angle+=360;        while(angle&gt;360)angle-=360;
}

The system makes use of the paradigm of quadrants, so that each 90° turn is actually a single target.

I used the codes 1-4 for straight lines, 10-13 for clockwise targets and 14-17 for anti-clockwise.

Each ship’s current distance along it’s current target is increased by 1 when

update is called. Ship’s also keep track of which target they are on.

The distance that the ship has travelled along it’s current target is

divided by the target length, and then multiplied by 90°, then used as

the objects current angle.

This angle is also used to move the ship using the rotation cache’s we sent to the ship when instatiating:

1
2
3
4
5
public function Ship(ROTATIONSX:Vector.,ROTATIONSY:Vector.)
{
rotnCacheX=ROTATIONSX;
rotnCacheY=ROTATIONSY;
...

The system makes it fairly easy to create interesting looking enemy waves

and allows for rapid development. You can try changing the target[]

array and targetlengths[] for completely different patterns.
I hope that you find it useful and any questions will gladly be answered,

as long as you show me the awesome games you make with it.

BadgerManufactureInc

I want to thank Barnaby for taking the time to explain how this works. I have been planning to create a system like this and his advice and generous view on code sharing will certainly help me and others that want to create blit patterns such as these. Now, go play Space Gate. You will not be disappointed.

Posted in Tutorial-Flash, Tutorials | Tagged , | View Comments  

Featured New Flash Retro Game: Space Gate

We are incredibly proud to present our first new featured retro Flash game on the re-vamped 8bitrocket.com: Space Gate by Barnaby Byrne (AKA Badger Manufacture). As the first ever sponsored game by the wonderful new portal, Odo Games (run by Richard Hoddinott), Space Gate is one of my favorite Flash shooters of all time, and quite possibly my favorite retro-shooter bar none. Inspired by the 8 and 16 bit classic “fly over  the gi-fooking-gagantic space ship and blast the hell out everything you see” genre, it typifies the type of games we hold dear at 8bitrocket (this genre is also the partial origin of our site’s name).

This “mega-blast”er also has elements of Galaga, Xenon 2, Centipede and countless other retro thumb-killers. The best part… “AUTO-FREAKING-FIRE”. You just concentrate on dodging the beautifully rendered ordinance while taking in the sparkling particle effects and leave the firing up to your space cruiser’s weapon systems.

The action, sonics, and over all “zar jaz” in this contest are so outstanding that I contacted Barnaby to ask him some questions about the origin of his masterpiece. It turns out that he is a huge 8bitrocket fan and he used some of our ideas and code to help create the foundation of his game. One thing that impressed me the most was the enemy pattern implementation especially given that this game is created on a fully blit canvas. Barnaby agreed to share his AS3 class  and thoery with our readers and explain how it works.

Here is the tutorial he prepared.

Space Gate is the first ever sponsored game from the new portal, Odo Games, Odo Games  is the type of portal we love to support here at 8bitrocket. It was created by a game developer for his own games and it blossomed into a full blown portal to feature the best games he could find. I emailed Richard to ask him about the his portal and his first sponsored game. Here is what he had to say:

“I started Odo Games earlier this year as a place to showcase a few of my own games.  I gradually added more games to the site and it now has around 150 carefully selected games written by some of the best developers on the scene.  None of that is any good though if nobody know sthe site exists, so in order to get the word out I needed to find a great game to sponsor and get the Odo Games logo seen by the world.  I spent a lot of time searching for a great launch title, and as it was my first ever sponsorship, I was quite apprehensive about picking the right game.”
Then Space Gate came along.  Just occassionaly you come across a game where you just know that it was made for the sheer joy of it, and all of the passion the developer has for playing and developing games shines through in one beautifully crafted piece of work.  Space Gate is a prime example of this, and I knew instantly that this was the game I wanted to represent my site.
“After chatting with Badger (or Barnaby, whichever he prefers to be called) I knew we were on the same wavelength and we began working together to get the game ready for launch.  I’m honoured to have the Odo Games branding displayed in such a superb game, and I can’t wait to see what Badger comes up with for his next project.  Anyone who wants to play Space Gate and other great games like it should pop along to www.odgames.com and see what we have to offer.

Contact: ric[at]odogames[dot]com if you feel you have a game worthy of his sponsorship.”

Play Space Gate Now! I guarantee you will be as impressed as I am.

Posted in Featured Games | View Comments  

8bitrocket Industry Feed Page

One of the new features we implemented when we moved to WordPress was a GameTab-like page that lists the latest posts across a number of our favorite Flash and other game blog sites. We call this the Industry Feed page and you can access it here (along with the top-nav button).

We are missing a couple obvious favorites (as we could not find RSS feeds for all of the sites we frequent).

If you have any suggestions for sites to add, please drop us a comment. We can’t add every site, but we will add the ones we feel offer the best material for our readers.

Posted in 8bitrocket History | View Comments  

Killa Appz By Dave Berzack : I Laughed, I Cried

We need more stuff like this.   The thing made me laugh out loud about about 20 times.  Bravo.  I hope Dave gets some consulting work out of it.

Props to Adobe

My mind on my mark-up and my mark-up on my mind” – classic.

Posted in diatribe | View Comments  

Intel/TheGameCreators Game Development Contest (Dark Basic)

August 4, 2010toOctober 3, 2010

Intel & The Game Creators (Dark Basic) has a new Netbook Game development contest.  Games must be written in Dark Basic.  First prize is $5000.

The competition opens on 4th August 2010 9AM GMT.

The closing date for entries is 3rd October 2010 at 12PM GMT.

You can check out the details here:

http://www.thegamecreators.com/intelcompo/index.php

Posted in Contest Tracker | Tagged | View Comments