Actividad 5: Actualizando la clase Sprite
Objetivo
Para este ejercicio, debes actualizarse la clase Sprite definir la posición de dibujo de la imagen de cada uno de los elementos de la clase, dentro del área de juego.
Clases de Cache
Estructura de clases
La estructura de clases del paquete sprites es la siguiente:
©generated by Project Tree Generator
Actualizando la clase Sprite.java
Verifica que la clase sea abstracta y cuente con los siguientes atributos:
Point position: posición vertical del sprite.Dimension size: dimensiones del sprite.String spriteName: imagen que representa el sprite.
Define la función
drawde la siguiente manera:public void draw(Graphics2D g2d) { g2d.drawImage(getImage(), position.x, position.y, null); }Verifica la existencia de la función abstracta
addImageToCacheque permite almacenar una imagen en caché, para que no sea necesario cargarla cada vez que se dibuje el sprite.Verifica la existencia de las funciones:
- public Rectangle getBounds() { return new Rectangle(position, size); } public BufferedImage getImage() { return SpriteCache.getInstance().getImage(imageName); }
Verifica la existencia de las funciones get para la posición, el tamaño y el nombre de la imagen.
Verifica la existencia de la función
setSizeque permite establecer el tamaño del sprite.
Actualizando la clase MovingSprite.java
Verifica que la clase
MovingSpritesea abstracta extienda deSprite.Verifica que la clase cuente con los siguientes atributos:
int dx: velocidad horizontal del sprite.int dy: velocidad vertical del sprite.
Verifica la existencia de la función abstracta
moveque permite mover el sprite en función de su velocidad.Verifica la existencia de los getters y setters para los atributos
dxydy.
Toma en cuenta la tabla de direcciones de la siguiente manera:
Dirección | dx | dy |
|---|---|---|
Arriba | 0 | -1 |
Abajo | 0 | 1 |
Izquierda | -1 | 0 |
Derecha | 1 | 0 |
Arriba-Izquierda | -1 | -1 |
Arriba-Derecha | 1 | -1 |
Abajo-Izquierda | -1 | 1 |
Abajo-Derecha | 1 | 1 |
Agregando la interfaz Resettable.java
Crea la interfaz
Resettable.Define el método
resetPositionque permite restablecer la posición del sprite a su posición inicial.
Actualizando la clase Ball.java
Verifica que la clase
Ballextienda deMovingSpritee implemente la interfazResettable.Verifica que la clase cuente con los siguientes atributos:
- public static final int BALL_WIDTH = 20; public static final int INITIAL_BALL_X = 224; public static final int INITIAL_BALL_Y = 570; public static final Point INITIAL_BALL_POSITION = new Point(INITIAL_BALL_X, INITIAL_BALL_Y); public static final Dimension BALL_SIZE = new Dimension(BALL_WIDTH, BALL_WIDTH); private int speed; private boolean stop; private int dxStop;
Verifica la existencia del siguiente constructor:
public Ball() { super(INITIAL_BALL_POSITION, "ball", BALL_SIZE, 1, -1); speed = 3; stop = true; dxStop = 0; }Sobreescribe la función
drawde la siguiente manera:@Override public void draw(Graphics2D g2d) { g2d.drawImage(getImageIcon().getImage(), position.x, position.y, null); }Sobrescribe la función
addImageToCachede la siguiente manera:@Override protected void addImageToCache() { SpriteCache.getInstance().addImage(imageName, SpriteLoader.loadGif("ball.gif")); }Sobreescribe la función
movede la siguiente manera:@Override public void move() { if (stop) { position.x += dxStop * speed; } else { position.x += dx * speed; position.y += dy * speed; } }Verifica la existencia de la función
resetPositionque permite restablecer la posición del sprite a su posición inicial.@Override public void resetPosition() { position.x = INITIAL_BALL_X; position.y = INITIAL_BALL_Y; dx = 1; dy = -1; stop = true; }Define la función
getImageIconque permite obtener la imagen del sprite de la siguiente manera:public ImageIcon getImageIcon() { return SpriteCache.getInstance().getImageIcon(getImageName()); }
Agregando la clase Borders.java
Crea la clase
Bordersque extiende deSprite.Define el constructor de la clase
Bordersel nombre de la imagen y la posición del sprite.Define la función
addImageToCacheque permite almacenar la imagen en caché de las siguiente manera:- @Override protected void addImageToCache() { SpriteCache spriteCache = SpriteCache.getInstance(); BufferedImage image = SpriteLoader.loadImage(imageName + ".png"); spriteCache.addImage(imageName, image); if (image != null) { setSize(new Dimension(image.getWidth(), image.getHeight())); } }
Define las siguientes constantes:
TOP_BAR: posición del borde superior.BOTTOM_BAR: posición del borde inferior.LEFT_BAR: posición del borde izquierdo.RIGHT_BAR: posición del borde derecho.- public static final Borders LEFT_BAR = new Borders("leftBar", new Point(0, 0)); public static final Borders RIGHT_BAR = new Borders("rightBar", new Point(438, 0)); public static final Borders TOP_BAR = new Borders("topBar", new Point(18, 0)); public static final Borders BOTTOM_BAR = new Borders("topBar", new Point(18, 622));
Los Bonus
Verifica que la clase
Bonusextienda deMovingSpritee implemente la interfazResettableySerializable.Verifica que la clase cuente con los siguientes atributos:
boolean active: indica si el bonus está activo o no.BonusType type: tipo de bonus.
Verifica la existencia del siguiente constructor:
public Bonus(Point startPosition, BonusType type) { super(startPosition, type.getImageName(), Brick.BRICK_SIZE, 0, 1); this.type = type; this.active = false; }La implementación como tal de la función
addImageToCacheno es necesaria, ya que la imagen del bonus se cargará posteriormente.Verifica que el enumerado
BonusTypecuente con los siguientes atributos:String imageName: nombre de la imagen del bonus.
Define la función abstracta
activateBonusque permite activar el bonus.Agrega al menos 3 tipos de bonus:
BonusType.BALL_SPEED: aumenta la velocidad de la bola.BonusType.PADDLE_SPEED: aumenta la velocidad de la paleta.BonusType.MISSILE: permite disparar un misil.
De tal manera que deberán quedar de la siguiente manera en el tipo enumerado:
BALL_SPEED("ballSpeed"){ @Override public void activateBonus() { } }, PADDLE_SPEED("paddleSpeed"){ @Override public void activateBonus() { } }, MISSILE("missile"){ @Override public void activateBonus() { } };
Actualizando la clase Paddle.java
Verifica que la clase
Paddleextienda deMovingSpritee implemente la interfazResettable.Verifica que la clase cuente con los siguientes atributos:
public static final int INITIAL_PADDLE_X = 202; public static final int INITIAL_PADDLE_Y = 588; public static final Point INITIAL_PADDLE_POSITION = new Point(INITIAL_PADDLE_X, INITIAL_PADDLE_Y); private PaddleType type;Verifica la existencia del siguiente constructor:
public Paddle(PaddleType type) { super(INITIAL_PADDLE_POSITION, type.getImageName(), type.getSize(), 0, 0); this.type = type; }Verifica la existencia de la función
addImageToCacheque permite almacenar la imagen en caché de las siguiente manera:@Override protected void addImageToCache() { SpriteCache spriteCache = SpriteCache.getInstance(); spriteCache.addImage(PaddleType.SMALL.getImageName(), SpriteLoader.loadImage("paddle.png")); spriteCache.addImage(PaddleType.MEDIUM.getImageName(), SpriteLoader.loadImage("paddle.png")); spriteCache.addImage(PaddleType.LARGE.getImageName(), SpriteLoader.loadImage("paddle-large.png")); spriteCache.addImage(PaddleType.SHOOTER.getImageName(), SpriteLoader.loadImage("paddle-laser.png")); }Verifica la existencia de la función
resetPositionque permite restablecer la posición del sprite a su posición inicial.@Override public void resetPosition() { position.x = INITIAL_PADDLE_X; position.y = INITIAL_PADDLE_Y; dx = 0; dy = 0; }Define la función
changeTypeque permite cambiar el tipo de paleta.public void changeType(PaddleType type) { this.type = type; setSize(type.getSize()); this.imageName = type.getImageName(); }Verifica la existencia de la función
getTypeque permite obtener el tipo de paleta.public PaddleType getType() { return type; }Verifica que el enumerado
PaddleTypese vea de la siguiente manera:package org.brick_breaker.sprites.paddles; import java.awt.*; public enum PaddleType { SMALL(new Dimension(32, 16)), MEDIUM(new Dimension(64, 16)), LARGE(new Dimension(128, 16)), SHOOTER(new Dimension(64, 16)); private final Dimension size; PaddleType(Dimension size) { this.size = size; } public Dimension getSize() { return size; } public String getImageName() { return name().toLowerCase() + "Paddle"; } }
Actualizando la clase Brick.java
Verifica que la clase
Brickextienda deSpritee implemente la interfazResettableySerializable.Verifica que la clase cuente con los siguientes atributos:
public final static int BRICK_WIDTH = 42; public final static int BRICK_HEIGHT = 20; public final static Dimension BRICK_SIZE = new Dimension(BRICK_WIDTH, BRICK_HEIGHT); private final BrickType type; private int life; private boolean destroyed;Verifica la existencia del siguiente constructor:
public Brick(Point position, String imageName, BrickType type) { super(position, imageName, BRICK_SIZE); this.type = type; this.life = type.getLife(); this.destroyed = false; }Verifica la existencia de la función
addImageToCacheque permite almacenar la imagen en caché de las siguiente manera:@Override protected void addImageToCache() { if (type != null) type.loadSprite(imageName); }Verifica la existencia de la función
hitque permite golpear el ladrillo.public void hit() { life--; if (life <= 0) { destroyed = true; } }Verifica la existencia de la existencia de los getters y setters para los atributos
lifeydestroyed.Verifica que el enumerado
BrickTypecuente con los siguientes atributos:int life: vida del ladrillo.int score: puntaje del ladrillo.
Verifica la existencia de la función
loadSpritede la siguiente manera:public void loadSprite(String imageName) { SpriteCache spriteCache = SpriteCache.getInstance(); BufferedImage image = SpriteLoader.loadImage(imageName + ".png"); spriteCache.addImage(imageName, image); }Verifica la existencia de los getters de los atributos
lifeyscore.Crea al menos 3 ladrillos:
BrickType.RED: ladrillo rojo.BrickType.GREEN: ladrillo verde.BrickType.BLUE: ladrillo azul.
Consideraciones finales
Recuerda que estos componentes serán usados posteriormente para dibujar los elementos en el área de juego.
Recuerda adecuar la clase
FileManagerpara que cargue los elementos de la claseSpritey sus respectivos atributos al momento de crear el archivo del nivel.