package invaders101.spritesystem.test;
import invaders101.spritesystem.Sprite;
import invaders101.entities.BaseEntity;
import invaders101.spritesystem.ImageCache;
import invaders101.interfaces.Drawable;
import invaders101.interfaces.Trackable;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class AlienShipTest extends JPanel {
Sprite sprite;
/** Estrategia para la gestion del buffer, permite usar page flipping acelerado */
private BufferStrategy strategy;
/** True si el juego está actualmente "corriendo" */
private boolean gameRunning = true;
private boolean logicRequiredThisLoop = false;
private String title;
/** Lista de todas las entidades existentes en el juego */
private ArrayList<BaseEntity> entities = new ArrayList();
/** Lista de las entidades a remover del juego en el actual loop */
private ArrayList removeList = new ArrayList();
//Constructor del juego
public AlienShipTest(String title) {
// Crea el JFrame que contendrá el juego
this.title = title;
JFrame container = new JFrame(this.title);
// Asigna propiedades de dimensión al área del juego
JPanel panel = (JPanel) container.getContentPane();
panel.setPreferredSize(new Dimension(800, 600));
panel.setLayout(null);
// Configura el tamaño de Game y lo inserta en el JPanel de contenido
this.setBounds(0, 0, 800, 600);
panel.add(this);
// Desactiva el llamado a repaint automático. Los llamados
// a paint serán hechos manualmente en modo acelerado
this.setIgnoreRepaint(true);
// Hace que la ventana sea visible
container.pack();
container.setResizable(false);
container.setVisible(true);
// Añade un listener para que el programa se cierre cuando el
// usuario cierre la ventana
container.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
// agrega un sistema para las entradas del teclado
// KeyInputHandler maneja la entrada del teclado
//this.addKeyListener(keyInputHandler = new KeyInputHandler(this));
// solicita el foco de atencion para que se capturen los key events
requestFocus();
// crea el buffering strategy el cual va a permitir
// manejar los gráficos acelerados
// el parametro 2 son los buffers a utilizar
container.createBufferStrategy(2);
strategy = container.getBufferStrategy();
}
/**
* The main game loop. This loop is running during all game
* play as is responsible for the following activities:
* <p>
* - Working out the speed of the game loop to update moves
* - Moving the game entities
* - Drawing the screen contents (entities, text)
* - Updating game events
* - Checking Input
* <p>
*/
public void doGameLoop() {
this.addSprite();
long lastLoopTime = System.currentTimeMillis();
// Mantiene el loop principal hasta que termine el juego
while (gameRunning) {
// Calcula la cantidad de segundos desde el último ciclo
long delta = System.currentTimeMillis() - lastLoopTime;
lastLoopTime = System.currentTimeMillis();
this.draw();
this.updateEntities(delta);
this.computeCollisions();
// remove any entity that has been marked for clear up
entities.removeAll(removeList);
removeList.clear();
// finally pause for a bit. Note: this should run us at about
// 100 fps but on windows this might vary each loop due to
// a bad implementation of timer
try {
Thread.sleep(10);
} catch (Exception e) {
}
}
}
private void computeCollisions() {
}
private void updateEntities(long delta) {
// if a game event has indicated that game logic should
// be resolved, cycle round every entity requesting that
// their personal logic should be considered.
if (logicRequiredThisLoop) {
for (int i = 0; i < entities.size(); i++) {
BaseEntity entity = entities.get(i);
entity.update(delta);
}
logicRequiredThisLoop = false;
}
sprite.update(delta);
}
private void draw() {
//Recupera el contexto gráfico del juego
//Crea un contexto grafico para el drawing buffer
Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, 800, 600);
// cycle round drawing all the entities we have in the game
for (int i = 0; i < entities.size(); i++) {
Object entity = entities.get(i);
if (entity instanceof Drawable) {
((Drawable)entity).draw(g);
}
}
sprite.draw(g);
//Terminada la etapa de dibujo, limpia los gràficos
//y muestra los gráficos del back buffer
g.dispose();
strategy.show();
}
public void addSprite() {
Image image = ImageCache.getInstance().getImage("sprites/alien.png");
Trackable trackable = new Trackable(){
public float getX() {
return 100;
}
public float getY() {
return 100;
}
};
// sprite = new AnimatedSprite(
// trackable,
// true,
// 50, 0, 0, 4, 1, 42, 42, 0, 0, 1 , image);
sprite = new Sprite(
trackable,
true,
128, 0, 0, 6, 1, 46, 46, 0, 0, 2, image);
sprite.setScale(0.9);
}
public static void main(String[] args) {
AlienShipTest test = new AlienShipTest("Test");
test.doGameLoop();
}
}