Solved

Switching images on keypresses in my Java game

Posted on 2004-08-29
27
638 Views
Last Modified: 2010-03-31
Hi everyone,

As most of you will probably be aware I am making a java game and I want to be able to change an image when the arrow keys are pressed in the game.

The images would replace the head image in my game so that it will be pointing in the direction of movement.  

The images I would like to use would be:

snakeheadleft.gif  
snakeheadright.gif
snakeheaddown.gif
snakeheadup.gif

The code for my game follows with my game class and snake class, thank you all very much
----------------------------------------------------------------------------------------------------------

JaySnake:::

import java.awt.* ;
import java.awt.event.* ;
import java.awt.image.* ;
import javax.imageio.* ;
import java.io.* ;
import javax.swing.* ;
import java.util.*;
import java.applet.AudioClip;
import java.applet.Applet;
import java.net.URL;

public class JaySnake extends JFrame implements ActionListener
{
  class Game extends JPanel implements Runnable
  {
        private BufferedImage backBuffer ;
    private Graphics myBackBuffer ;
   
/*The HashMap  class is roughly equivalent to Hashtable,
 *except that it is unsynchronized and permits nulls*/
    HashMap imageMap = new HashMap(4);
     public int waitTime = 65;

/*Method used to get text from background menu items and set background image from that*/
     public void setImage(String fileName) throws Exception
     {
          if (fileName.equals("backgrounds/default")) //Sets background to default image
          {
                    backgroundImage = ImageIO.read( new File( "backgrounds/default.jpg" ) );
         }
         else if (fileName.equals("Long grass")) //Sets background to longGrass image
         {
                   backgroundImage = ImageIO.read( new File( "backgrounds/longGrass.jpg" ) );
         }
         else if (fileName.equals("Yellow Sand"))//Sets background to sand image
         {
                  backgroundImage = ImageIO.read( new File( "backgrounds/sand.jpg" ) );
         }
         
         else if (fileName.equals("Blue Glass")) //Sets background to blueGrass image
         {
                  backgroundImage = ImageIO.read( new File( "backgrounds/blueGlass.jpg" ) );
         }
         else //Sets to default if none mathced
         {
                   backgroundImage = ImageIO.read( new File( "backgrounds/default.jpg" ) );
         }
     }
     
    public Game()
    {
            
  /******Try read in default backgroundImage file and catch any exception*/
      try //first read in default image
      {
            backgroundImage = ImageIO.read( new File( "backgrounds/default.jpg" ) );
            clip = Applet.newAudioClip(new URL("file:" + System.getProperty("user.dir") + "/sounds/music.au"));
            appleEaten = Applet.newAudioClip(new URL("file:" + System.getProperty("user.dir") + "/sounds/apple.au"));
      }
      catch( IOException e )
      {
        System.out.println(e) ;
      }
     
      backBuffer = new BufferedImage( DISPLAY_W, DISPLAY_H, BufferedImage.TYPE_INT_RGB ) ;
      myBackBuffer = backBuffer.getGraphics() ;

//set up the menubar
      menubar = new JMenuBar();
      setJMenuBar(menubar);

    }

    public void paintComponent( Graphics g )
    {
      g.drawImage( backBuffer, DISPLAY_X, DISPLAY_Y, null ) ;
    }

     public void paint( Graphics g )
    {          
            super.paint(g);
        g.drawImage(backgroundImage,0,0,null);

          //Draw green scoreboard and black rects
        g.setColor(Color.black);
        g.fillRect(1,540,598,20);
        g.fillRect(1,34,598,6);
        g.setColor(Color.white);
        g.drawRoundRect(1,0,598,32,10,10);

          //Calls Snake paint method
          if (snake != null)
             snake.draw(g);
                  
    }
   
    public void run()
    {
      //     1000/25 Frames Per Second = 40millisecond delay
      int delayTime = 1000 / 25 ;

      Thread thisThread = Thread.currentThread() ;
      while( running )
      {
        //startTime = System.currentTimeMillis() ;
        // render to back buffer now
        render( myBackBuffer ) ;

        repaint() ;
        //  handle frame rate
        //elapsedTime = System.currentTimeMillis() - startTime ;
        //waitTime = Math.max( delayTime - elapsedTime, 5 ) ;

        try
        {
               Thread.sleep( waitTime ) ;
        }
        catch( InterruptedException e )
        {}
      }
      System.out.println( "Program Exited" ) ;
    }

   
  }

