0 ratings0% found this document useful (0 votes) 1K views17 pagesJava Games Space Invaders
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content,
claim it here.
Available Formats
Download as PDF or read online on Scribd
sinro1s slavagames Space Invaders
Home Contents Previous Ney
Space Invaders
In this part of the Java 2D games tutorial we will create a
©
Phong van tiéng Anh: Ligu ban cé bj
Toai ngay “véng gitr xe”
Test ngay v6i bai trdc nghiém ng&n
[) Aude Sree tgtce
simple Space Invaders game clone.
Space Invaders is an arcade video game designed by Tomohiro Nishikado. It was first released in
1978. The player controls a cannon, He is about to save the Earth from invasion of evil space invade
Development
In our Java clone we have 24 invaders. These aliens heavily shell the ground. When the player shoot
a missile, he can shoot another one only wher
shoots with the Alt key. Aliens launch randomly their bombs. Each alien shoots a bomb only after th
it hits an alien or the top of the Board. The player
previous one hits the bottom.
Spacelnvaders java
package spaceinvaders;
import Javax.swing.JFrame;
public class Spacelnvaders extends JFrame implenents Commons (
public SpaceInvaders()
{
add(new Board());
setTitle("Space Invaders");
setDefaultCloseoperation(EXIT_ON_CLOSE);
nip detcode comftera'sjavagamestralspaceinvaders/ wrsinro1s slavagames Space Invaders
setSize(BOARD_WIDTH, BOARD_HEIGTH);
setLocationRelativeTo(nul1)
setVisible(true) ;
setResizable(false) ;
public static void main(String[] args) ¢
new SpaceInvaders();
‘This is the main class.
Commons java
package spaceinvaders;
public interface Commons {
public static final int BOARD_WIDTH = 358;
public static final int BOARD_HEIGTH = 350;
public static final int GROUND = 290;
public static final int BONB_HEIGHT = 5:
public static final int ALIEN HEIGHT = 12;
public static final int ALIEN WIDTH = 125
public static final int BORDER_RIGHT = 30;
public static final int BORDER_LEFT = 5:
public static final int GO_DOWN = 15;
public static final int NUNBER_OF_ALIENS TO_DESTROY = 24;
public static final int CHANCE = 5;
public static final int DELAY = 17;
public static final int PLAYER WIDTH = 15;
public static final int PLAYER HEIGHT = 10;
The connons. java file has some common constants. They are self-explanatory.
Alien java
package spaceinvaders;
import Javax. swing. InageIcon;
public class Alien extends Sprite {
private Bonb bomb;
private final String shot /spacepix/alien.png" ;
public Alien(int x, int y) (
this.x = x5
this.y = y5
nip detcode comftera'sjavagamestralspaceinvaders/
a7sinro1s slavagames Space Invaders
bomb = new Bomb(x, y);
ImageIcon ii = new ImageIcon(this.getClass().getResource(shot) );
setInage(ii.getimage());
y
public void act(int direction) {
this.x += direction;
y
public Bonb getonb() {
return bomb;
}
public class Bomb extends Sprite {
private final String bomb
private boolean destroyed;
/spacepix/bonb png" ;
public Bonb(int x, int y) {
setDestroyed(true) ;
this.x = 3x
this.y = yj
Inagelcon ii = new InageIcon(this.getClass().getResource(bonb));
setInage(ii.getImage());
public void setDestroyed(boolean destroyed) {
this.destroyed = destroyed;
}
public boolean isDestroyed() {
return destroyed;
sprite. Each alien has an inner Bonb cl
public void act(int direction) {
this.x += direction;
The act () method is called from the Board class. It is used to position an alien in horizontal direction
public Bonb getBonb() {
return bonb;
3
The getéonb() method is called, when the alien is about to drop a bomb.
tip dzetcodecomtera'sjavagamestralspaceinvaders/ ansinro1s slavagames Space Invaders
Player java
package spaceinvaders;
import java.awt.event.Keyévent;
import Javax. swing. InageTcon;
public class Player extends Sprite implements Conmons{
private final int START_Y
private final int START_X
280;
2703
private final String player = "../spacepix/player. png";
private int width;
public Player() {
ImageTcon ii = new ImageTcon(this.getClass().getResource(player)) 5
width = ii.getTmage().getWidth(nul1) ;
setImage(ii.getImage());
setx(START_X)5
sety(START_Y)5
}
public void act() {
x += dx;
if (x <= 2)
x= 25
if (x
BOARD_WIDTH - 2*width)
BOARD_WIDTH - 2*width;
public void keyPressed(KeyEvent e) {
int key = e.getkeyCode();
if (key
KeyEvent.VK_LEFT)
KeyEvent.VK_RIGHT)
public void keyReleased(KeyEvent e) {
int key = e.getkeyCode();
if (key == KeyEvent.VK_LEFT)
nip detcode comftera'sjavagamestralspaceinvaders/
airsinro1s slavagames Space Invaders
t
dx = 0;
if (key == KeyEvent.Vk_RIGHT)
{
This is the Player sprite. We control the cannon with the cursor keys.
private final int START_Y
private final int START_X
280;
278;
These are the initial coordinates of the player sprite.
if (key
{
KeyEvent..VK_LEFT)
If we press the left cursor key, the dx variable is set to -2. Next time the act() method is called, the
player moves to the left.
if (key KeyEvent..VK_LEFT)
t
}
keyEvent.VK_RIGHT)
If we release the left or the right cursor, the dx variable is set to zero. The player sprite stops moving,
Shot java
package spaceinvaders;
import Javax. swing. InageTcon;
public class Shot extends Sprite {
private String shot = "../spacepix/shot.png";
private final int H_SPACE = 6;
nip detcode comftera'sjavagamestralspaceinvaders/ si7sinro1s slavagames Space Invaders
private final int V_SPACE
public Shot() (
}
public Shot(int x, int y)
ImageTcon ii = new ImageIcon(this.getClass().getResource(shot));
setInage(ii.getimage());
setx(x + H_SPACE) ;
setV(y - V_SPACE);
This is the shot sprite. The shot is triggered with the ALT key. The #_space and the v_space constants
are used to position the missile appropriately.
Sprite. java
package spaceinvaders;
import Java.awt. Inages
public class Sprite {
private boolean visible;
private Inage image;
protected int x;
protected int y;
protected boolean dyings
protected int dx;
public Sprite() {
visible = trues
public void die() {
visible = false;
public boolean isVisible() {
return visible;
protected void setVisible(boolean visible) {
this.visible = visible;
public void setimage(Inage image) {
this.image = image;
}
nip detcode comftera'sjavagamestralspaceinvaders/ ansinro1s
sJavagames Space Invaders
public Image getImage() {
return image;
public void setx(int x) (
this.x = x5
public void sety(int y) (
this.y = ys
public int getv() {
return y5
public int getx() {
return x3
public void setbying(boolean dying) {
this.dying = dying;
public boolean isbying() {
return this.dyings
Other sprites inherit from it
Board.java
package spaceinvaders;
import
import
import
import
import
import
import
import
import
import
import
import
import
public
Java.awt Color}
Java.awt .Dimension;
Java.awt.Font
Java.awt.FontMetrics5
Java.awt Graphics}
Java.awt Toolkits
Java.awt .event .KeyAdapters
Java.awt .event.KeyEvent
Java.util ArrayList;
Java.util. Iterator;
Java.util.Randon;
Javax. swing. ImageIcon;
Javax. swing. JPanel
ome common functionality.
class Board extends 2Panel implements Runnable, Commons {
nip detcode comftera'sjavagamestralspaceinvaders/
m7sinro1s
lava games Space Invaders
private Dimension dj
private ArrayList aliens;
private Player player;
private Shot shot;
private int alienx = 150;
private int alienY = 5;
private int direction
private int deaths = 0;
private boolean ingame = true;
private final String expl //spacepix/explosion.png";
private final String alienpix = "../spacepix/alien. png";
private String message = "Game Over";
private Thread animator;
public Board()
{
addkeyListener(new Tadapter());
setFocusable(true);
4 = new Dimension(BOARD_WIOTH, BOARD_HETGTH);
setBackground(Color.black);
gamernit();
setDoubleBuffered(true) ;
public void addNotify() {
super.addNotify();
ganernit();
>
public void ganeInit() {
aliens = new ArrayList();
Imagelcon ii = new InageTcon(this. getClass().getResource(alienpix))
for (int 1-0; i < 45 itt) {
for (int j-0; 3 < 65 J++) {
Alien alien = new Alien(alienx + 18*j, alieny + 181);
alien. setImage(ii.getInage());
aliens.add(alien) ;
}
player = new Player();
shot = new Shot();
if (animator == null || !ingame)
animator = new Thread(this);
animator. start();
nip detcode comftera'sjavagamestralspaceinvaders/ anysinro1s slavagames Space Invaders
x
public void drawAliens(Graphics g)
{
Iterator it = aliens. iterator();
while (it.hasNext())
Alien alien = (Alien) it.next();
if (alien.isVisible()) {
g.drawImage(alien.getImage(), alien.getX(), alien.get¥(), this);
?
if (alien.isbying())
alien.die();
?
}
}
public void drawPlayer(Graphics g) {
if (player.isvisible()) {
g-drawinage(player.getImage(), player.getx(), player.getY(), this);
if (player isbying()) {
player.die();
ingame = false;
public void drawShot (Graphics g) {
if (shot isvisible())
g.dranInage(shot.getInage(), shot.getx(), shot.getY(), this);
}
public void drawBonbing(Graphics g) {
Iterator i3 = aliens. iterator();
while (43.hasNext()) {
Alien a = (Alien) i3.next();
Alien.Bonb b = a.getBomb();
if (Ib.isDestroyed()) {
g-drawInage(b.getInage(), b.getX(), b-getv(), this);
y
+
public void paint(Graphics g)
{
nip detcode comftera'sjavagamestralspaceinvaders/ a7sinro1s
supel
g.se
efi
Bese
if (
8.
drs
drs
des
des
Tool
eedi
public
{
sJavagames Space Invaders
r.paint(g);
*tColor (Color .black) ;
L1Rect(@, @, d.width, d.height);
*tColor (Color.green) ;
ingame) {
drawLine(@, GROUND, BOARD_WIDTH, GROUND);
‘awAliens(g)5
‘awPlayer(g);
‘awshot (g)5
‘awBombing(g) 5
kit. getDefaultToolkit().syne();
spose();
void gameover()
Graphics g = this.getGraphics();
e.
e.
e.
8.
-setColor(Color.black);
-fillRect(@, @, BOARD_WIDTH, BOARD_HEIGTH);
setColor(new Color(®, 32, 48));
FillRect(5®, BOARD_WIDTH/2 - 3, BOARD_WIDTH-100, 50);
setColor(Color.white) ;
drawRect(5®, BOARD_WIDTH/2 - 30, BOARD WIDTH-100, 50);
Font small = new Font("Helvetica*, Font.B0LD, 14);
FontMetrics mete
8.
8.
g-drawString(message, (BOARD_WIDTH - metr.stringwidth(nessage) )/2,
public
if (deaths
}
‘this. getFontMetrics(small) ;
setColor(Color.white);
setFont (small) ;
BOARD_WIDTH/2) ;
void animationcycle() {
NUMBER_OF_ALTENS_TO_DESTROY) {
false;
jame won!
ingame
message
J player
player.act()5
JI shot
if (shot.isVisible()) {
nip detcode comftera'sjavagamestralspaceinvaders/
sorsinro1s slavagames Space Invaders
Iterator it = aliens. iterator();
nt shotx = shot.getx();
int shotY = shot.get¥();
while (it-hasNext()) {
Alien alien = (Alien) it.next();
int alienx = alien.getx();
int alienY = alien.getY();
if (alien.isVisible() && shot.isVisible()) {
if (shotX >= (alienX) &&
shotX <= (alienX + ALIEN_WIDTH) &&
shotY >= (alienY) &&
shotY <= (alienV+ALTEN HEIGHT) ) {
ImageIcon ii =
new InageTcon(getClass().getResource(expl));
alien. setImage(ii.getInage());
alien. setbying(true) ;
deaths++;
shot .die();
?
int y = shot.getv();
y 243
if (y < 0)
shot .die();
else shot.set¥(y);
Wf aliens
Iterator iti = aliens. iterator();
while (iti.hasNext()) {
Alien a1 = (Alien) iti.next();
int x = al.getx();
if (x >= BOARD_WIDTH - BORDER_RIGHT && direction
direction = -1;
Iterator i1 = aliens.iterator();
while (i1-hasNext()) {
Alien a2 = (Alien) i1.next();
a2.set¥(a2.get¥() + GO_DOWN) ;
3
if (x <= BORDER LEFT && direction != 1) {
direction = 1;
Iterator i2 = aliens.iterator();
while (i2.hasNext()) {
Alien a = (Alien)i2.next();
tp etcode comforialshavagaestoralspaceivades!
wwsinro1s slavagames Space Invaders
a.setY(a.getY() + GO_DOWN);
Iterator it = aliens. iterator();
while (it.hasNext()) {
Alien alien = (Alien) it.next();
if (alien.isVisible()) {
int y = alien.getY();
if (y > GROUND - ALIEN_HETGHT) {
ingame = false;
message =
}
alien.act (direction);
U1 bombs
Iterator i3 = aliens. iterator();
Random generator = new Random();
while (i3.hasNext()) {
int shot = generator.nextint (15);
Alien a = (Alien) 13.next();
Alien.Bonb b = a.getBonb();
if (shot == CHANCE && a,isVisible() && b.isDestroyed()) {
b.setDestroyed(false);
b.setx(a.getx())5
b.set¥(a.get¥());
+
int bombx = b.getx();
int bombY = b.get¥();
int playerx = player.getx();
int playerY = player.getY();
if (player.isVisible() && !b.isDestroyed()) (
if ( bonbx >= (playerx) 8&
bonbX <= (playerX+PLAYER WIDTH) &&
bonby >= (playerY) &&
bomby <= (playerY+PLAYER HEIGHT) ) {
ImageIcon
new ImageIcon(this.getClass().getResource(expl));
player. setImage(ii.getInage());
player. setbying(true) ;
b.setDestroyed(true) ;5
nip detcode comftera'sjavagamestralspaceinvaders/ varsinro1s slavagames Space Invaders
?
if (Ib.isDestroyed()) {
b.setv(b.getv() + 1);
if (b.get¥() >= GROUND - BOMB_HEIGHT) {
b.setDestroyed(true) ;
}
}
public void run() {
long beforeTime, timeDiff, sleep;
beforeTime = System.currentTimeMillis();
while (ingame) {
repaint();
animationcycle();
timeDiff = System.currentTimeMillis() - beforeTime;
sleep = DELAY - timeDiff;
if (sleep < 0)
sleep = 23
try ¢
Thread. sleep(sleep);
} catch (Interruptedexception e) {
system.out.printIn("interrupted");
}
beforeTime = System. currentTimeMillis();
}
gameOver();
}
private class TAdapter extends KeyAdapter (
public void keyReleased(Keyévent e) {
player.keyReleased(e) ;
+
public void keyPressed(KeyEvent e) {
player.keyPressed(e) ;
int x
int y
player.getx();
player.get¥();
if (ingame)
{
if (e.isAltDown()) {
if (Ishot.isVisible())
nip detcode comftera'sjavagamestralspaceinvaders/
107sinro1s slavagames Space Invaders
shot = new Shot(x, y)5
‘The main logic of the game is located in the Board class.
for (int iO; i < 4; ist) {
for (int j=0; j < 65 j++) {
Alien alien = new Alien(alienX + 18*j, alienY + 18*i);
alien. setImage(ii.getImage());
aliens.add(alien) ;
3
player = new Player();
shot = new Shot();
In the ganernit() method we set up 24 aliens. The alien image size is 12x12px. We put 6px space
among the aliens, We also ereate the player and the shot objects.
public void drawBombing(Graphics g) {
Iterator i3 = aliens.iterator();
bile (43.hasNext()) {
Alien a = (Alien) i3.next();
Alien.Bonb b = a.getBonb();
Af (Ib.isbestroyed()) {
g.drawimage(b.getImage(), b-getX(), b.get¥(), this);
}
The drawBonbing() method draws bombs launched by the aliens.
if (ingame) {
g.drawline(@, GROUND, BOARD_WIDTH, GROUND) ;
drawAliens(g);
draPlayer(e);
drawShot(g);
drawBombing(g) ;
Inside the paint() method, we draw the ground, the aliens, the player, the shot, and the bombs.
tip dzetcodecomtera'sjavagamestralspaceinvaders/ wirsinro1s slavagames Space Invaders
Next we will examine the aninationcycle() method.
Af (deaths == NUNBER_OF_ALIENS_TO_DESTROY) {
ingane = false;
message = "Gane won!";
}
If we destroy all aliens, we win the game. (24 in this game)
if (alien.isVisible() && shot-isVisible()) {
Af (shotx >= (alienx) 8&
shotX <= (alienX + ALTEN WIDTH) &&
shotY >= (alienY) &&
shotY <= (alienY+ALTEN HEIGHT) ) {
TmageTcon
new ImageTcon(getClass() .getResource(expl));
alien. setImage(ii.getImage());
alien. setbying(true) ;
deaths++;
shot.die();
If the shot triggered by the player collides with an alien, the alien ship is destroyed, More precisely,
the dying flag is set. We use it to display an explosion. The deaths variable increases and the shot
sprite is destroyed.
if (x >= BOARD_WIOTH - BORDER_RIGHT && direction
a;
Iterator i1 = aliens.iterator();
while (i2-hasNext()) {
Alien a2 = (Alien) i1.next();
a2.set¥(a2.get¥() + GO_DOWN);
=-¢
direction
Ifthe aliens reach the right end of the aoard, they move down and change their direction to the left.
Iterator it = aliens. iterator();
while (it-hasNext()) {
Alien alien = (Alien) it.next();
if (alien.isVisible()) {
int y = alien.get¥();
Sf (y > GROUND - ALTEN HEIGHT) {
ingame = false;
message = "Invasion!";
tip dzetcodecomtera'sjavagamestralspaceinvaders/ 1817sinro1s slavagames Space Invaders
y
alien.act (direction) ;
This code moves aliens. If they reach the bottom, the invasion begins.
int shot = generator.nextInt(15);
Alien a = (Alien) 13.next();
Alien.Bomb b = a.getBomb();
if (shot == CHANCE && a.isVisible() && b.isDestroyed()) {
b. setDestroyed( false);
b. setx(a.getx())5
b.setv(a.get¥());
‘This is the code that determines whether the alien will drop a bomb. The alien must not be destroye:
Eg. it must be visible. The bomb's destroyed flag must be set. In other words, it is alien's first bomb
\dy hit the ground. If these two conditions are fulfilled, the
dropping or previous dropped bomb alres
bombing is left to the chance.
if (Ib. sbestroyed()) (
b.setv(b.getY() + 1);
if (b.get¥() >= GROUND - BOMB_HETGHT)
b.setDestroyed(true) ;
+
If the bomb is not destroyed, it goes 1px to the ground. If t hits the bottom, the destroyed flag is set.
The alien is now ready to drop another bomb.
public void keyReleased(KeyEvent ©)
player. keyReleased(e);
>
The actual processing of this particular keyevent is delegated to the player sprite.
tip dzetcodecomtera'sjavagamestralspaceinvaders/ 187sinno1s slavagames Space Invaders
Eeaipatans
Figure: Space Invaders
This was the Space Invaders game.
Home Contents Top of Page
‘Ze\Code last modified September 28,2008 © 2007 - 2015 Jan Bodnar
pete. comer sjavagamestoralispaceinvaders/ war