www.webdeveloper.com
Results 1 to 3 of 3

Thread: Writing a game of pong.

Hybrid View

  1. #1
    Join Date
    May 2012
    Posts
    12

    Writing a game of pong.

    Basically, I have been set an assignment but I am really out of my depth. Pretty much kind of struggling to learn all the languages I am learning atm (C, C++, java, javascript, css, html) and keep up with all of them. Java is my main downfall really, I have been going through tutorials and bits of pieces of the web but really struggling to get my head around it.

    I am not expecting someone to use their time to write me a bunch of code, but need a real pointer in the right direction or some kind of decent tutorials that relate to the framework code I am supplied with.

    The code is below compiles and shows a basic ball running across a screen (like it would in pong)

    Code:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import java.awt.Color;
    /*
     * Note If you change S (Speed) collision detection will be
     *      more complex as the ball edge may be within the bat
     *      Ignores concurrency issues (x, y, x_inc, y_inc access)
     */
    
    class Main
    {
      public static void main( String args[] ) // 
      {                                        // 
        System.out.println("Application");
        Application app = new Application();
        app.setVisible(true);
        app.run();
      }                                        // 
    }
    
    class Application extends JFrame            // So graphical 
    {
      private static final int H = 600;         // Height of window 
      private static final int W = 800;         // Width  of window 
    
      public Application()
      {
        setSize( W, H );                        // Size of application 
        addKeyListener( new Transaction() );    // Called when key press 
        setDefaultCloseOperation(EXIT_ON_CLOSE);
      }
    
    
      public void update( Graphics g )          // Called by repaint 
      {                                         // 
        drawPicture( (Graphics2D) g );          // Draw Picture 
      }
    
      public void paint( Graphics g )           // When 'Window' is first 
      {                                         //  shown or damaged 
        drawPicture( (Graphics2D) g );          // Draw Picture 
      }
    
      private Dimension     theAD;              // Alternate Dimension 
      private BufferedImage theAI;              // Alternate Image 
      private Graphics2D    theAG;              // Alternate Graphics 
    
      public void drawPicture( Graphics2D g )   // Double buffer 
      {                                         //  allow re-size 
        Dimension d    = getSize();             // Size of curr. image 
    
        if (  ( theAG == null )  ||
              ( d.width  != theAD.width ) ||
              ( d.height != theAD.height ) )
        {                                       // New size 
          theAD = d;
          theAI = (BufferedImage) createImage( d.width, d.height );
          theAG = theAI.createGraphics();
          AffineTransform at = new AffineTransform();
          at.setToIdentity();
          at.scale( ((double)d.width)/W, ((double)d.height)/H );
          theAG.transform(at);
        }
    
        drawActualPicture( theAG );             // Draw Actual Picture 
        g.drawImage( theAI, 0, 0, this );       //  Display on screen 
      }
    
      // The ball position and how to increment to next position 
    
      private int x = W/2, x_inc = 1;
      private int y = H/2, y_inc = 1;
    
      // Called on key press  
    
      class Transaction implements KeyListener  // When character typed 
      {
        public void keyPressed(KeyEvent e)      // Obey this method 
        {
         // Key typed includes specials 
         switch ( e.getKeyCode() )              // Character is 
         {
           case KeyEvent.VK_LEFT:               // Left Arrow 
             x_inc = -1;
             break;
           case KeyEvent.VK_RIGHT:              // Right arrow 
             x_inc = 1;
             break;
           case KeyEvent.VK_UP:                 // Up arrow 
             y_inc = -1;
             break;
           case KeyEvent.VK_DOWN:               // Down arrow 
             y_inc = 1;
             break;
          }
          // x,y could send to a server instead of calling  
          repaint();                            // Call update method 
        }
    
        public void keyReleased(KeyEvent e)
        {
          // Called on key release including specials 
        }
    
        public void keyTyped(KeyEvent e)
        {
          // Normal key typed 
          char c = e.getKeyChar();              // Typed 
          repaint();                            // Redraw screen 
        }
      }
    
      private static final int B = 6;           // Border offset 
      private static final int M = 26;          // Menu offset 
      private static final int BALL_SIZE = 10;  // Ball diameter 
      private static final int HALF_BALL_SIZE = BALL_SIZE/2;
    
      // Code called to draw the current state of the game 
    
      public void drawActualPicture( Graphics2D g )
      {
        // White background 
    
        g.setPaint( Color.white );
        g.fill( new Rectangle2D.Double( 0, 0, W, H ) );
    
        Font font = new Font("Calibri",Font.BOLD,24); 
        g.setFont( font ); 
    
        // Blue playing border 
    
        g.setPaint( Color.blue );              // Paint Colour 
        g.draw( new Rectangle2D.Double( B, M, W-B*2, H-M-B ) );
    
        // Display state of game 
    
        g.setPaint( Color.blue );
        FontMetrics fm = getFontMetrics( font );
        String fmt  = "Bouncing Ball x=%4d y = %4d";
        String text = String.format( fmt, x, y );
        g.drawString( text, W/2-fm.stringWidth(text)/2, M*2 );
    
        // The ball at the current x, y position (width, height) 
    
        g.setPaint( Color.red );
        g.fill( new Ellipse2D.Double( x-HALF_BALL_SIZE, y-HALF_BALL_SIZE, 
                                      BALL_SIZE,     BALL_SIZE ) );
      }
        
    
      // Main program loop 
    
      public void run()
      {
        final int S = 1;                    // Speed 1 - 5 
        try
        {
          while ( true )
          {
            if ( x >= W-B-HALF_BALL_SIZE ) x_inc = -1*S;
            if ( x <= 0+B+HALF_BALL_SIZE ) x_inc = 1*S;
            if ( y >= H-B-HALF_BALL_SIZE ) y_inc = -1*S;
            if ( y <= 0+M+HALF_BALL_SIZE ) y_inc = 1*S;
      
            x += x_inc;
            y += y_inc;
      
            repaint();                      // Now display 
    
            Thread.sleep( 10 );             // 100 Hz 
          }
        } catch ( Exception e ) {};
      }
    
    }
    The minimum objectives I would like to achieve are
    - Insert 2 paddles that can be moved using W/S and UP/DOWN which the ball collides with
    - Insert a score for both players at top of screen rather than current text
    - Change the background image to something over than a basic colour.

    Thankyou for any replies.


    In the meantime I will work on my C program in arduino to take random numbers and display them in binary

  2. #2
    Join Date
    May 2012
    Posts
    3
    - Insert 2 paddles that can be moved using W/S and UP/DOWN which the ball collides with

    Load the images of the paddles , make 2 int variables assign a value of ,lets say +5 and -5 to each of them.. when the player presses the Up arrow/W key change the current position of the paddle by +5 and when they press the down arrow/S change it by -5 and call the repaint() after that



    - Insert a score for both players at top of screen rather than current text

    for scores have 2 integers lets call them Score_Player1 and Score_player2
    and in your PaintComponent(Graphics g)
    Code:
     //Draw scores
    
                    gc.drawString("Player 1: "+Score_Player1, 25, 10);
    
                    gc.drawString("Player 2: "+Score_Player2, 150, 10);
    - Change the background image to something over than a basic colour.
    you can use either toolkit or the Image class
    here is an example of using them both
    Code:
     Image bgimg = Toolkit.getDefaultToolkit().createImage("background.jpg");
    and using the Image class
    Code:
    Image bgimg = ImageIO.read(new File("background.jpg");
    now since you are using swing, we need to override the paintComponent method of the JComponent, and draw the Image
    and here is how we do that
    Code:
    public void paintComponent(Graphics g)
    {
        // Draw the previously loaded image to Component.
        g.drawImage(bgimg, 0, 0, null);
    
        // Draw sprites, and other things.
        // ....
    }

  3. #3
    Join Date
    May 2012
    Posts
    12
    Cheers for the reply, I had found out about the paddles and getting them moving about, but the image and scores advice was quality thanks

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center



Recent Articles