  private Thread gamePlay ;
  private boolean running = true ;
  private Game game ;

  private final int DISPLAY_X ; // value assigned in constructor
  private final int DISPLAY_Y ; // value assigned in constructor

  private static final int DISPLAY_W = 610 ;
  private static final int DISPLAY_H = 610 ;

  int size, hsize = 0, score1 = 0, score2 = 0, highscore = 0 ;

  /****Creates JMenuBar */
  private JMenuBar menubar ;
  /****Creates JMenu to house items */
  private JMenu gameMenu = new JMenu( "Game" ) ;
  private JMenuItem gameStart = new JMenuItem( "Start" ) ;
  private JMenuItem gameQuit = new JMenuItem( "Quit" ) ;

  private JMenu bgMenu = new JMenu( "Backgrounds" ) ;
  private ButtonGroup bgGroup = new ButtonGroup() ;
  private JRadioButtonMenuItem bg1 = new JRadioButtonMenuItem( "Default" ) ;
  private JRadioButtonMenuItem bg2 = new JRadioButtonMenuItem( "Long grass" ) ;
  private JRadioButtonMenuItem bg3 = new JRadioButtonMenuItem( "Yellow Sand" ) ;
  private JRadioButtonMenuItem bg4 = new JRadioButtonMenuItem( "Blue Glass" ) ;

  private JMenu soundMenu = new JMenu( "Enable sounds" ) ;
  private JCheckBoxMenuItem soundMusic = new JCheckBoxMenuItem( "Music" ) ;
  private JCheckBoxMenuItem soundSound = new JCheckBoxMenuItem( "Sounds" ) ;

  private JMenu helpMenu = new JMenu( "Help" ) ;
  private JMenuItem userInstruct = new JMenuItem( "User Instructions" ) ;
  private JMenuItem helpAbout = new JMenuItem( "About" ) ;

