Saltar al contenido

Introducción a la programación de videojuegos 2D con Java

octubre 14, 2017
juegos 2d en java INTRODUCCION

En este post os hablaré sobre las bases que necesitaremos para poder programar videojuegos con Java. Crearemos una aplicación básica, dibujaremos un donut y mostraremos una imagen.

Utilizaremos Java como lenguaje de programación y su toolkit de Swing GUI.

Aplicación básica con Java

Os mostraré cada uno de los elementos que forman el esqueleto de los juegos 2D con Java.

Comenzaremos con una aplicación básica.

package com.señoritopi;

import javax.swing.*;

public class Tablero extends JPanel {
    public Tablero(){
        
    }
}
Tablero.java

El tablero sera el JPanel en el que el juego tendrá lugar.

package com.señoritopi;

import javax.swing.*;
import java.awt.*;

public class Aplicacion extends JFrame{
    public Aplicacion(){
        initUI();
    }

    private void initUI(){
        add(new Tablero());
        setSize(250, 200);
        setTitle("Aplicación");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Aplicacion ex = new Aplicacion();
                ex.setVisible(true);
            }
        });
    }
}
Aplicacion.java

Este será el punto de entrada de nuestro juego. Aquí declaramos nuestro método main().

Ventana Basica Juego Java

Ponemos el Tablero en el centro de un JFrame que será nuestro contenedor principal. Ajustamos su tamaño y asignamos la función EXIT ON CLOSE a nuestra ventana para que termine el juego cuando la cerremos. Seteando la función setLocationRelativeTo(null) a null conseguiremos centrar la ventana en nuestra pantalla del ordenador. En el método main crearemos una instancia de nuestro código y la haremos visible en pantalla.

Dibujando un Donut con Java Swing

Los objetos que colocaremos en el tablero serán tanto imágenes como objetos dibujados por la propia API de Java 2D. En este ejemplo dibujaremos un donut.

package com.señoritopi;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

public class TableroDonut extends JPanel {

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        dibujaDonut(g);
    }

    private void dibujaDonut(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;

        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

        g2d.setRenderingHints(rh);

        Dimension tamano = getSize();
        double w = tamano.getWidth();
        double h = tamano.getHeight();

        Ellipse2D e = new Ellipse2D.Double(0, 0, 80, 130);
        g2d.setStroke(new BasicStroke(1));
        g2d.setColor(Color.gray);

        for(double deg = 0; deg < 360; deg += 5) {
            AffineTransform at = AffineTransform.getTranslateInstance(w / 2, h / 2);
            at.rotate(Math.toRadians(deg));
            g2d.draw(at.createTransformedShape(e));
        }
    }
}
Tablero.java

Donut con Java Swing

El dibujado de los componentes se produce dentro del método paintComponent(). Lo sobreescribiremos para poder extender la clase Graphics por Graphics2D que nos permitirá tener un control mas sofisticado de la geometría y propiedades del objeto. Utilizaremos los RenderHints para hacer que nuestro dibujo sea mas suave (smooth) con antialiasing. Creamos la figura de una elipse y la rotamos repitiéndola 72 veces para conseguir la buscada forma del donut.

Dibujando una imagen con Java usando Swing y awt

Cuando desarrollemos un juego 2D en Java muchas veces trabajaremos con imágenes. En este ejemplo cargaremos una imagen de disco y la pintaremos en el Tablero.

package com.señoritopi;

import javax.swing.*;
import java.awt.*;

public class TableroImagen extends JPanel{
    private Image imagen;

    public TableroImagen(){
        initTablero();
    }

    private void initTablero(){
        cargarImagen();

        int w = imagen.getWidth(this);
        int h = imagen.getHeight(this);
        setPreferredSize(new Dimension(w, h));
    }

    public void cargarImagen(){
        ImageIcon ii = new ImageIcon("imagen.png");
        imagen = ii.getImage();
    }

    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(imagen, 0, 0, null);
    }
}
Tablero.java

Como en el caso anterior sobreescribiremos el método paintComponent() para dibujar la imagen. Para cargar la imagen en memoria utilizaremos la clase ImageIcon. Utilizaremos las medidas de la imagen para setear las medidas del Panel principal . En el JFrame utilizaremos el método pack() para reencajar la ventana al nuevo tamaño del JPanel que contiene.