Blog de AntoValls

Blog de programación y un poco mas

Mover Sprites en Java

Saludos amigos, este pequeño tutorial nos muestra como mover sprites en java. Es una copia de mi otro blog, he decidido publicalo tanto en blogger como en wordpress por motivos de que varias personas en sus trabajos no pueden acceder ya sea a blogger o a wordpress.
De ahora en adelante iré publicando los mismos posts en ambos blogs, a lo que vinimos:

Lo primero que debemos hacer es crear nuestro proyecto para generar nuestra ventana, adjunto el código para centrarnos directamente en el movimiento de sprites.
Como veremos a continuación esta es nuestra clase inicial del Proyecto a que hemos llamado "Mover_Sprites".


import javax.swing.JFrame;

public class Mover_Sprites extends JFrame{

private static final long serialVersionUID = 1L;

public Mover_Sprites()
{
add(new Escenario());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(640, 480);
setLocationRelativeTo(null);
setTitle("Mover Sprites");
setResizable(false);
setVisible(true);
}

public static void main(String[] args)
{
new Mover_Sprites();
}
}


Ahora tenemos otra clase que será nuestro escenario principal, que será donde montaremos el fondo y el sprite que usaremos para movernos en la pantalla.


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
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 javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Escenario extends JPanel implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private Timer timer;
private Nave nave;
private String escenario = "Luna_Espacio_640_480.jpg";
ImageIcon image_icon;

public Escenario(){

addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
setDoubleBuffered(true);

image_icon = new ImageIcon(this.getClass().getResource(escenario));

nave = new Nave();
timer = new Timer(5, this);
timer.start();
}

public void paint(Graphics g) {
super.paint(g);

Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(image_icon.getImage(), 0, 0, this);
g2d.drawImage(nave.getImage(), nave.getX(), nave.getY(), this);

Toolkit.getDefaultToolkit().sync();
g.dispose();
}

public void actionPerformed(ActionEvent e){
nave.move();
repaint();
}

private class TAdapter extends KeyAdapter{

public void keyReleased(KeyEvent e){
nave.keyReleased(e);
}
public void keyPressed(KeyEvent e){
nave.keyPressed(e);
}
}
}


El método paint, se encarga de dibujar a nuestra nave para este caso y al escenario. Donde le indicaremos la imagen que queremos pintar y las coordenadas del objeto.


g2d.drawImage(nave.getImage(), nave.getX(), nave.getY(), this);


El método actionPerformed es llamado cada 5ms, que se encarga de pintar los movimientos del Sprite y del Escenario.


public void actionPerformed(ActionEvent e){
nave.move();
repaint();
}


Nuestra clase Nave, será la que contendrá todos los movientos de nuestra nave.


import java.awt.Image;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;

public class Nave {
private String nave = "nave_pequeña.png";
private int dx;
private int dy;
private int x;
private int y;
private Image image;

public Nave()
{
ImageIcon image_icon = new ImageIcon(this.getClass().getResource(nave));
image = image_icon.getImage();
x = 40;
y = 60;
}

public void move()
{
if (dx > 0 && x <= 640 - 38)
x += dx;
else
if (dx < 0 && x >= 2)
x += dx;

if (dy > 0 && y <= 480 - 50)
y += dy;
else
if (dy < 0 && y >= 2)
y += dy;

}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
public Image getImage()
{
return image;
}
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();

if (key == KeyEvent.VK_RIGHT)
{
dx = 5;
}
if (key == KeyEvent.VK_LEFT)
{
dx = -5;
}
if (key == KeyEvent.VK_UP)
{
dy = -5;
}
if (key == KeyEvent.VK_DOWN)
{
dy = 5;
}
}

public void keyReleased(KeyEvent e)
{
int key = e.getKeyCode();

if (key == KeyEvent.VK_RIGHT)
{
dx = 0;
}
if (key == KeyEvent.VK_LEFT)
{
dx = 0;
}
if (key == KeyEvent.VK_UP)
{
dy = 0;
}
if (key == KeyEvent.VK_DOWN)
{
dy = 0;
}
}

}


Los métodos keyPressed y keyReleased, son los encargados de controlar los movimientos de nuestra nave tanto al presionar com al soltar las teclas.

El método move, cambia las coordenadas del Sprite, Estas con "X" y "Y" y estos valores son usados por el método paint para dibujar el Sprite en pantalla.

Aquí les presento 2 métodos uno simple que consiste solo en controlar los movimientos y otro un poco mas avanzado para darle una limitante a nuestra nave y no se salga de pantalla.

Método simple:


public void move(){
x += dx;
y += dy;
}


Método no tan simple, partiendo de este método pueden darle la limitante de pantalla a su nave, para este tutotial simplemente queme los bordes de la pantalla y los reste por el tamaño de la nave.


public void move()
{
if (dx > 0 && x <= 640 - 38)
x += dx;
else
if (dx < 0 && x >= 2)
x += dx;
if (dy > 0 && y <= 480 - 50)
y += dy;
else
if (dy < 0 && y >= 2)
y += dy;
}


Cuando soltemos la tecla izquierda del cursor, la nave se dentendrá. Lo mismo y controlando cada dirección haremos para el resto.


if (key == KeyEvent.VK_LEFT){
dx = 0;
}


El Resultado final:

Un nuevo inicio

Saludos amigos, después de tantas vueltas, indeciciones, etc… Por fin estoy al aire en este mi espacio web.
Para que me conozcan un poco mas: Soy un desarrollador multimedia guayaquileño en pleno inicio, soy aficionado a los videojuegos; mas de lo normal por ese motivo si un juego no me llena mis espectativas lamentablemente se va al bote. Juego desde hace mas de 18 años cuando aprendí a gatear con mi NES, así que a estas alturas…
Bueno siguiendo… este espacio es para dar a conocer e incluso aprender mas sobre este mundo de desarrollo de aplicaciones multimedia… Voy a centrarme bastante en java para de esa manera yo también ir aprendiendo.
No los canso y bienvenidos a este espacio en la web desde mi pequeño Ecuador.