  /******JaySnake constructor*/
  public JaySnake()
  {
    setResizable( false ) ;
    game = new Game();
    getContentPane().add( game, BorderLayout.CENTER ) ;
    this.setJMenuBar( menubar );
              menubar.add( gameMenu ) ;
              gameMenu.setIcon(new ImageIcon("menuicons/start.gif"));
    gameMenu.add( gameStart ) ;
    gameStart.setIcon(new ImageIcon("menuicons/play.gif"));
     // ActionListener to quit the game when quit is clicked
    gameStart.addActionListener( new ActionListener(){  
   
          public void actionPerformed( ActionEvent e )
          {
             String name = new String();
             name = JOptionPane.showInputDialog( "Please enter your name" );
             snake = new Snake(JaySnake.this, name, (soundForApple ? appleEaten : null));
          }
     });
     
    gameMenu.add( gameQuit ) ;
    gameQuit.setIcon(new ImageIcon("menuicons/quit.gif"));

    // ActionListener to quit the game when quit is clicked
    gameQuit.addActionListener( new ActionListener(){  
          public void actionPerformed( ActionEvent e )
         {
             System.exit( 0 );
          }
     });  
     
                                               
/*Background selection menubar setup adding actionlisteners*/                        
    menubar.add( bgMenu ) ;
    bgMenu.setIcon(new ImageIcon("menuicons/backgrounds.gif"));
    bgMenu.add( bg1 ); bg1.addActionListener(this);
    bgMenu.add( bg2 ); bg2.addActionListener(this);
    bgMenu.add( bg3 ); bg3.addActionListener(this);
    bgMenu.add( bg4 ); bg4.addActionListener(this);
/* "bgGroup"  groups menu items for background together*/
         bgGroup.add( bg1 );      bgGroup.add( bg2 );
         bgGroup.add( bg3 );        bgGroup.add( bg4 );

     /*Sounds menubar selection with actionListeners*/    
    menubar.add( soundMenu );
    soundMenu.setIcon(new ImageIcon("menuicons/speaker.gif"));
    soundMusic.setState(true);
    soundMenu.add( soundMusic );
    soundMenu.add( soundSound ) ;
   
    soundSound.setState(true);

     /* Listeners */
     soundMusic.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e)
                 {
                    try
                    {
                         JCheckBoxMenuItem source = (JCheckBoxMenuItem)(e.getSource());
                         System.out.println(source.getText());
                         if (source.getState())
                         {
                              clip.loop();
                         }
                         else
                         {
                              clip.stop();
                         }
                         
                    }
                    catch (Exception ex)
                    {
                         System.out.println(ex);
                    }
                 }
          });
         
     soundSound.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e)
                 {
                    try
                    {
                         JCheckBoxMenuItem source = (JCheckBoxMenuItem)(e.getSource());
                         if (source.getState())
                         {
                                   soundForApple = true;
                                   snake.setAppleSound(appleEaten);
                         }
                         else
                         {
                                   soundForApple = false;
                                   snake.setAppleSound(null);
                         }
                    }
                    catch (Exception ex)
                    {
                         System.out.println(ex);
                    }
                 }
          });
     /* /Listeners */
     
    menubar.add( helpMenu ) ;
    helpMenu.setIcon(new ImageIcon("menuicons/helpmenu.gif"));
    helpMenu.add( userInstruct );
    userInstruct.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                System.out.println("Instructions button pressed");
                //Create new Jframe to view User instructions
                JFrame f = new JFrame();
                JEditorPane p = new JEditorPane("text/html", "");
                f.getContentPane().add(p); // was missing in the previous code snippet
                p.setEditable(false);
                URL instructions = getClass().getResource(
                        "instructions/index.html");
               
                try {
                    p.setPage(instructions);

                } catch (Exception ep) {
                    System.out.println("Not Got index.html");
                }

                f.setSize(265, 540);
               
                f.setVisible(true);

            }
        });

    helpMenu.add( helpAbout );
    helpAbout.addActionListener( new ActionListener(){  
             public void actionPerformed( ActionEvent e )
     {
//Create an instance of About class window
                   About dlg = new About( JaySnake.this );
                   Dimension dlgSize = dlg.getPreferredSize();
                   Dimension frmSize = getSize();
                   Point loc = getLocation();
                   dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height - dlgSize.height) / 2 + loc.y);
                   dlg.setModal(true);
                   dlg.pack();
                   dlg.show();
    }
     } ) ;

    addWindowListener( new WindowAdapter()
    {
      public void windowClosing( WindowEvent e )
      {
        dispose();
        System.exit( 0 ) ;
      }
    } ) ;

    Insets insets = getInsets() ;
    DISPLAY_X = insets.left ;
    DISPLAY_Y = insets.top ;
    resizeToInternalSize( DISPLAY_W, DISPLAY_H ) ;
  }

  public void actionPerformed(ActionEvent e)
  {
     try
     {
          JMenuItem source = (JMenuItem)(e.getSource());
          System.out.println(source.getText());
          game.setImage(source.getText());
     }
     catch (Exception ex)
     {
          System.out.println(ex);
     }
  }

  public void resizeToInternalSize( int internalWidth, int internalHeight )
  {
    Insets insets = getInsets() ;
    final int newWidth = internalWidth + insets.left + insets.right ;
    final int newHeight = internalHeight + insets.top + insets.bottom ;

    Runnable resize = new Runnable()
    {
      public void run()
      {
        setSize( newWidth, newHeight ) ;
      }
    } ;

    if( !SwingUtilities.isEventDispatchThread() )
    {
      try
      {
        SwingUtilities.invokeAndWait( resize ) ;
      }
      catch( Exception e )
      {}
    }
    else
      resize.run() ;

    validate() ;
  }

     public void playMusic()
     {
          clip.loop();
         
     }
     
  public void start()
  {
    Thread gamePlay = new Thread( game ) ;
    gamePlay.start() ;
  }
 
//**************************Main method *************************************
       public static void main(String [] arguments)
     {
         System.out.println( "Starting JaySnake........" ) ;
         final JaySnake app = new JaySnake() ;

//Sets the location on screenof the JFrame behind the splash screen
         app.setLocation(210, 80);
               
         app.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent keyevent) {
                //System.out.println("Test key press >>>>>>>>>>>>>>>>>>>>>>>>>>");
                app.snake.keyPressed(keyevent);
            }
        });
         app.setSize( DISPLAY_W, DISPLAY_H ) ;
         app.setTitle( "JaySnake Game" ) ;
         app.setVisible( true ) ;
         Splash splash = new Splash(app);
         
         new Thread(new Runnable()
              {
                   public void run()
                   {
                           try
                           {
                             app.playMusic();
                             Thread.sleep(200);
                        }
                        catch (InterruptedException e)
                        {
                             System.out.println(e);
                        }
                   }    
              }).start();
    }

