Foro de elhacker.net

Programación => Java => Mensaje iniciado por: aspiazu en 26 Abril 2016, 18:35 pm



Título: Java juego 2D
Publicado por: aspiazu en 26 Abril 2016, 18:35 pm
Buuuenas,ando haciendo un juego en 2d de java ,una especie de mario bross.

Tengo puesto el mapa,y luego tengo a mario bros que va hacia adelante,atras y salta.
Para saltar,si le das muchas veces a la flecha ,mario empieza ir para arriba sin parar.Luego aparte el movimiento de mario para andar no es muy fluido al darle a las flechas como que le cuesta moverse.
Lo que mas me interesa es como hacer un sleep o timer o algo parecido para que al saltar tengas que esperar X segundos para que vuelva a saltar.

Tambien quiero saber como dibujar unos rectangulos,y colocarlos en el mapa en el sitio que quiera ,y crear la colision .Como si mario se chocara con la pared,o con los objetos del mapa.

Aqui dejo todo mi codigo:

Juego.Java

Citar
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class Juego extends JFrame {

   private JPanel contentPane;
   private ZonaJuego zonaJuego;

   /**
    * Launch the application.
    */
   public static void main(String[] args) {
      EventQueue.invokeLater(new Runnable() {
         public void run() {
            try {
               Juego frame = new Juego();
               frame.setVisible(true);
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      });
   }

   /**
    * Create the frame.
    */
   public Juego() {
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setBounds(200, 250, 1200, 500);
      
      contentPane = new JPanel();
      contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
      setContentPane(contentPane);
      contentPane.setLayout(null);
      zonaJuego=new ZonaJuego();
      //zonaJuego.setBackground(Color.yellow);
      zonaJuego.setBounds(-18,0,3350,460);//contentPane.getWidth(),
      //contentPane.getHeight());
      contentPane.add(zonaJuego);
      zonaJuego.setFocusable(true);
      zonaJuego.requestFocus();
}
   
   
}

ZonaJuego.java
Citar
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.RenderingHints.Key;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.Timer;

public class ZonaJuego extends Canvas implements ActionListener{
   //DATOS: CABALLO IMAGEN DE FONDO
   private Image fondo;
   
   private Mario mario;
   private int cont,desp;
   private int[] mov;
   private Timer reloj;
   private Image buffer;
   private Graphics pantVirt;
   

   //CONSTRUCTOR
   ZonaJuego(){
      fondo=new ImageIcon("./Imagenes2/MarioMapa.png").getImage();
      mario=new Mario(this);
      mov=new int[4];
      for(int i=0;i<mov.length;i++){
         mov=0;
      }
      
      desp=0;
      cont=0;
      //REGISTRAR EVENTOS
      reloj=new Timer(40, this);
      reloj.start();
   
      this.addKeyListener(new KeyListener() {
         
         @Override
         public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub
            
         }
         
         @Override
         public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub
            if(e.getKeyCode()==KeyEvent.VK_LEFT){
               mov[0]=0;
               mario.setEstado(mario.PARADO);
            }
            if(e.getKeyCode()==KeyEvent.VK_RIGHT){
               mov[2]=0;
               mario.setEstado(mario.PARADO);
            }
            if(e.getKeyCode()==KeyEvent.VK_UP){
               
               mario.setEstado(mario.BAJANDO);
            }
            
         }
         
         @Override
         public void keyPressed(KeyEvent e) {
            // TODO Auto-generated method stub
            if(e.getKeyCode()==KeyEvent.VK_LEFT){
               mov[0]=1;
               mov[2]=0;
               mario.setEstado(mario.ANDANDO);
               if(mario.getPosX()<=500){
                  //desp=desp+mario.getVelocidad();
                     //mario.setEstado(mario.PARADO);      
               }
            }
         
            if(e.getKeyCode()==KeyEvent.VK_RIGHT){
               mov[0]=0;
               mov[2]=1;
               mario.setEstado(mario.ANDANDO);
               if(mario.getPosX()>=400){
                  desp=desp-mario.getVelocidad();
                  mario.setEstado(mario.CORRIENDO);
                  }   
            }
         
            if(e.getKeyCode()==KeyEvent.VK_UP){
               mario.setEstado(mario.SUBIENDO);
               if(mario.getPosX()>=400){
               desp=desp-mario.getVelocidad();
               //mario.setEstado(mario.PARADO);
               //if(mario.getEstado()==Mario.PARADO ||
                     //mario.getEstado()==Mario.ANDANDO)            
            }
            
            }
            
            
         }
      });
      
      repaint();
      
   }//FIN DEL CONSTRUCTOR
   
   @Override
   public void actionPerformed(ActionEvent e) {
      mario.mover(mov);
      mario.saltar();
      repaint();
   }
   
   //MÉTODOS
   @Override
   public void update(Graphics g) {
      // TODO Auto-generated method stub
      //super.update(g);
      buffer=createImage(getWidth(), getHeight());
      pantVirt=buffer.getGraphics();

      paint(pantVirt);
      g.drawImage(buffer, 0, 0, getWidth(), getHeight(), null);
   }
   
   @Override
   public void paint(Graphics g) {
      // TODO Auto-generated method stub
      super.paint(g);
      //DIBUJAR EL FONDO
      g.drawImage(fondo,desp-18,0,3350,460, null);
      //DIBUJAR TODOS LOS OBJETOS QUE INTERVIENEN EN EL JUEGO
      mario.dibujar(g);
      
   }

}

y por ultimo Mario.java

Citar
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Paint;
import java.awt.Toolkit;

import javax.swing.ImageIcon;

