This version of is deprecated.
If you are not redirected to the new web site in 3 seconds, please click on the following link


J2ME & Gaming by Jason Lam
  This book is about programming with J2ME on wireless devices with focus on developing games. It is assumed you have some knowledge and programming experience with J2ME and J2SE. The book does not go into detail on topics like how to make high level GUI menu but does demonstrate what a game menu might look like. Nor will it explain in detail how to use the Record Management System (RMS), but will go over topics that use RMS such as high score and game settings. As well a knowledge and experience with threading will be an asset before proceeding with game development. The book will go over in detail the new game classes that are now included in the MIDP 2.0.

The book also serves as quick reference for Java programmers who are interested in mobile game development. As well, to provide good introduction for experience game developers who developed games in other languages/platforms and are now interested in using J2ME to develop games.

As of October 4, 2006 the download count is 70600 times according to statistics

  Screen Shots & Demo

Hosted at including source code (Click Here)
Chapters Comment
Chapter 1 - Overview Complete
Chapter 2 - Mobile Game Contraints Complete
Chapter 3 - Before Code Complete
Chapter 4 - MIDP2 Game Classes Complete
Chapter 5 - Math Contraints Incomplete
Chapter 6 - Eliminator: Introduction Ongoing to be released when books complete
Chapter 7 - Eliminator: Splash Screen Complete
Chapter 8 - Eliminator: Game Menu Complete
Chapter 9 - Eliminator: Exception Handling Complete
Chapter 10 - Eliminator: Settings & High Score Complete
Chapter 11 - Eliminator: Terrain (Scrolling ...) Complete
Chapter 12 - Eliminator: Player and Bullets Complete
Chapter 13 - Eliminator: Change of Scenery Complete
Chapter 14 - Eliminator: Enemeis & Game Items In Progress
Chapter 15 - Eliminator: Boss Not Started
Chapter 16 - Eliminator: Game Extras Not Started
Chapter 17 - Improving Complete
Chapter 18 - Adding Time Tiral to Your Game Complete
Chapter 19 - Customer Interface In Progress
....... more chapters to come  
Appendix A - Running the Books Examples Incomplete
Appendix B - J2ME and Ant In Progress
Appendix C - OTA Incomplete
Released under Open Source License GPL - Download Here  
Book FAQ
  Q: How can you say thank you!
  A: Just spread the word about my book and other tutorials.
  Q: Why is it Free?

A; Originally I wanted to find a publisher, but due to unknown time schedule I've decided to release it for free.

  Q: Are you not concerned someone else will make money off your hard work?
  A: Well with reference to my first book, J2ME & Gaming, other then the hard work of putting the book together there really isn't anything in the book that is special. Anyone with game experience knows there are dozens if not more then hundred different factors that contribute to making a successful game aside from the technology and code itself. Such things as demographics, gameplay, game graphics, community, persistant data, interface design, user experience, game narrative, character development.... etc The objective of this book is the process of learning how to implement a game not how to make a successful game. There is a difference and one should not confuse the two.
  Q: Why Can't I Print it?
  A: To help save the trees I've disabled the print function on the PDFs
  Q: Can We Publish Your Book(s)?
  A: Yes, please contact me if you are interested in publishing it. However, please understand the entire book is currently released under the GPL. Any publication will need to adhere to the terms of use as stated in the GPL..

Sample Code by Jason Lam
Book Written by Jason Lam
Graphics done by Leeman Cheng and Carlo Casimiro

BlackBerry Hacks by Dave Mabe


I'm proud to announce I had the pleasant opportunity to work with Dave Mabe and contributed a few Hacks to the BlackBerry Hacks book published by O'Reilly.

Now available!

Author URL:

  Author Announcement:
  Book URL:
  Description from the O'Reilly site:

The BlackBerry has become an invaluable tool for those of us who need to stay connected and in the loop. But most people take advantage of only a few features that this marvelous communications device offers. What if you could do much more with your BlackBerry than just web surfing and email?

