|
Compartir este tema:
|
Programa en Java que emula el clasico juego de atari Space Invaders (Invasion del Espacio), fue realizado usando la plataforma NetBeans y AWT.
Nombre del Programa: Space Invaders.
Version del Programa: NA.
Autor(es): Jose Gonzalez, Luis Molina, Eulis Blanco.
Lenguaje en que fue programado: Java 1.6.x/1.7.x.
Licencia bajo la que fue liberado: Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0.
Fecha de lanzamiento: Febrero 2013.
Idioma(s): NA.
Captura de pantalla del programa ejecutándose:

Código:
package spaceinvaders; import javax.swing.JFrame; public class Spaceinvaders extends JFrame{ public Spaceinvaders(){ add(new Juego()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(500, 500); setLocationRelativeTo(null); setTitle("Space Invaders"); setResizable(false); setVisible(true); } public static void main(String[] args) { new Spaceinvaders(); } }
package spaceinvaders; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; /** * * @author JOSE GONZALEZ */ public class Juego extends JPanel implements ActionListener { private Timer timer; private long tiempomax; private long contador; private long tiempoanterior; private Nave nave; private boolean ingame; private int ANCHO; private int ALTO; private String msg; private Misil misil_alien; private int vidas = 2; private ArrayList aliens; private int[][] pos = { {130, 29},{180, 29},{230, 29},{280, 29},{330, 29} , {105, 59},{155, 59},{205, 59},{255, 59},{305, 59},{355, 59} , {130, 89},{180, 89},{230, 89},{280, 89},{330, 89} , {105, 119},{155, 119},{205, 119},{255, 119},{305, 119},{355, 119} , }; public Juego(){//contrustor inicialisa variable addKeyListener(new TAdapter()); setFocusable(true); setBackground(Color.BLACK); setDoubleBuffered(true); ingame = true; msg = "Game Over"; setSize(500, 500); nave = new Nave(225, 400,500); iniciarAliens(); misil_alien = new Misil(0,0); misil_alien.setVisible(false); tiempomax = 1000;//tiempo movimiento de aliens ms contador = 0;//durasion de cada frame timer = new Timer(5, this);//cada 5ms ejecuta el metodo accionperforment necesita implementar action listener timer.start(); } public void addNotify(){ super.addNotify(); this.ALTO = getHeight(); this.ANCHO = getWidth(); } public void iniciarAliens() {//aliens crea aliens = new ArrayList(); for (int i=0; i<pos.length; i++ ) { aliens.add(new Alien(pos[i][0], pos[i][1])); } } public void paint(Graphics g) {//pintar o graficar super.paint(g); if (ingame) { Graphics2D g2d = (Graphics2D)g; if (nave.isVisible()) g2d.drawImage(nave.getImage(), nave.getX(), nave.getY(),this);//dibuja imagen ArrayList ms = nave.getMisiles(); for (int i = 0; i < ms.size(); i++) {//recorre array, dibuja el misil Misil m = (Misil)ms.get(i); g2d.drawImage(m.getImage(), m.getX(), m.getY(), this); } for (int i = 0; i < aliens.size(); i++) { Alien a = (Alien)aliens.get(i); if (a.isVisible()){ g2d.drawImage(a.getImage(), a.getX(), a.getY(), this); } } g2d.drawImage(misil_alien.getImage(), misil_alien.getX(), misil_alien.getY(), this); g2d.setColor(Color.WHITE); g2d.drawString("Vidas: " + vidas, 5, 15); g2d.drawString("Hasta Aqui -> ", 5, 250); g2d.drawString("________________________________________________________________________________________", 0, 450); } if(!ingame){ Font small = new Font("Helvetica", Font.BOLD, 14); FontMetrics metr = this.getFontMetrics(small); g.setColor(Color.white); g.setFont(small); g.drawString(msg, (ANCHO - metr.stringWidth(msg)) / 2, ALTO / 2); } g.dispose(); } public void actionPerformed(ActionEvent e) {//logica if (aliens.size()==0) { ingame = false; msg = "GANASTE"; } ArrayList ms = nave.getMisiles(); for (int i = 0; i < ms.size(); i++) {//misil borrar, mover Misil m = (Misil) ms.get(i); if (m.isVisible()) m.mover(); else ms.remove(i); } long delta = System.currentTimeMillis()- tiempoanterior;// timemillis tiempo del programa completo, tiempo de kda frame tiempoanterior = System.currentTimeMillis();//tiempo del ultimo frame del anterior contador += delta;//suma la duracion del nuevo frame if (contador > tiempomax) { contador = 0; for (int i = 0; i < aliens.size(); i++) {//esto lo ase en un solo frame Alien a = (Alien) aliens.get(i); a.mover(); } } for (int i = 0; i < aliens.size(); i++) {//remueve en el frame q sigue Alien a = (Alien) aliens.get(i); if (!a.isVisible()) aliens.remove(i); } if(misil_alien.visible == false){//alien alazar y dispara double numero = Math.floor(Math.random()*aliens.size()); int k = (int) numero; Alien ad = (Alien) aliens.get(k); misil_alien = ad.fire(); } misil_alien.mover_alien(); nave.mover(); checkearColisiones(); repaint(); } public void checkearColisiones() { Rectangle r3 = nave.getBounds(); Rectangle r4 = misil_alien.getBounds(); if(r3.intersects(r4)){ nave.setVisible(false); misil_alien.setVisible(false); vidas--; if(vidas>=0){ nave.setPos(50, 400); nave.setVisible(true); }else{ ingame = false; } } for (int j = 0; j<aliens.size(); j++) { Alien a = (Alien) aliens.get(j); Rectangle r2 = a.getBounds(); if(r2.y+r2.height > 250){ ingame = false; } } ArrayList ms = nave.getMisiles(); for (int i = 0; i < ms.size(); i++) { Misil m = (Misil) ms.get(i); Rectangle r1 = m.getBounds(); for (int j = 0; j<aliens.size(); j++) { Alien a = (Alien) aliens.get(j); Rectangle r2 = a.getBounds(); if (r1.intersects(r2)) { m.setVisible(false); a.setVisible(false); } } } } private class TAdapter extends KeyAdapter {//cactura teclas public void keyReleased(KeyEvent e) { nave.keyReleased(e); } public void keyPressed(KeyEvent e) { nave.keyPressed(e); } } }
package spaceinvaders; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.util.ArrayList; import javax.swing.ImageIcon; /** * * @author JOSE GONZALEZ */ public class Nave { private String Nave = "spaceship1.png"; private int dx; private int x; private int y; private int ancho; private int alto; private boolean visible; private Image imagen; private ArrayList misiles; private int anchocanvas; public Nave(int posX, int posY,int anchocanva) { ImageIcon ii = new ImageIcon(this.getClass().getResource(Nave));//oa agarra el archivo imagen = ii.getImage(); ancho = imagen.getWidth(null); alto = imagen.getHeight(null); misiles = new ArrayList(); visible = true; x = posX; y = posY; anchocanvas=anchocanva; } public void mover() { x += dx; if (x < 1) { x = 1; } if(x>=anchocanvas-ancho){ x=anchocanvas-ancho; } } public void setPos(int x, int y){ this.x=x; this.y=y; } public int getX() { return x; } public int getY() { return y; } public Image getImage() { return imagen; } public void setVisible(boolean visible) { this.visible = visible; } public boolean isVisible() { return visible; } public ArrayList getMisiles() { return misiles; } public Rectangle getBounds() { return new Rectangle(x, y, ancho, alto); } public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_SPACE) { disparar(); } if (key == KeyEvent.VK_LEFT) { dx = -1; } if (key == KeyEvent.VK_RIGHT) { dx = 1; } } public void disparar() { if(misiles.size()<5){ misiles.add(new Misil((x + ancho/2)-2, y)); } } public void keyReleased(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_LEFT) { dx = 0; } if (key == KeyEvent.VK_RIGHT) { dx = 0; } } }
package spaceinvaders; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.util.ArrayList; import javax.swing.ImageIcon; /** * * @author JOSE GONZALEZ */ public class Alien { private String alien = "alien1.png"; private int dx; private int dy; private int x; private int y; private int movimientos_max; private int movimientos_hechos; private int ciclos_max; private int ciclos; private int ancho; private int alto; private boolean visible; private Image imagen; private ArrayList misiles; public Alien(int posX, int posY) { ImageIcon ii = new ImageIcon(this.getClass().getResource(alien)); imagen = ii.getImage(); ancho = imagen.getWidth(null); alto = imagen.getHeight(null); visible = true; x = posX; y = posY; dx = 10; dy = 10; movimientos_max = 6; movimientos_hechos = movimientos_max/2; ciclos_max = 2; ciclos = 0; misiles = new ArrayList(); } public void mover() { x += dx; movimientos_hechos++; if (movimientos_hechos >= movimientos_max) { dx *= -1; movimientos_hechos = 0; ciclos++; if(ciclos>=ciclos_max){ mover_abajo(); ciclos=0; } } } public void mover_abajo(){ y += dy; } public int getX() { return x; } public int getY() { return y; } public Image getImage() { return imagen; } public ArrayList getMisiles() { return misiles; } public void setVisible(boolean visible) { this.visible = visible; } public boolean isVisible() { return visible; } public Rectangle getBounds() { return new Rectangle(x, y, ancho, alto); } public Misil fire() { return new Misil((x + ancho/2)-2, y + alto); } }
package spaceinvaders; import java.awt.Image; import java.awt.Rectangle; import javax.swing.ImageIcon; /** * * @author JOSE GONZALEZ */ public class Misil { private int x, y; private Image imagen; boolean visible; private int ancho, alto; private final int VELOCIDAD_MISIL = 6; public Misil(int x, int y) { ImageIcon ii= new ImageIcon(this.getClass().getResource("missile.png")); imagen = ii.getImage(); visible = true; ancho = imagen.getWidth(null); alto = imagen.getHeight(null); this.x = x; this.y = y; } public Image getImage() { return imagen; } public int getX() { return x; } public int getY() { return y; } public boolean isVisible() { return visible; } public void setVisible(Boolean visible) { this.visible = visible; } public Rectangle getBounds() { return new Rectangle(x, y, ancho, alto); } public void mover() { y -= VELOCIDAD_MISIL; if (y < 5) visible = false; } public void mover_alien() { y += VELOCIDAD_MISIL/2; if (y > 450-alto) visible = false; } }
Imagenes usadas en el programa:
https://www.safecreative.org/work/1302164602724-alien1
https://www.safecreative.org/work/1302164602717-missile
https://www.safecreative.org/work/1302164602700-spaceship1
https://www.safecreative.org/work/1302164602694-spaceshiphd1




