En el articulo anterior agregamos la imagen del fondo de nuestro juego; en esta oportunidad vamos a incorporar al personaje principal al juego.
Para ello utilizaremos la librería de imágenes que descargamos anteriormente

Son sprites, por lo que cada imagen contiene todas las posiciones del personaje para determinada acción; para generar el movimiento solo mostraremos una parte de la imagen principal en determinado momento y lo iremos desplazando a medida que se desarrolle el juego. Algo similar a lo que realizamos con el fondo del juego.
Dentro de la carpeta de image, tenemos una carpeta llamada Characters y dentro de la misma, tenemos una carpeta por cada personaje disponible. La idea es construir una clase general que nos permita manejar a cualquiera de los personajes disponibles.
Comenzaremos creando una clase llamada Player en principio:
package gsampallo;
import java.awt.*;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class Player {
private int type;
private Point position;
public Player(int type,Point initialPosition) {
this.type = type;
this.position = initialPosition;
}
}
En función del tipo de personaje sera la ubicación de las imágenes que utilizaremos, debemos crear un método llamada loadImages() que se ocupara de cargar las imágenes necesarias:
private BufferedImage imageIdle;
private BufferedImage imageRun;
private BufferedImage imageJump;
private BufferedImage imageFall;
private BufferedImage imageHit;
private void loadImages() {
String[] pathImages = {
"image/characters/Mask Dude/",
"image/characters/Ninja Frog/",
"image/characters/Pink Man/",
"image/characters/Virtual Guy/"
};
String pathIdle = pathImages[type]+"Idle.png";
String pathRun = pathImages[type]+"Run.png";
String pathJump = pathImages[type]+"Jump (32x32).png";
String pathFall = pathImages[type]+"Fall (32x32).png";
String pathHit = pathImages[type]+"Hit (32x32).png";
try {
imageIdle = ImageIO.read(new File(pathIdle));
imageRun = ImageIO.read(new File(pathRun));
imageJump = ImageIO.read(new File(pathJump));
imageFall = ImageIO.read(new File(pathFall));
imageHit = ImageIO.read(new File(pathHit));
} catch (Exception e) {
System.err.println("No se pudieron cargar imagenes");
System.err.println(e.getMessage());
System.exit(0);
}
}
En este punto aclaro que elegir un personaje u otro, solo cambia la parte gráfica; el comportamiento en principio serán los mismos.
Incorporaremos también algunas variables globales para facilitarnos un poco el trabajo:
public static int MASK_DUDE = 0;
public static int NINJA_FROG = 1;
public static int PINK_MAN = 2;
public static int VIRTUAL_GUY = 3;
public static int STATE_IDLE = 0;
public static int STATE_RUN = 1;
private int width = 32;
private int height = 32;
private int state;
El personaje puede tener varios estados RUN cuando esta corriendo, IDLE cuando esta detenido; por el momento serán los que utilizaremos.
Finalmente incorporamos los siguientes métodos que nos permite actualizar el personaje y dibujarlo en la pantalla.
int imageReference = 0;
public void updatePlayer() {
if(state == STATE_RUN) {
if(imageReference < ((imageRun.getWidth()/width)-1)) {
imageReference++;
} else {
imageReference = 0;
}
} else if(state == STATE_IDLE) {
if(imageReference < ((imageRun.getWidth()/width)-1)) {
imageReference++;
} else {
imageReference = 0;
}
}
}
public BufferedImage getImagePlayer() {
int x = imageReference*width;
if(state == STATE_RUN) {
return imageRun.getSubimage(x, 0,width,height);
} else {
//Return Idle Image
return imageIdle.getSubimage(x, 0,width,height);
}
}
public int getX() {
return position.x;
}
public int getY() {
return position.y;
}
Los métodos getX() y getY() permite ubicarlo en la pantalla del juego.
Finalmente debemos modificar los métodos updateGame() y paint() en RunnerOne para incorporar el personaje:
public void updateGame() {
/*
* Background
*/
background.updateBackground();
/*
* Player
*/
player.updatePlayer();
}
public void paint(Graphics g) {
g.drawImage(background.getImageBackground(), 0, 0, null);
g.drawImage(player.getImagePlayer(),player.getX(),player.getY(), null);
}
No olvidemos instanciarlo en el constructor:
Player player;
public RunnerOne() {
/* resto del codigo */
/*
* Player
*/
player = new Player(Player.MASK_DUDE,new Point(50,410));
}
Cuando lo ejecutamos obtenemos el personaje corriendo.

https://github.com/gsampallo/runnerone