BlackBerry Hacks will enhance your mobile computing with great tips and tricks. You'll learn that the BlackBerry is capable of things you never thought possible, and you'll learn how to make it an even better email and web workhorse:

  • Get the most out of the built-in applications
  • Take control of email with filters, searches, and more
  • Rev up your mobile gaming--whether you're an arcade addict or poker pro
  • Browse the web, chat over IM, and keep up with news and weblogs
  • Work with office documents, spell check your messages, and send faxes
  • Become more secure, lock down your BlackBerry and stash secure information somewhere safe
  • Manage and monitor the BlackBerry Enterprise Server (BES) and Mobile Data System (MDS)
  • Create web sites that look great on a BlackBerry
  • Develop and deploy BlackBerry applications

Whether you need to schedule a meeting from a trade show floor, confirm your child's next play date at the park, or just find the show times and secure movie tickets while at dinner, this book helps you use the remarkable BlackBerry to stay in touch and in-the-know--no matter where you are or where you go.


| Home | Tutorials | Tips / Hints | Books | Links |
| Resume | Portfolio | Services | Contact |

The contents of this webpage are copyright © 2003 - 2006
Jason Lam All Rights Reserved

start_element($parser, $name, $attributes); } function rss_end_element($parser, $name) { global $rss; $rss->end_element($parser, $name); } function rss_character_data($parser, $data) { global $rss; $rss->character_data($parser, $data); } class rss_parser { // constructor. setup parser options and handlers. function rss_parser() { $this->error = ''; $this->file = ''; $this->channel = array(); $this->data = ''; $this->stack = array(); $this->num_items = 0; $this->xml_parser = xml_parser_create(); xml_set_element_handler($this->xml_parser, "rss_start_element", "rss_end_element"); xml_set_character_data_handler($this->xml_parser, "rss_character_data"); } function character_data($parser, $data) { if (empty($this->data)) $this->data = trim($data); // concatenate non-parsed data... else $this->data .= ' '.trim($data); // and get rid of white space. } function start_element($parser, $name, $attrs) { switch($name) { case 'RSS': break; case 'CHANNEL': break; case 'IMAGE': array_push($this->stack, $name); break; case 'ITEM': array_push($this->stack, $name); array_push($this->stack, $this->num_items); // push item index. $this->item[$this->num_items] = array(); $this->num_items++; break; case 'TEXTINPUT': array_push($this->stack, $name); break; default: array_push($this->stack, $name); break; } } function end_element($parser, $name) { switch ($name) { case 'RSS': break; case 'CHANNEL': break; case 'IMAGE': array_pop($this->stack); break; case 'ITEM': array_pop($this->stack); array_pop($this->stack); break; case 'TEXTINPUT': array_pop($this->stack); break; default: // child element. $element = (implode("']['",$this->stack)); eval("\$this->channel['$element']=\$this->data;"); // this does all the hard work. array_pop($this->stack); $this->data = ''; break; } } function parse() { if (!($fp = @fopen($this->file, "r"))) { $this->error = "Could not open RSS source \"$this->file\"."; return false; } while ($data = fread($fp, 4096)) { if (!xml_parse($this->xml_parser, $data, feof($fp))) { $this->error = sprintf("XML error: %s at line %d.", xml_error_string(xml_get_error_code($this->xml_parser)), xml_get_current_line_number($this->xml_parser)); return false; } } xml_parser_free($this->xml_parser); return true; } function getRSSChannel() { return $this->channel; } } // class rss_parser. //$rss = new rss_parser(); //$rss->file = ''; //$rss->parse() or die($rss->error); //if ($rss->error) print $rss->error; //print_r($rss->channel); //$rssResult = $rss->getRSSChannel(); //var_dump($rssResult); //echo $rssResult["TITLE"]; //echo $rssResult["ITEM"][3]["TITLE"]; ?>