The game is a tie-in to the live-action movie starring Ryan Reynolds. It was released during the peak of the Java mobile gaming era, designed to run on "feature phones" (non-smartphones) like Nokia S40, Sony Ericsson, and early Samsung devices.
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import java.util.Random;
import java.util.Vector;
public class GreenLanternGame extends MIDlet implements CommandListener {
private Display display;
private GameCanvas canvas;
private Command exitCommand;
public GreenLanternGame()
display = Display.getDisplay(this);
canvas = new GameScreen();
exitCommand = new Command("Exit", Command.EXIT, 0);
canvas.addCommand(exitCommand);
canvas.setCommandListener(this);
protected void startApp() throws MIDletStateChangeException
display.setCurrent(canvas);
protected void pauseApp() {}
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {}
public void commandAction(Command c, Displayable d)
if (c == exitCommand)
try
destroyApp(false);
catch (MIDletStateChangeException e)
e.printStackTrace();
notifyDestroyed();
}
class GameScreen extends GameCanvas implements Runnable
private boolean running;
private int width, height;
private int playerX, playerY;
private int score;
private int lives;
private Vector enemies;
private Vector projectiles;
private Random random;
private Graphics g;
// Sprite size
private final int SIZE = 20;
public GameScreen()
super(true);
width = getWidth();
height = getHeight();
// Init game state
playerX = width / 2;
playerY = height - 40;
score = 0;
lives = 3;
enemies = new Vector();
projectiles = new Vector();
random = new Random();
running = true;
Thread t = new Thread(this);
t.start();
public void run()
while (running)
update();
draw();
try
Thread.sleep(30); // ~33 FPS
catch (InterruptedException ie)
// Handle exception
private void update()
// 1. Input Handling
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0 && playerX > 0)
playerX -= 5;
if ((keyState & RIGHT_PRESSED) != 0 && playerX < width - SIZE)
playerX += 5;
if ((keyState & UP_PRESSED) != 0 && playerY > 0)
playerY -= 5;
if ((keyState & DOWN_PRESSED) != 0 && playerY < height - SIZE)
playerY += 5;
// Auto-fire logic (Green Energy Constructs)
if (random.nextInt(15) == 0)
projectiles.addElement(new Projectile(playerX + SIZE/2, playerY));
// 2. Spawn Enemies (Yellow Impurity)
if (random.nextInt(20) == 0)
int ex = random.nextInt(width - SIZE);
enemies.addElement(new Enemy(ex, -SIZE));
// 3. Move Projectiles
for (int i = 0; i < projectiles.size(); i++)
Projectile p = (Projectile) projectiles.elementAt(i);
p.move();
if (p.y < 0) projectiles.removeElementAt(i);
// 4. Move Enemies & Check Collision
for (int i = 0; i < enemies.size(); i++)
Enemy e = (Enemy) enemies.elementAt(i);
e.move();
// Remove if off screen
if (e.y > height)
enemies.removeElementAt(i);
continue;
// Check collision with Player
if (checkCollision(playerX, playerY, SIZE, SIZE, e.x, e.y, SIZE, SIZE))
enemies.removeElementAt(i);
lives--;
if (lives <= 0)
running = false; // Game Over
// Check collision with Projectiles
for (int j = 0; j < projectiles.size(); j++)
Projectile p = (Projectile) projectiles.elementAt(j);
if (checkCollision(p.x, p.y, 4, 8, e.x, e.y, SIZE, SIZE))
enemies.removeElementAt(i);
projectiles.removeElementAt(j);
score += 10;
break;
private boolean checkCollision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
return (x1 < x2 + w2 && x1 + w1 > x2 && y1 < y2 + h2 && y1 + h1 > y2);
private void draw()
g = getGraphics();
// Clear Background (Deep Space)
g.setColor(0, 0, 20);
g.fillRect(0, 0, width, height);
// Draw HUD
g.setColor(255, 255, 255);
g.drawString("Score: " + score, 5, 5, Graphics.TOP
// --- Helper Classes ---
class Projectile
int x, y;
public Projectile(int x, int y)
this.x = x;
this.y = y;
public void move()
y -= 8; // Speed of light!
class Enemy
int x, y;
public Enemy(int x, int y)
this.x = x;
this.y = y;
public void move()
y += 3; // Descending speed
| Feature | Original 176x220 | UPD 320x240 Version | |---------|------------------|----------------------| | Resolution | Stretched on QVGA | Pixel-perfect 320x240 | | Flight mode controls | Delayed input | Optimized for smooth scrolling | | Save bug | Loses progress at level 4 | Fixed – saves after every level | | Emulator support | Crashes on J2ME Loader | Fully compatible | | Font readability | Tiny, blurry | Clear, sharp |
In the golden era of mobile gaming—before the iPhone and Android dominated the landscape—Java (J2ME) games were the kings of the subway commute and high school study halls. Among the most sought-after titles was the Green Lantern Java game, a side-scrolling action-adventure based on the 2011 Ryan Reynolds film. However, for years, fans have struggled to find a working copy optimized for the classic 320x240 resolution (QVGA).
If you’ve been searching for “Green Lantern Java game 320x240 UPD,” you’ve likely encountered broken links, incorrect screen resolutions, or games that crash on launch. This updated guide provides you with everything you need: verified files, installation instructions, emulator setups, and troubleshooting fixes.
The file you are looking for is the **Gameloft adaptation of Green Lantern (
screen resolution (landscape) often found on classic Nokia, Samsung, and BlackBerry devices. Green Lantern: The Official Mobile Game (320x240) Updated Green Lantern: The Official Mobile Game
brings the high-flying action of the DC Universe to your Java-enabled handset. Take control of Hal Jordan, the first human to join the Green Lantern Corps, and use the power of the Ring to defend the universe against the Manhunters. Game Description
Harness the most powerful weapon in the galaxy! In this side-scrolling action-adventure, you must master the Ring's ability to create hard-light constructs. Fight through multiple levels spanning from Earth to the planet Oa. As you progress, you’ll unlock new constructs like giant swords, hammers, and gatling guns to defeat waves of interstellar enemies. Key Features Construct Combat:
Use the Ring to create various weapons and shields mid-battle. Epic Boss Fights:
Face off against massive Manhunters and intergalactic threats. Upgraded Graphics:
(Updated) version features optimized sprites and smoother animations specifically for the 320x240 resolution. Flight Sequences:
Switch between platforming combat and high-speed flight levels. Technical Details Green Lantern Java ME (J2ME) Resolution: 320x240 (Landscape) File Format: .JAR / .JAD Action / Arcade How to Install Download the Green Lantern 320x240.jar file to your computer or directly to your phone. green lantern java game 320x240 upd
If downloaded to a PC, transfer the file to your device via USB or Bluetooth.
The Green Lantern: Rise of the Manhunters – Reliving the Java Classics at 320x240
Before the era of high-definition mobile gaming and ray-traced graphics, the mobile landscape was dominated by Java (J2ME). In 2011, alongside the Ryan Reynolds film, "Green Lantern: Rise of the Manhunters" made its way to feature phones. For those still rocking legacy devices or using emulators, finding the 320x240 UPD (updated) version is like finding a piece of mobile history.
Here is a deep dive into why this specific version remains a fan favorite and how it holds up today. A Hero in Your Pocket: Gameplay Mechanics
The 320x240 version of Green Lantern was specifically optimized for landscape-oriented screens, common on devices like the Nokia E-series or BlackBerry handsets. Unlike the portrait versions, the "Updated" (UPD) build often included smoother sprite animations and better-mapped controls. The Power Ring System
The core hook of the game is the power ring. Unlike generic beat-'em-ups, the Java game attempted to capture Hal Jordan’s creativity:
Constructs: You could summon giant hammers, swords, and gatling guns.
Energy Management: Players had to balance their willpower meter, ensuring they didn't run out of juice mid-boss fight.
Upgrades: The "UPD" versions often featured a more refined progression system, allowing you to unlock more complex constructs as you cleared stages. Visuals and Performance (320x240 Optimization)
In the world of J2ME, resolution was everything. The 320x240 aspect ratio allowed for a wider field of view, which was crucial for a side-scroller.
Sprites: Hal Jordan’s green glow was surprisingly vibrant for a 16-bit-style game. The Manhunters (the primary antagonists) were easily distinguishable, making combat feel fair and readable. The game is a tie-in to the live-action
Backgrounds: From the streets of Coast City to the high-tech corridors of Oa, the backgrounds utilized the landscape width to create a sense of scale that the 240x320 versions lacked.
Stability: The "UPD" tag usually signifies a build that fixed the "Out of Memory" errors common on older Symbian and S40 devices. Why the "UPD" Version Matters Today
If you are searching for the Green Lantern Java game 320x240 upd, you are likely looking for the most stable, bug-free iteration. This version typically includes:
Compatibility with modern J2ME emulators (like J2ME Loader on Android).
Full sound support (MIDI tracks that actually play without crashing the app).
Correct aspect ratio scaling, preventing the "stretched" look on modern screens. How to Play It Now
Since the official mobile storefronts for Java games are long gone, the "Green Lantern" experience lives on through preservation sites. To get it running:
Download a J2ME Emulator: If you’re on Android, "J2ME Loader" is the gold standard.
Configure Resolution: Set your screen settings to 320x240 to ensure the UI doesn't break.
Enjoy the Nostalgia: Dive back into a time when gaming was about simple mechanics and the sheer joy of being a galactic guardian.
The Green Lantern Java game is a testament to what developers could achieve with limited hardware. It’s a fast-paced, colorful brawler that captures the essence of the DC Universe. If you have a few megabytes to spare and a craving for retro action, this 320x240 updated version is the definitive way to play. import javax
If updating from 176x220 → 320x240:
| Component | Old (176x220) | New (320x240) | Method | |-----------|---------------|---------------|---------| | Background | 176px wide | 320px | Scale horizontally + add tile columns | | Player size | 16x16 | 24x24 | Redraw sprites (higher detail) | | Hitboxes | 12x12 | 20x20 | Manual adjust | | Bullet speed | 4 px/frame | 6 px/frame | Increase to match wider screen | | Enemy count | 4 on screen | 6–7 | Optimize object pooling | | Construct menu | Text only | 16x16 icon + text | Add small icons | | Framerate | 18 FPS | 18 FPS (target same) | Keep render load low |
If you successfully downloaded and played the Green Lantern Java game 320x240 UPD, share your setup in the comments below. Which phone or emulator gave you the best experience? And if you encounter a new bug, report it to the J2ME preservation forums – the next “UPD” might come from you.
Article last updated: January 2025
Keywords: green lantern java game 320x240 upd, green lantern java game jar 320x240, download green lantern 240x320 java, green lantern gameloft upd patch, j2me green lantern full version qvga
This article is for educational and preservation purposes. Download and play only if you own a legitimate copy of the original game.
You can save this as GreenLanternGame.java and compile it with the J2ME Wireless Toolkit.
// GreenLanternGame.java // A story-driven action game for 320x240 screens // Controls: Left/Right = Move, Fire = Shoot, Up = Fly Up (in flight segments)import javax.microedition.lcdui.; import javax.microedition.midlet.; import java.util.Random;
public class GreenLanternGame extends MIDlet implements CommandListener, Runnable { private Display display; private GameCanvas canvas; private Command exitCommand; private Command backCommand; private boolean running; private Thread gameThread; private int gameState; // 0=menu, 1=level1, 2=level2, 3=level3, 4=cutscene, 5=gameOver, 6=victory private int cutsceneStep; private long cutsceneTimer;
// Game objects private int playerX, playerY; private int[] enemiesX, enemiesY; private boolean[] enemiesAlive; private int[] bulletsX, bulletsY; private boolean[] bulletsActive; private int score; private int lives; private int energy; // Green Lantern ring energy private int levelProgress; private Random rand; private String storyText; // Flight segment variables private boolean flightMode; private int obstacleX; private int scrollY; public GreenLanternGame() display = Display.getDisplay(this); canvas = new GameCanvas(); exitCommand = new Command("Exit", Command.EXIT, 1); backCommand = new Command("Back", Command.BACK, 1); canvas.addCommand(exitCommand); canvas.setCommandListener(this); rand = new Random(); gameState = 0; // menu enemiesX = new int[10]; enemiesY = new int[10]; enemiesAlive = new boolean[10]; bulletsX = new int[10]; bulletsY = new int[10]; bulletsActive = new boolean[10]; score = 0; lives = 3; energy = 100; flightMode = false; public void startApp() display.setCurrent(canvas); running = true; gameThread = new Thread(this); gameThread.start(); public void pauseApp() {} public void destroyApp(boolean unconditional) running = false; public void commandAction(Command c, Displayable d) if (c == exitCommand) destroyApp(true); notifyDestroyed(); else if (c == backCommand && gameState == 5) gameState = 0; // back to menu resetGame(); private void resetGame() score = 0; lives = 3; energy = 100; levelProgress = 0; flightMode = false; gameState = 0; private void startLevel(int level) playerX = 140; playerY = 200; flightMode = false; levelProgress = 0; energy = 100; // Initialize enemies for (int i = 0; i < 10; i++) enemiesX[i] = 20 + rand.nextInt(280); enemiesY[i] = -50 - (i * 50); enemiesAlive[i] = true; // Clear bullets for (int i = 0; i < 10; i++) bulletsActive[i] = false; if (level == 2) storyText = "Sinestro's fear constructs attack!"; flightMode = true; scrollY = 0; obstacleX = rand.nextInt(280); else if (level == 3) storyText = "Parallax rises. Willpower is your only weapon."; public void run() { while (running) { try updateGame(); canvas.repaint(); Thread.sleep(50); // ~20 FPS catch (Exception e) {} } } private void updateGame() int keyState = canvas.getKeyStates(); if (gameState == 0) // Menu state - story-driven menu if (keyState != 0) gameState = 4; // start cutscene cutsceneStep = 0; cutsceneTimer = System.currentTimeMillis(); storyText = "In brightest day, in blackest night..."; return; if (gameState == 4) // Cutscene if (System.currentTimeMillis() - cutsceneTimer > 3000) cutsceneStep++; cutsceneTimer = System.currentTimeMillis(); switch(cutsceneStep) case 1: storyText = "No evil shall escape my sight!"; break; case 2: storyText = "Let those who worship evil's might..."; break; case 3: storyText = "Beware my power... GREEN LANTERN'S LIGHT!"; break; case 4: gameState = 1; startLevel(1); break; return; if (gameState == 5) // Game Over return; if (gameState == 6) // Victory if (keyState != 0) gameState = 0; resetGame(); return; // --- GAMEPLAY UPDATE --- if (flightMode) // Flight segment (Level 2) scrollY += 8; if (scrollY > 240) scrollY = 0; obstacleX = rand.nextInt(280); // Move player in flight mode if ((keyState & LEFT_PRESSED) != 0) playerX -= 6; if ((keyState & RIGHT_PRESSED) != 0) playerX += 6; if ((keyState & UP_PRESSED) != 0) playerY -= 5; if ((keyState & DOWN_PRESSED) != 0) playerY += 5; // Boundaries if (playerX < 10) playerX = 10; if (playerX > 310) playerX = 310; if (playerY < 20) playerY = 20; if (playerY > 230) playerY = 230; // Collision with obstacle if (Math.abs(playerX - obstacleX) < 20 && scrollY > 200) energy -= 20; if (energy <= 0) lives--; if (lives <= 0) gameState = 5; else startLevel(2); obstacleX = rand.nextInt(280); scrollY = 0; // Level progress levelProgress++; if (levelProgress > 200) gameState = 3; // go to level 3 startLevel(3); flightMode = false; else // Ground combat levels (1 and 3) // Player movement if ((keyState & LEFT_PRESSED) != 0) playerX -= 5; if ((keyState & RIGHT_PRESSED) != 0) playerX += 5; if (playerX < 10) playerX = 10; if (playerX > 310) playerX = 310; // Shooting if ((keyState & FIRE_PRESSED) != 0) for (int i = 0; i < 10; i++) if (!bulletsActive[i]) bulletsActive[i] = true; bulletsX[i] = playerX; bulletsY[i] = playerY - 10; break; // Update bullets for (int i = 0; i < 10; i++) if (bulletsActive[i]) bulletsY[i] -= 8; if (bulletsY[i] < 0) bulletsActive[i] = false; // Check collision for (int j = 0; j < 10; j++) if (enemiesAlive[j] && Math.abs(bulletsX[i] - enemiesX[j]) < 15 && Math.abs(bulletsY[i] - enemiesY[j]) < 15) enemiesAlive[j] = false; bulletsActive[i] = false; score += 10; levelProgress++; // Update enemies for (int i = 0; i < 10; i++) if (enemiesAlive[i]) enemiesY[i] += 3; if (enemiesY[i] > 240) enemiesY[i] = -20; enemiesX[i] = 20 + rand.nextInt(280); // Enemy hits player if (Math.abs(playerX - enemiesX[i]) < 20 && Math.abs(playerY - enemiesY[i]) < 20) energy -= 15; enemiesAlive[i] = false; if (energy <= 0) lives--; if (lives <= 0) gameState = 5; else startLevel(gameState); enemiesY[i] = -20; // Level progression if (levelProgress >= 20) if (gameState == 1) gameState = 2; startLevel(2); else if (gameState == 3) gameState = 6; // Victory // Regenerate energy slowly if (energy < 100 && !flightMode) energy++; class GameCanvas extends Canvas private Font titleFont = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_LARGE); private Font textFont = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL); public void paint(Graphics g) // Black background g.setColor(0, 0, 0); g.fillRect(0, 0, getWidth(), getHeight()); if (gameState == 0) // Menu Screen g.setColor(0, 255, 0); g.setFont(titleFont); g.drawString("GREEN LANTERN", 160, 40, Graphics.HCENTER); g.setColor(100, 255, 100); g.setFont(textFont); g.drawString("Press any key", 160, 120, Graphics.HCENTER); g.drawString("Defeat Sinestro", 160, 150, Graphics.HCENTER); g.drawString("Protect Oa", 160, 180, Graphics.HCENTER); // Green Lantern symbol g.setColor(0, 180, 0); g.fillArc(130, 80, 60, 60, 0, 360); g.setColor(0, 0, 0); g.fillArc(140, 90, 40, 40, 0, 360); else if (gameState == 4) // Cutscene g.setColor(0, 255, 0); g.setFont(titleFont); g.drawString("STORY", 160, 30, Graphics.HCENTER); g.setFont(textFont); g.drawString(storyText, 160, 100, Graphics.HCENTER); g.drawString("You are Hal Jordan", 160, 140, Graphics.HCENTER); g.drawString("Last hope of the Corps", 160, 170, Graphics.HCENTER); else if (gameState == 5) // Game Over g.setColor(255, 0, 0); g.setFont(titleFont); g.drawString("GAME OVER", 160, 80, Graphics.HCENTER); g.setColor(200, 200, 200); g.setFont(textFont); g.drawString("Score: " + score, 160, 140, Graphics.HCENTER); g.drawString("Press Back to Menu", 160, 200, Graphics.HCENTER); else if (gameState == 6) // Victory g.setColor(0, 255, 0); g.setFont(titleFont); g.drawString("VICTORY!", 160, 60, Graphics.HCENTER); g.setFont(textFont); g.drawString("You have mastered", 160, 110, Graphics.HCENTER); g.drawString("the willpower!", 160, 135, Graphics.HCENTER); g.drawString("Oa is saved.", 160, 160, Graphics.HCENTER); g.drawString("Press any key", 160, 210, Graphics.HCENTER); else // Gameplay Screen // Draw UI g.setColor(0, 255, 0); g.drawString("Score: " + score, 5, 5, Graphics.LEFT); g.drawString("Lives: " + lives, 5, 20, Graphics.LEFT); g.drawString("Energy: " + energy, 5, 35, Graphics.LEFT); // Energy bar g.setColor(50, 50, 50); g.fillRect(80, 35, 100, 8); g.setColor(0, 255, 0); g.fillRect(80, 35, energy, 8); // Draw story hint if (gameState == 1) g.drawString("Earth Invasion", 200, 5, Graphics.LEFT); else if (gameState == 2) g.drawString("Flight: Avoid fear!", 200, 5, Graphics.LEFT); else if (gameState == 3) g.drawString("Parallax Boss", 200, 5, Graphics.LEFT); if (flightMode) // Flight mode graphics g.setColor(0, 100, 0); g.fillRect(0, 0, 320, 240); // Starfield for (int i = 0; i < 50; i++) g.setColor(255, 255, 255); g.drawLine(i * 7, (scrollY + i * 10) % 240, i * 7, (scrollY + i * 10) % 240); // Obstacle (fear construct) g.setColor(100, 0, 100); g.fillRect(obstacleX, scrollY, 25, 25); g.setColor(200, 0, 200); g.drawString("FEAR", obstacleX + 2, scrollY + 8, Graphics.LEFT); // Player - Green Lantern g.setColor(0, 255, 0); g.fillArc(playerX - 10, playerY - 10, 20, 20, 0, 360); g.setColor(0, 180, 0); g.fillArc(playerX - 6, playerY - 6, 12, 12, 0, 360); else // Ground combat // Draw ground g.setColor(30, 30, 30); g.fillRect(0, 210, 320, 30); // Draw enemies (Sinestro Corps) for (int i = 0; i < 10; i++) if (enemiesAlive[i]) g.setColor(100, 0, 255); g.fillRect(enemiesX[i] - 8, enemiesY[i] - 8, 16, 16); g.setColor(200, 100, 255); g.drawString("S", enemiesX[i] - 3, enemiesY[i] - 5, Graphics.LEFT); // Draw bullets for (int i = 0; i < 10; i++) if (bulletsActive[i]) g.setColor(0, 255, 0); g.fillRect(bulletsX[i] - 2, bulletsY[i] - 4, 4, 8); // Draw player - Green Lantern g.setColor(0, 255, 0); g.fillArc(playerX - 12, playerY - 12, 24, 24, 0, 360); g.setColor(0, 200, 0); g.fillArc(playerX - 6, playerY - 6, 12, 12, 0, 360); // Ring glow effect g.setColor(0, 255, 0, true); for (int i = 0; i < 3; i++) g.drawArc(playerX - 15 - i, playerY - 15 - i, 30 + i * 2, 30 + i * 2, 0, 360); // Story text during gameplay if (storyText != null && gameState < 4) g.setColor(0, 0, 0); g.fillRect(10, 200, 300, 30); g.setColor(0, 255, 0); g.drawString(storyText, 160, 210, Graphics.HCENTER);
}
If you still own a classic feature phone, follow these steps:
Known device compatibility: