En este pequeño programa se muestra como se aproxima un juego de break ball, (la pelota que rebota en la ventana), donde se puede simular un juego, este no esta bien estructurado pero podríamos darnos cuenta de como se puede realizar uno con mayor precisión. Este esta hecho con las medidas exactas de la ventana, pero se puede modificar al gusto y ponerle las barras para que el juego se torne mas entretenido.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Rebote extends JFrame implements KeyListener{
private JPanel panel = new JPanel();
private JLabel pelota = new JLabel("");
private JLabel barra = new JLabel("");
private ImageIcon iPelota = new ImageIcon(getClass().getResource("bola.gif"));
private ImageIcon iBarra = new ImageIcon(getClass().getResource("barra.gif"));
private int posX = 150;
private int pelX = 180;
private int pelY = 357;
private int dir = 0;
private int cont = 0;
private void Model(){
pelota.setIcon(iPelota);
barra.setIcon(iBarra);
}
private void Bounds(){
pelota.setBounds(pelX,pelY,50,50);
barra.setBounds(posX,400,100,24);
}
public Rebote(){
setTitle("NIMADRES");
Thread r = new Thread(new Rebotar());
//setLayout(null);
setBounds(200,100,400,500);
setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
setVisible(true);
panel.setBounds(0,0,400,500);
panel.setBackground(Color.black);
panel.add(pelota);
panel.add(barra);
add(panel);
Model();
Bounds();
add(new Paint(), java.awt.BorderLayout.CENTER);
r.start();
addKeyListener(this);
setResizable(false);
}
class Rebotar implements Runnable{
@Override
public void run(){
int nivel = 10;
int dificultad = 1;
int contador = 0;
while(true){
try {
if(nivel < 1)
nivel = 1;
Thread.sleep(nivel);
if(dir == 1){
pelX--;
pelY--;
if(pelX == 0)
dir = 2;
if(pelY == 0)
dir = 4;
}
if (dir == 2){
pelX++;
pelY--;
if (pelX == 350)
dir = 1;
if (pelY == 0)
dir = 3;
}
if (dir == 3){
//cuando va de derecha a izquierda
pelX++;
pelY++;
if (pelX == 350)
dir = 4;
if ((pelY == barra.getY()-40)){
if((pelX >= posX - 25)&&(pelX <= posX + 100) ){
contador++;
if (contador == 3){
dificultad++;
nivel --;
}
if((pelX > posX + 25) && (pelX <= pelX + 100))
dir = 2;
else
dir = 1;
}
}
if(pelY == 425){
gameOver(dificultad);
}
}
if (dir == 4){
//cuando va callendo de izquierda a derecha
pelX--;
pelY++;
if (pelX == 0)
dir = 3;
if ((pelY == barra.getY()-40)){
if((pelX >= posX - 50)&&(pelX <= posX + 100)){
contador++;
if (contador == 3){
dificultad++;
nivel --;
}
if(pelX >= posX - 50 && pelX <=posX + 50)
dir = 1;
else
dir = 2;
}
}
if(pelY == 425){
gameOver(dificultad);
}
}
}
catch (InterruptedException ex) {
}
Bounds();
if(contador == 3)
contador = 0;
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
cont++;
switch (e.getKeyCode()) {
case 32:
if(cont == 1)
dir = 1;
break;
case 37:
if(posX > 0)
posX -= 10;
if(cont == 1)
dir = 1;
break;
case 39:
if(posX < 290)
posX += 10;
if(cont == 1)
dir = 2;
break;
}
Bounds();
//e.getKeyCode();
//System.out.println(posX);
}
@Override
public void keyReleased(KeyEvent e) {
}
public void gameOver(int dificultad){
panel.setVisible(false);
repaint();
if (dificultad > 10)
dificultad = 10;
System.out.println("Mierda Tio llegaste al nivel: "+ dificultad);
//System.exit(0);
}
class Paint extends JPanel {
public Paint(){
setBackground(Color.black);
}
public void paint(Graphics g) {
Dimension d = this.getPreferredSize();
int fontSize = 40;
g.setFont(new Font("TimesRoman", Font.PLAIN, fontSize));
g.setColor(Color.red);
g.drawString("GAME OVER",80,200);
}
}
}
Después tenemos el archivo Main.java, que nos ayudara a ejecutar nuestra aplicacion, nota al empezar el juego, la pelota avanzara muy lento, ya que se supone que tiene 10 niveles de dificultad, en el cual por cada tres toques a la barra, aunmentara a 1 nivel. int nivel = 10; si quiern que empiece mas rapido, solo cambia de 10 a 1 y listo,
public class Main{
public static void main(String args[]){
java.awt.EventQueue.invokeLater(new Runnable(){
@Override
public void run(){
new Rebote().setVisible(true);
}
});
}
}
Aquí les dejo las imágenes que yo utilice, de igual manera pueden utilizar otras, solo es necesario guardarlas en la misma carpeta para que todo funcione bien