viernes, 29 de abril de 2016

Dinosaurios 5, tomando el control

Con esta versión ya tomamos el control del personaje principal del juego usando para ello un KeyListener que ya explicamos aquí. Es un paso fundamental en el desarrollo de
nuestro juego pues ya tenemos control total sobre el personaje principal y no dependemos de ese automatismo programado de las versiones anteriores.

La estructura de la aplicación sigue siendo la misma pero los cambios que aquí se introducen son que hemos eliminado un botón, ahora sólo hay dos botones, start para empezar el juego y stop para parar, hemos añadido el código fuente del KeyListener para poder capturar las teclas y que nuestro dinosaurio obedezca. También hemos realizado otros cambios menores para ir mejorando el juego.

En esta versión sólo existe un único dinosaurio que será el personaje principal del juego y ya lo podemos mover a nuestro antojo por todo el escenario. La animación hay que mejorarla pues es la misma que tenía antes cuando sólo se dedicaba a cruzar la pantalla de izquierda a derecha. Ahora hay que mejorarla para cuando ande para atrás, cuando se pare, etc.

Cómo vemos nuestro juego ya va tomando forma, ahora nos falta alguna misión o algún enemigo para nuestro dinosaurio y ya tendríamos una primera versión básica del juego.

Aquí os dejo el vídeo demostrativo de cómo hemos tomado el control del dinosaurio y de cómo ya nos obedece al pulsar las teclas: 