/*Render method for graphics content*/
    public void render( Graphics g )
    {
     if( backgroundImage != null )
        g.drawImage( backgroundImage, 0, 0, this ) ;

/*Draw scoreboard and player details, sets color for score and player
 *fills rectangle and text white and draws another rectangle that is used
 *to highlight the playing area*/
      g.setColor( Color.black ) ;      /*sets color to black*/
      g.fillRect( 0, 0, 598, 32 ) ; /*fillsRectangle for scoreboard*/
      g.setColor( Color.white ) ;   /*sets color to white for text*/
/*Draws text and uses score variables*/
      g.drawString( "Player 1 score: " + score1, 10, 13 ) ;
      //g.drawString( "Player 2 score: " + score2, 10, 27 ) ;
      g.drawString( "High score: " + highscore, 510, 15 ) ;

     
    }

  /******declared class variables/containers*/
  private Image backgroundImage ;
  private Snake snake = null;
/* The musicclip to be played.*/
  private AudioClip clip = null;
/* The sound of the applet when eaten.*/
  private AudioClip appleEaten = null;
// Indicate if we want sound for eating the apple (options = true/false)
  private boolean soundForApple = true;
}

snake:::

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
import javax.swing.*;
import java.applet.AudioClip;


/*public class Snake implements ActionListener in
 *particular [CODE]KeyPressed[/CODE]*/

public class Snake implements ActionListener
{
/* AudioClip The sound of eating an apple*/
     AudioClip appleEaten = null;
     
/*class variable sp*/
    private JaySnake sp;
     /*Used for users name input from dialogue*/
    private String player;


/*int variable declarations*/
  private int size =3,
          dir,
          score1 =0,
          score2 = 0;
         

/*boolean state declarations*/
  boolean game = false,
          ate=false,
          gameplay=false,
          collide = false;
         
/*Array of points for location on the screen of snake and apples*/
          Point[] location = new Point[600];

          Point treat = new Point(12,7);

/*Constructor - passing snake class to app defined in class as sp*/
     public Snake(JaySnake app, String player, AudioClip appleEaten)
     {
             this.appleEaten = appleEaten;
          this.player = player;
          sp = app;

//initialise all points with 0
            for(int i=0; i<600; i++)
        location[i] = new Point(0,0);

          // Setting all starting points
          location[2].move(15,25);
          location[1].move(15,24);
          location[0].move(15,23);
          treat.move(1,6);

//try read in treat and food images
          try
          {
               food = ImageIO.read(new File("snakeimages/food.gif"));
               body = ImageIO.read(new File("snakeimages/snakebits.jpg"));
          }     catch(IOException e)
          {System.out.println(e);
          }

               try{ Thread.sleep(70); }
          catch(InterruptedException e) { }
     }

