Sunday, November 8, 2009

Programming the pong game with Java

The game has only two class. One JFrame to show the game window and one JPane to render the Graphics

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MainWin extends JFrame {

    private JPanel jContentPane = null;
   
    private GamePanel panel = null; // This is the panel of the game class
   
    private GamePanel getPanel() {
        if (panel == null) {
            panel = new GamePanel(); // The panel is created
        }
        return panel;
    }

    /**
     * This is the default constructor
     */
    public Main() {
        super();
        initialize();
        this.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent evt) {
                formKeyPressed(evt);
            }
            public void keyReleased(KeyEvent evt) {
                formKeyReleased(evt);
            }
        });
       
    }
   
    private void formKeyPressed(KeyEvent evt)
    {
        panel.keyPressed(evt);
    }
    private void formKeyReleased(KeyEvent evt)
    {
        panel.keyReleased(evt);
    }

    private void initialize() {
        this.setResizable(false);
        this.setBounds(new Rectangle(312, 184, 250, 250)); // Position on the desktop
        this.setMinimumSize(new Dimension(250, 250));
        this.setMaximumSize(new Dimension(250, 250));
        this.setContentPane(getJContentPane());
        this.setTitle("Pong");
    }
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getPanel(), BorderLayout.CENTER);
        }
        return jContentPane;
    }
   
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Main thisClass = new Main();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }
}
 The second class contains the code for the game logic and the game rendering
import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.*;


public class GamePanel extends JPanel implements Runnable {
   
    private static final long serialVersionUID = 1L;
        // Positions on X and Y for the ball, player 1 and player 2
    private int pelotaX = 10, pelotaY = 100, jug1X=10, jug1Y=100, jug2X=230, jug2Y=100;
    Thread hilo;
    int derecha=5; // to the right
    int izquierda= -5; //to the left
    int arriba=5; // upward
    int abajo= -5; // down
    int ancho, alto; // Width and height of the ball
    // Scores
    int contPlay1=0, contPlay2=0;
    boolean player1FlagArr,player1FlagAba, player2FlagArr, player2FlagAba;
    boolean juego, gameOver;
   
    public GamePanel(){
        juego=true;
        hilo=new Thread(this);
        hilo.start();
    }
   
    // Draw ball and ships
    public void paintComponent(Graphics gc){
        setOpaque(false);
        super.paintComponent(gc);
       
        // Draw ball
        gc.setColor(Color.black);
        gc.fillOval(pelotaX, pelotaY, 8,8);
       
        // Draw ships
        gc.fillRect(jug1X, jug1Y, 10, 25);
        gc.fillRect(jug2X, jug2Y, 10, 25);
       
        //Draw scores
        gc.drawString("Jugador1: "+contPlay1, 25, 10);
        gc.drawString("Jugador2: "+contPlay2, 150, 10);
       
        if(gameOver)
            gc.drawString("Game Over", 100, 125);
    }
   
    // Positions on X and Y for the ball
    public void dibujarPelota (int nx, int ny)
    {
        pelotaX= nx;
        pelotaY= ny;
        this.ancho=this.getWidth();
        this.alto=this.getHeight();
        repaint();
    }
   
    // Here we receive from the game container class the key pressed
    public void keyPressed(KeyEvent evt)
    {
        switch(evt.getKeyCode())
        {
            // Move ship 1
            case KeyEvent.VK_W :
                player1FlagArr = true;
                break;
            case KeyEvent.VK_S :
                player1FlagAba = true;
                break;
                       
            // Move ship 2
            case KeyEvent.VK_UP:
                player2FlagArr=true;
                break;
           case KeyEvent.VK_DOWN:
               player2FlagAba=true;
                break;
        }
    }
   
    //    Here we receive from the game container class the key released
    public void keyReleased(KeyEvent evt)
    {
        switch(evt.getKeyCode())
        {
            // Mover Nave1
            case KeyEvent.VK_W :
                player1FlagArr = false;
                break;
            case KeyEvent.VK_S :
                player1FlagAba = false;
                break;
                       
            // Mover nave 2
            case KeyEvent.VK_UP:
                player2FlagArr=false;
                break;
            case KeyEvent.VK_DOWN:
               player2FlagAba=false;
                break;
        }
    }
   
    // Move player 1
    public void moverPlayer1()
    {
        if (player1FlagArr == true && jug1Y >= 0)
            jug1Y += abajo;
        if (player1FlagAba == true && jug1Y <= (this.getHeight()-25))
            jug1Y += arriba;
        dibujarPlayer1(jug1X, jug1Y);
    }
   
    // Move player 2
    public void moverPlayer2()
    {
        if (player2FlagArr == true && jug2Y >= 0)
            jug2Y += abajo;
        if (player2FlagAba == true && jug2Y <= (this.getHeight()-25))
            jug2Y += arriba;
        dibujarPlayer2(jug2X, jug2Y);
    }
   
    // Position on Y for the player 1
    public void dibujarPlayer1(int x, int y){
        this.jug1X=x;
        this.jug1Y=y;
        repaint();
    }
    // Position on Y for the player 2  
    public void dibujarPlayer2(int x, int y){
        this.jug2X=x;
        this.jug2Y=y;
        repaint();
    }
   
    public void run() {
        // TODO Auto-generated method stub
        boolean izqDer=false;
        boolean arrAba=false;
       
        while(true){
           
            if(juego){
           
            // The ball move from left to right
               if (izqDer)
            {
                // a la derecha
                pelotaX += derecha;
                if (pelotaX >= (ancho - 8))
                    izqDer= false;
            }
            else
            {
                // a la izquierda
                pelotaX += izquierda;
                if ( pelotaX <= 0)
                    izqDer =  true;
            }
              
              
            // The ball moves from up to down
               if (arrAba)
            {
                // hacia arriba
                pelotaY += arriba;
                if (pelotaY >= (alto - 8))
                    arrAba= false;
                   
            }
            else
            {
                // hacia abajo
                pelotaY += abajo;
                if ( pelotaY <= 0)
                    arrAba =  true;
            }
               dibujarPelota(pelotaX, pelotaY);
              
            // Delay
            try
            {
                Thread.sleep(50);
            }
            catch(InterruptedException ex)
            {
               
            }
           
            // Move player 1
            moverPlayer1();
           
            // Move player 2
            moverPlayer2();
           
            // The score of the player 1 increase
            if (pelotaX >= (ancho - 8))
                contPlay1++;
                           
            // The score of the player 2 increase
            if ( pelotaX == 0)
                contPlay2++;
                                       
            // Game over. Here you can change 6 to any value
                        // When the score reach to the value, the game will end
            if(contPlay1==6 || contPlay2==6){
                juego=false;
                gameOver=true;
            }
           
            // The ball stroke with the player 1
            if(pelotaX==jug1X+10 && pelotaY>=jug1Y && pelotaY<=(jug1Y+25))
                izqDer=true;
           
            // The ball stroke with the player 2
            if(pelotaX==(jug2X-5) && pelotaY>=jug2Y && pelotaY<=(jug2Y+25))
                izqDer=false;
            }
        }
    }
   
}

No comments:

Post a Comment