10 comentarios:

  1. Me podrias pasar el codigo porfavor

    ResponderEliminar
    Respuestas
    1. Hola!!, te paso el código clase por clase para que puedas ir probando si te funciona o no. El Proyecto consta de 4 clases: Animacion2d, ImagenesJuego, IGU y Objeto.

      El código fuente de Animacion2d es el siguiente:


      public class Animacion2d
      {
      public static void main(String[] args) {
      new IGU();
      }
      }

      Es la clase más sencilla, contiene el main y se encarga de que se pueda ejecutar el juego fuera del entorno de desarrollo. Si la has copiado y va todo bien dimelo y te voy poniendo el código de las otras

      Eliminar
    2. Listo, ya agregue las 4 clases y el codigo de la clase Animacion2d y me compila

      Eliminar
    3. Ok, vamos ahora con la clase ImagenesJuego, esta clase es la que se encarga de cargar las imagenes que se utilizarán en el juego, dentro del proyecto tienes que crear también una carpeta de nombre Imagenes que será donde haya que ponerlas luego:

      import java.awt.image.BufferedImage;
      import java.net.URL;
      import java.util.HashMap;
      import javax.imageio.ImageIO;

      public class ImagenesJuego
      {
      public HashMap Imagenes;

      public ImagenesJuego() {
      Imagenes = new HashMap();
      }

      public BufferedImage loadImage(String nombre) {
      URL url=null;
      try {
      url = getClass().getClassLoader().getResource(nombre);
      return ImageIO.read(url);
      } catch (Exception e) {
      System.out.println("No se ha podido cargar la imagen " + nombre +" de "+url);
      System.out.println("El error fue : "+e.getClass().getName()+" "+e.getMessage());
      System.exit(0);
      return null;
      }
      }

      public BufferedImage getImagen(String nombre) {
      BufferedImage img = (BufferedImage)Imagenes.get(nombre);
      if (img == null) {
      img = loadImage("Imagenes/"+nombre);
      Imagenes.put(nombre,img);
      }
      return img;
      }

      }

      Eliminar
    4. listo, ya puse el codigo y cree la carpeta en el proyecto

      Eliminar
    5. Este es el código de la clase Objeto, esta clase sirve para crear el objeto que tendrá las coordenadas y movimientos de los personajes, en este caso el dinosaurio, pero más adelante en otras versiones iré añadiendo más elementos en base a esta clase:


      public class Objeto {

      public int posX, posY, contador;

      public Objeto(int x, int y){
      posX=x;
      posY=y;
      contador=0;
      }

      public int getPosX(){
      return posX;
      }
      public int getPosY(){
      return posY;
      }

      public void moverDerecha(int d){
      posX=posX+d;
      }

      public void moverIzquierda(int i){
      posX=posX-i;
      }

      public void moverArriba(int a){
      posY=posY-a;
      }

      public void moverAbajo(int b){
      posY=posY+b;
      }

      }

      Eliminar
  2. Respuestas
    1. Hola, perdonar la tardanza, aquí está el código de la clase IGU es la única que falta. Esta clase se encarga de muchas cosas y más adelante cuando haga una refactorización del proyecto seguramente la divida en varias, de momento está así (la pongo en varias partes y sin los comentarios para que no se descuadre mucho, si no entendéis algo preguntarlo)

      **En la carpeta imagenes necesitais una que se llame fondo.gif (para el fondo de la ventana), Dinosaurio1.png, Dinosaurio2.png y Dinosaruio3.png (para la animación del dinosaurio)

      Eliminar
    2. Primera parte del código de IGU:

      import java.awt.Canvas;
      import java.awt.Color;
      import java.awt.Dimension;
      import java.awt.Graphics;
      import java.awt.image.BufferedImage;
      import java.util.HashMap;
      import javax.swing.*;
      import java.awt.event.*;
      import java.util.ArrayList;
      import java.util.Random;
      import java.awt.*;

      public class IGU extends Canvas {
      public int Ancho = 800;
      public int Alto = 600;
      public int Velocidad = 25;
      public int contador = 0;
      public int aparicion = 0;

      public BufferedImage buffer;
      ImagenesJuego img = new ImagenesJuego();

      public JButton boton1, boton2;
      Objeto Dinosaurio = new Objeto (300,300);

      public Timer timerJuego;

      public IGU() {

      buffer = new BufferedImage(Ancho,Alto, BufferedImage.TYPE_INT_RGB);
      JFrame ventana = new JFrame("JuegoSoftware.com Dinosaurios 5");

      JPanel panel = (JPanel)ventana.getContentPane();
      setBounds(200,0,Ancho,Alto);

      JPanel panel3 = new JPanel();
      boton1=new JButton("Start");
      boton2=new JButton("Stop");

      panel3.setBackground(Color.blue);
      panel3.setLocation(0,0);
      panel3.setSize(200,Alto-38);
      panel3.setLayout(new GridLayout(2,1));
      panel3.add(boton1);
      panel3.add(boton2);

      boton1.addActionListener(new o_Start());
      boton2.addActionListener(new o_Stop());
      ventana.add(panel3);
      panel.setPreferredSize(new Dimension(Ancho,Alto));
      panel.setLayout(null);
      panel.add(this);

      ventana.setBounds(0,0,Ancho+200,Alto);
      ventana.setLocationRelativeTo(null);
      ventana.setVisible(true);
      ventana.setResizable(false);

      ventana.addWindowListener( new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
      System.exit(0);
      }
      });


      addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent e) {
      leerLetras(e.getKeyCode());
      }

      public void keyReleased(KeyEvent e) {
      leerLetras(e.getKeyCode());
      }

      private void leerLetras(int keyCode) {
      switch (keyCode) {
      case KeyEvent.VK_LEFT:
      Dinosaurio.moverIzquierda(5);
      break;
      case KeyEvent.VK_RIGHT:
      Dinosaurio.moverDerecha(5);
      break;
      }
      }
      });

      Eliminar
    3. Segunda parte del código de IGU:

      ActionListener juego = new ActionListener()
      {
      public void actionPerformed (ActionEvent e)
      {
      game();
      }
      };
      timerJuego = new Timer (Velocidad,juego);

      }

      private class o_Start implements ActionListener{
      public void actionPerformed(ActionEvent e)
      {
      timerJuego.start();
      }
      }

      private class o_Stop implements ActionListener{
      public void actionPerformed(ActionEvent e)
      {
      timerJuego.stop();
      }
      }


      public void animarDinosaurio(){
      contador++;
      if(contador>12){
      contador=0;
      }
      }

      public void pintaTodo() {

      Graphics g = buffer.getGraphics();
      g.setColor(Color.WHITE);
      g.fillRect(0,0,getWidth(),getHeight());

      g.drawImage(img.getImagen("fondo.gif"), 0, 0,this);

      if(contador==4){

      g.drawImage(img.getImagen("Dinosaurio1.png"), Dinosaurio.getPosX(), Dinosaurio.getPosY(),this);

      getGraphics().drawImage(buffer,0,0,this);
      }

      if(contador==8){
      g.drawImage(img.getImagen("Dinosaurio2.png"), Dinosaurio.getPosX(), Dinosaurio.getPosY(),this);
      getGraphics().drawImage(buffer,0,0,this);
      }

      if(contador==12){
      g.drawImage(img.getImagen("Dinosaurio3.png"), Dinosaurio.getPosX(), Dinosaurio.getPosY(),this);
      getGraphics().drawImage(buffer,0,0,this);
      }

      }
      public void paint(Graphics g) {}

      public void update(Graphics g) {}


      public void game() {

      animarDinosaurio();
      pintaTodo();

      }
      }

      Eliminar