     public void setAppleSound(AudioClip clip)
     {
          this.appleEaten = clip;
     }
     
/* [code]public void actionPerformed[/code] on KeyPress repaint sp snake panel.*/
     public void actionPerformed(ActionEvent event)
     {
        sp.repaint();
     }

/*Snake class graphics method*/
    public void draw( Graphics g )
    {
          
          //Draw score board texts
        g.setColor(Color.green);
         g.drawString(player + "'s score: "+score1,10,13);
         g.drawString( "Top score: "+score2,500,15);
       
          //Draws the first treat onscreen
        g.drawImage(food,treat.x*20-20,treat.y*20-20,19,19,null);
       

          //Collison detection for treat
        if(gameplay)
        {
             if(location[0].x==treat.x && location[0].y==treat.y)
             {
                    if (appleEaten != null)
                  {
                       appleEaten.play();
                  }
                 
                  ate=true;
                  size++;
                  score1++;
             }
           
               // Drawing new head position, erasing last tale position
             if(location[size-1].x == treat.x && location[size-1].y == treat.y)
                  g.drawImage(food,treat.x*20-20,treat.y*20-20,19,19,null);
     
               //Move snake body parts based on cases of dir (direction)
             if(gameplay)
             {
                  for(int i=size; i>0; i--)
                       location[i].move(location[i-1].x, location[i-1].y);
     
                  switch(dir)
                  {
                       case 0: location[0].x = location[0].x+1; break;
                       case 1: location[0].x = location[0].x-1; break;
                       case 2: location[0].y = location[0].y-1; break;
                       case 3: location[0].y = location[0].y+1; break;
                  }
             }
     
               // Checking if had just eaten an treat, if yes - draw new treat location
             if( ate )
             {
                 ate = false;
                    //Math.randon generate new apple positions using the co-ordiantes
                 treat.x=(int)(Math.random()*30+1);
                 treat.y=(int)(Math.random()*25+3);
                    //print co-ordinateds if required
                    //System.out.println("treat.x = "+treat.x+" treat.y = " +treat.y);
                  g.drawImage(food,treat.x*20-20,treat.y*20-20,19,19,null);
                                   
             }
         }

          // Check for collison with walls and snake bits
        for(int i=3; i<size; i++)
             if(location[0].x == location[i].x && location[0].y == location[i].y)
                 {
                      gameplay = false;
                  restart();
                }
     
          //Walls collison
        if(((collide ||
                (dir==0 && location[0].x==31) || //Right co-ordinates
                  (dir==1 && location[0].x==0) ||   //Left co-ordinates
                  (dir==2 && location[0].y==2) ||  //Top  co-ordinates
                (dir==3 && location[0].y==28))))  //Bottom co-ordinates
            {
             gameplay = false;
                restart();
        }

          //Sets images for body
        for(int i=0; i<size; i++)
             g.drawImage(body,location[i].x*20-20,location[i].y*20-20,20,20,null);
     }//end snake draw method

     /*resets game settings including location of snake and apple.  Also updates
      *the Top score and resets player score*/
     public void restart()
     {
          System.out.println("restart");
         
       // Setting all starting points again
        if(score1>score2){
        score2 = score1;}
        score1 = 0;
        game = false;
        dir =0;
        size=3;
          //Move snake back to original position
        location[2].move(15,25);
        location[1].move(15,24);
        location[0].move(15,23);
          //Re generate new apple locations
        treat.x=(int)(Math.random()*30+1);
        treat.y=(int)(Math.random()*25+3);
       }

     /*If keys are presees up Arrow, Down Arrow, Left Arrow and Right Arrow
      *move snake to new location on grid */
     public void keyPressed(KeyEvent evt)
     {
        int key = evt.getKeyCode();
        if(key == KeyEvent.VK_RIGHT && location[1].x!=location[0].x+1) { dir=0; gameplay=true; }
        else if(key == KeyEvent.VK_LEFT && location[1].x!=location[0].x-1) { dir=1; gameplay=true;}
        else if(key == KeyEvent.VK_UP && location[1].y!=location[0].y-1) { dir=2; gameplay=true;}
        else if(key == KeyEvent.VK_DOWN && location[1].y!=location[0].y+1) { dir=3; gameplay=true;}
        else if(key == 112 || key == 1508)
        {
         gameplay=false;
          }
     }
  /*Image declarations treat and snake body parts */
  private Image food, body;
}//end class

pjcrooks2000
0
Comment
Question by:pjcrooks2000
  • 14
  • 5
  • 3
  • +3
27 Comments
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
G? CEHJ? Objects? TimYates? Javatm?  anyone about?
0
 
LVL 92

Expert Comment

by:objects
Comment Utility
too much code to easily tell what needs doing.

Assuming you are using a JLabel to display the image you need to call its setIcon() method to change the image used.
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
Hi Objects welcome online :)

Well ok in the Snake class I have the the switch statement for dir (direction) and I have the and the switch staement that chages the direction of the snake.  The snake movement is controlled by adding a new head position, body and removing the tail position therefore creating movement through the JaySnake thread.

I draw the body here

 //Sets images for body
        for(int i=0; i<size; i++)
             g.drawImage(body,location[i].x*20-20,location[i].y*20-20,20,20,null);
     }//end snake draw method