public class Mario {
   //CONSTANTES
   public static final int PARADO=0;
   public static final int ANDANDO=1;
   public static final int CORRIENDO=2;
   public static final int SUBIENDO=3;
   public static final int BAJANDO=4;
   public static final int IZQ=-1;
   public static final int DCHA=1;
   //DATOS
   private int posX,posY,possX;
   private int ancho, alto;
   private int dirH, dirV, velocidad,velocidad1;
   private int estado, imgActual;
   private ImageIcon[] imgI;
   private ImageIcon[] imgD;
   private ZonaJuego zonaJuego;
   
   //GETTERS Y SETTERS
      public int getPosX() {
         return posX;
      }
      public int getPossX() {
         return possX;
      }


      public void setPosX(int posX) {
         this.posX = posX;
      }

      public int getPosY() {
         return posY;
      }

      public void setPosY(int posY) {
         this.posY = posY;
      }

      public int getAncho() {
         return ancho;
      }

      public void setAncho(int ancho) {
         this.ancho = ancho;
      }

      public int getAlto() {
         return alto;
      }

      public void setAlto(int alto) {
         this.alto = alto;
      }

      public int getDirH() {
         return dirH;
      }

      public void setDirH(int dirH) {
         this.dirH = dirH;
      }

      public int getDirV() {
         return dirV;
      }

      public void setDirV(int dirV) {
         this.dirV = dirV;
      }

      public int getVelocidad() {
         return velocidad;
      }
      public int getVelocidad1() {
         return velocidad1;
      }

      public void setVelocidad(int velocidad) {
         this.velocidad = velocidad;
      }

      public int getEstado() {
         return estado;
      }

      public void setEstado(int estado) {
         this.estado = estado;
      }

      public int getImgActual() {
         return imgActual;
      }

      public void setImgActual(int imgActual) {
         this.imgActual = imgActual;
      }

   //CONSTRUCTOR
   Mario(ZonaJuego zonaJuego){
      this.zonaJuego=zonaJuego;
      ancho=20;
      alto=40;
      posX=50;
      posY=400;
      imgActual=0;
      velocidad=3;
      velocidad1=1;
      possX=800;
      dirH=DCHA;
      dirV=0;
      estado=PARADO;
      
      imgI=new ImageIcon[8];
      imgD=new ImageIcon[8];
      
      
      for(int i=0;i<imgI.length;i++){
         imgI=new ImageIcon("./Imagenes2/Mario/Mario"+(i+1)+".png");
         imgD=new ImageIcon("./Imagenes2/Mario/MarioD"+(i+1)+".png");
      }
      
   }
   
   //MÉTODOS
   public void dibujar(Graphics g){
      if(dirH==IZQ){
         g.drawImage(imgI[imgActual].getImage(),
               posX, posY, ancho, alto, zonaJuego);
      }
      if(dirH==DCHA){
         g.drawImage(imgD[imgActual].getImage(),
               posX, posY, ancho, alto, zonaJuego);
      }
   }
   
   
   public void mover(int[] mov){
      //cambiar de direccion sin moverse
      if(dirH==IZQ && mov[2]==1){   
         dirH=DCHA;
         imgActual=0;
         
      }
      else if(dirH==DCHA && mov[0]==1){
         dirH=IZQ;
         imgActual=0;
      
      }
      else{
         if(estado!=PARADO && estado!=CORRIENDO){
            //CAMBIAR POSICION
            posX=posX+velocidad*dirH;
            
            if(posX<0){
               posX=0;
            }
            if(posX+ancho>zonaJuego.getWidth()){
               posX=zonaJuego.getWidth()-ancho;
            }
               
            //CAMBIAR IMAGEN
            imgActual=(imgActual+1)%imgI.length;
         }
         if(estado==CORRIENDO){
            imgActual=(imgActual+1)%imgI.length;
         }
         
      }
   }
   public void saltar(){
      //SI ESTA PARADO: SALTA EN VERTICAL
      if(estado==SUBIENDO){
         posY=posY-8;
         
      }
      if(estado==BAJANDO){
         posY=posY+8;
         
         
         if(posY>=400){
            estado=PARADO;
         }
      }
   }
      
      
}



Título: Re: Java juego 2D
Publicado por: + 1 Oculto(s) en 27 Abril 2016, 19:24 pm
investiga sobre hilos pero ten cuidado con los puntos criticos

tambien se puede hacer sin hilos claro esta...
ahora deberias hacer colisiones de circulo con rectangulo

algo asi:
Código
  1. public int colisionCirculoCuadrado(Circulo circle, Cuadrado rect) {
  2.  
  3.        int circleDistanceX = Math.abs(circle.x - rect.getPostX() - rect.getBase() / 2);
  4.        int circleDistanceY = Math.abs(circle.y - rect.getPostY() - rect.getAltura() / 2);
  5.  
  6.        if (circleDistanceX > (rect.getBase() / 2 + circle.r)) {
  7.            return 1;
  8.        }
  9.        if (circleDistanceY > (rect.getAltura() / 2 + circle.r)) {
  10.            return 2;
  11.        }
  12.        if (circleDistanceX <= (rect.getBase() / 2)) {
  13.            return 3;
  14.        }
  15.        if (circleDistanceY <= (rect.getAltura() / 2)) {
  16.            return 4;
  17.        }
  18.        double cornerDistance_sq = Math.pow(circleDistanceX - rect.getBase() / 2, 2) + Math.pow(circleDistanceY - rect.getAltura() / 2, 2);
  19.        if ((cornerDistance_sq <= (Math.pow(circle.r, 2)))) {
  20.            return 4;
  21.        }
  22.        return -1;
  23.    }

el codigo de arriba es de mi autoria sobre un juego que hice uno de estos dias lo subire a la nube