As you can see I am using the same image for the head and body, what I would like to do is have the head image change probably with the Switch statement to 4 possible gif files, basically the gif files will be the head of a snake pointing up,down,left and right.  

Does that explain it any better?  I am stuck as to how to do it  

Many thanks
0
 
LVL 92

Expert Comment

by:objects
Comment Utility
draw two images:

        for(int i=0; i<size; i++)
        {
             g.drawImage(head,headx, heady, headw, headh,null);
             g.drawImage(body, bodyx, bodyy, bodyw, bodyh,null);
        }
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
Hmmm where would I put that objects for it to be most effective ?
0
 
LVL 92

Expert Comment

by:objects
Comment Utility
whereever you currently draw the body.
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
Ok Sire i shall give it a whirl.... I will keep you posted, but it is a bit late here in the uk right now, so maybe I will continue with it tomorrow.

Thank you me ole chap!  
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
OK then i have done this to make it draw a different image for the head

//Draw images for body
        for(int i=0; i<1; i++)
             g.drawImage(head,location[i].x*20-20,location[i].y*20-20,20,20,null);
        for(int j=1; j<size; j++)
             g.drawImage(body,location[j].x*20-20,location[j].y*20-20,20,20,null);
     }//end snake draw method

But that does not sort out my problem with the direction, being able to change the image when the arrow keys are pressed, anymore help anyone?

0
 
LVL 92

Assisted Solution

by:objects
objects earned 100 total points
Comment Utility
now (if I understand correctly) you just need to display a different head image depending on the direction.

to do this you could make head an array of images indexed by direction.
That way to paint head in correct direction you would use:

       for(int i=0; i<1; i++)
             g.drawImage(head[dir],location[i].x*20-20,location[i].y*20-20,20,20,null);
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
That look svery useful... Hmm but now.. I think I will go to bed, I will square it off with you  later today :) .... Its 4:48 am tut tut tut ..... thanks Objects
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
How do I make dir an array of images ???
0
 
LVL 13

Assisted Solution

by:Webstorm
Webstorm earned 100 total points
Comment Utility
Hi pjcrooks2000,

>> How do I make dir an array of images ???
dir is only the index in the head array.

Image[] head=new Image[4];

Then when you load all the images:

head[0]=ImageIO.read(new File("snakeheadright.gif");
head[1]=ImageIO.read(new File("snakeheadleft.gif");
head[2]=ImageIO.read(new File("snakeheadup.gif");
head[3]=ImageIO.read(new File("snakeheaddown.gif");

0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
webstorm how does that relate to my direction statement.  I usr dir to switch direction.. many thanks  :)
0
Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

 
LVL 3

Assisted Solution

by:CI-Ia0s
CI-Ia0s earned 50 total points
Comment Utility
Create the array as webstorm suggested (make sure your body paint statement can access it). Then, change the int "dir" to the appropriate number whenever the matching key is pressed. i.e. When the right arrow key is pressed, dir = 0. That should do it (though objects and webstorm get the credit for the solution... I haven't done any image work beyond ImageIcon. :P)
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
heh ok right you are boss!   well I will give it a whirl.  However just in case I have a round gif that i am using for my snake head, that way it does not have to change direction.  But I would love to be able to change his wee head !
0
 
LVL 15

Expert Comment

by:Javatm
Comment Utility
If I'm correct you want to change the heads of the snake depending on the keypress right ?
0
 
LVL 15

Assisted Solution

by:Javatm
Javatm earned 50 total points
Comment Utility
If I'm correct here's what you need to do :

1.) Get the location of your snake's head in the array object which is the screen.
2.) On keypress change the head depending on what key was pressed.

You can actually create an array for heads like what webstorm said depending
on you style that you want.

Let me know if you have any questions !
Friend : Javatm
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
Just a bit confused as to how I can put it together thats all.... :)
0
 
LVL 92

Expert Comment

by:objects
Comment Utility
you already know the direction you're heading as far as i can see, so you should just need to reference the appropriate image from the array.
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
Maybe 3:25 am is not the best time to be trying to do this :)

0
 
LVL 15

Expert Comment

by:Javatm
Comment Utility
1st of all body image should be different from the head's image. As you press a key the head and body image should be running.
when a key is press again the direction will change in that case you have to change the direction of the head and body or better
yet replace the image w/ an image that is for that direction.

Hope that helps . . .
Javatm
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
Oakily doakily I will try see if it comes to me, actually I do have the direction body and head images set as different images.

At present the head is a circular image but the ones I have for head direction have eyes on them facing in all four directions,

I just need to work it our.. no problemo I will see what I can do with it...

Thanks all !
0
 
LVL 35

Accepted Solution

by:
girionis earned 200 total points
Comment Utility
Ok here it is the class with the proper snake heads:

import java.applet.AudioClip;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.* ;

/*public class Snake implements ActionListener in
 *particular [CODE]KeyPressed[/CODE]*/

public class Snake implements ActionListener
{

      Image[] head = new Image[4];

/*Constructor - passing snake class to app defined in class as sp*/
     public Snake(JaySnake app, String player, AudioClip appleEaten)
     {
             this.appleEaten = appleEaten;
          this.player = player;
          sp = app;

//initialise all points with 0
     for(int i=0; i<600; i++)
              location[i] = new Point(0,0);

/*Set all starting points for snake an apple*/
          location[2].move(15,25);
          location[1].move(15,24);
          location[0].move(15,23);
          fruit.move(1,6);

      /*Try catch block Used to read in snake images*/
          try
          {
               food = ImageIO.read(new File("snakeimages/food.gif"));
               body = ImageIO.read(new File("snakeimages/body.gif"));
               //head = ImageIO.read(new File("snakeimages/head.gif"));
                           head[0]=ImageIO.read(new File("snakeimages/headright.gif"));
                        head[1]=ImageIO.read(new File("snakeimages/headleft.gif"));
                        head[2]=ImageIO.read(new File("snakeimages/headup.gif"));
                        head[3]=ImageIO.read(new File("snakeimages/headdown.gif"));

          }    
         
          catch(IOException e)
          {
                System.out.println(e);
          }

     }

     public void setAppleSound(AudioClip clip)
     {
          this.appleEaten = clip;
     }
     
/* [code]public void actionPerformed[/code] on KeyPress repaint sp snake panel.*/
     public void actionPerformed(ActionEvent event)
     {
        sp.repaint();
     }

/*Snake class graphics method draw*/
    public void draw( Graphics g )
    {      
/*sets color to black*/
    g.setColor( Color.black ) ;      
    g.fillRect( 0, 0, 598, 32 ) ; /*fillsRectangle for scoreboard*/
    g.setColor( Color.white ) ;   /*sets color to white for text*/
/*Draw score board texts*/
    g.drawString(player + "'s score: "+score1,10,13);
    g.drawString( "Top score: "+score2,500,15);
/*draws the first apple on screen*/
    g.drawImage(food,fruit.x*20-20,fruit.y*20-20,19,19,null);
       
/*Collison detection for apple while gameplay is true*/
        if(gameplay)
        {
                if(location[0].x==fruit.x && location[0].y==fruit.y)
        {
                if (appleEaten != null)
          {
                appleEaten.play();
          }
                 
                ate=true;
                size++;
                score1++;
        }

/*Move snake parts based on cases of dir (direction)*/
        if(gameplay)
        {
               for(int i=size; i>0; i--)
                location[i].move(location[i-1].x, location[i-1].y);
     
        switch(dir)
              {
              case 0: location[0].x = location[0].x+1; break;
            case 1: location[0].x = location[0].x-1; break;
            case 2: location[0].y = location[0].y-1; break;
            case 3: location[0].y = location[0].y+1; break;
              }
        }
     
/*Check to see if eaten an apple, if yes - draw new fruit location*/
     if( ate)
     {                  
/*Math.randon generate new apple positions using the co-ordiantes*/
     fruit.x=(int)(Math.random()*30+1);
     fruit.y=(int)(Math.random()*25+3);
/* Uncomment to printout co ordinates if needed*/
//System.out.println("fruit.x = "+fruit.x+" fruit.y = " +fruit.y);
/*draw the apple*/
       g.drawImage(food,fruit.x*20-20,fruit.y*20-20,19,19,null);
/*Reset ate to false*/
     ate = false;
                                   
      }
     }

/*Check for collison with walls and snake bits*/
     for(int i=3; i<size; i++)
     
     if(location[0].x == location[i].x && location[0].y == location[i].y)
         
     {
       showCollideMessage();
       gameplay = false;
       restart();
     }
     
     
     
/*Check for walls collision*/
     if(((collide ||
              (dir==0 && location[0].x==31) || //Right co-ordinates
            (dir==1 && location[0].x==0) ||   //Left co-ordinates
            (dir==2 && location[0].y==2) ||  //Top  co-ordinates
            (dir==3 && location[0].y==28))))  //Bottom co-ordinates
            {
             showCollideMessage();      
             gameplay = false;
             restart();
              }


/*Draw image for snake head*/
        //for(int i=0; i<1; i++)
            System.out.println("dir: " + dir);
        g.drawImage(head[dir],location[0].x*20-20,location[0].y*20-20,20,20,null);
/*Draw images for snake body*/
        for(int j=1; j<size; j++)
             g.drawImage(body,location[j].x*20-20,location[j].y*20-20,20,20,null);
     }

/*resets game settings including location of snake and apple.  Also updates
*the Top score and resets player score
*/       public void showCollideMessage(){
      
      JOptionPane.showMessageDialog(null, "OOoh dear " + player + " looks like you crashed\n"+
                                                                 "Little Jay the snake remember to\n"+
                                                                 "watch those walls and your own tail\n"+
                                                                 "but you did score " + score1 + " points, Well done\n\n"+
                                                                 "Click ok and use the arrow keys to try\n"+
                                                                 "again or in the game press q to Quit");
      
      }
     public void restart()
     {           
/*Setting all starting points again*/
        if(score1>score2){
        score2 = score1;}
        score1 = 0;
        game = false;
        dir = 2;
        size=3;
/*Move snake back to original position*/
        location[2].move(15,25);
        location[1].move(15,24);
        location[0].move(15,23);
/*Re generate new apple locations*/
        fruit.x=(int)(Math.random()*30+1);
        fruit.y=(int)(Math.random()*25+3);
       }
/*If keys are presees up Arrow, Down Arrow, Left Arrow and Right Arrow
*move snake to new location on Ponits grid */
     public void keyPressed(KeyEvent evt)
     {
        int key = evt.getKeyCode();
        if(key == KeyEvent.VK_RIGHT && location[1].x!=location[0].x+1) { dir=0; gameplay=true; }
        else if(key == KeyEvent.VK_LEFT && location[1].x!=location[0].x-1) { dir=1; gameplay=true;}
        else if(key == KeyEvent.VK_UP && location[1].y!=location[0].y-1) { dir=2; gameplay=true;}
        else if(key == KeyEvent.VK_DOWN && location[1].y!=location[0].y+1) { dir=3; gameplay=true;}
        else if(key == 112 || key == 1508)
        {
         gameplay=false;
          }
     }
     
     
/* AudioClip The sound of eating an apple*/
  AudioClip appleEaten = null;
     
/*class variable sp*/
  private JaySnake sp;
        
/*Used for users name input from dialogue*/
  private String player;

/*int variable declarations*/
  public int       size =3,
                           score1 =0,
                           dir = 2,
                           score2 = 0;
                           
/*boolean state declarations*/
  boolean       game = false,
                      ate=false,
                      gameplay=false,
                      collide = false;
         
/*Array of points for location on the screen of snake and apples*/
    Point[] location = new Point[600];
    Point fruit = new Point(12,7);
   
/*Image declarations fruit and snake body parts */
  private Image food, body;//, head;
 
}//end class


Note that I didn't do anything new. I just copied/pasted the solution already provided by other experts and put it all together. Points should be awarded to those who made all the comments before me :)
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
Thats fantastic girionis, thanks to all other with the help too :)
0
 
LVL 35

Expert Comment

by:girionis
Comment Utility
:)
0
 
LVL 13

Expert Comment

by:Webstorm
Comment Utility
:-)
0
 
LVL 8

Author Comment

by:pjcrooks2000
Comment Utility
:)
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

An old method to applying the Singleton pattern in your Java code is to check if a static instance, defined in the same class that needs to be instantiated once and only once, is null and then create a new instance; otherwise, the pre-existing insta…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

6 Experts available now in Live!

Get 1:1 Help Now