Sawyer05
Sawyer05

Reputation: 1604

Java - Changing Image when keypressed

Java novice here!

I'm developing a small game that's just simply moving around the screen and will attack the little AI Rectangles i'm creating.

I have two GIF files pikachu.gif (yes, its a pokemon game), and pikready.gif.

I have implemented the KeyListener and everything and can get the Pikachu.gif to move around the frame with the arrow keys.

What i am wanting is, to change the image to the pikready.gif when I press down on the arrow keys, I have looked around online and can't seem to find the answer.

Code is below, anything commented out is different stuff i've tried.

As i said im a Java Novice so go easy on me!

package game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class PikachuAttack extends JFrame implements Runnable{

    Graphics dbg;
    Image dbImage;
    Image Pik1;
    static ImageIcon active;

    int x, y, xDirection, yDirection;

    public void run(){
        try{
            while(true){
                move();
                Thread.sleep(10);
            }
        }catch(Exception e){
            System.out.println("Uh-oh, something went wrong!.");
        }
    }

    private void move() {
        x += xDirection;
        y += yDirection;

    }

     public void setXDirection(int xdir) {
            xDirection = xdir;
        }

        public void setYDirection(int ydir) {
            yDirection = ydir;
        }


    // KEY COMMANDS //
      public class AL extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();

                if(keyCode == e.VK_LEFT) {
                    setXDirection(-1);
                }
                if(keyCode == e.VK_RIGHT) {
                    setXDirection(+1);
                }
                if(keyCode == e.VK_UP) {    
                    setYDirection(-1);
                }
                if(keyCode == e.VK_DOWN) {
                    setYDirection(+1);
                }   
                /*(if(keyCode == e.VK_LEFT | keyCode == e.VK_RIGHT | keyCode == e.VK_UP | keyCode == e.VK_DOWN){
                    active = new ImageIcon("C:\\Users\\Neil\\workspace\\MyOwnTutorials\\bin\\game\\pikready.gif");
                }else{
                    active = new ImageIcon("C:\\Users\\Neil\\workspace\\MyOwnTutorials\\bin\\game\\pikachu.gif");
                } */

        }

        @Override
        public void keyReleased(KeyEvent e) {
            int keyCode = e.getKeyCode();
                    if(keyCode== e.VK_LEFT){
                       setXDirection(0);                    
                    }
                    if(keyCode== e.VK_RIGHT){
                       setXDirection(0);                    
                    }
                    if(keyCode== e.VK_UP){
                        setYDirection(0);
                    }
                    if(keyCode== e.VK_DOWN){
                        setYDirection(0);                   
                    }

        }

        @Override
        public void keyTyped(KeyEvent e) {


        }

    }

    // CONSTRUCTOR //
    public PikachuAttack(){

        //Image Import
        ImageIcon still = new ImageIcon("C:\\Java\\GIFS\\Pikachu.gif");
        Pik1 = still.getImage();
        //ImageIcon ready = new ImageIcon("C:\\Users\\Neil\\workspace\\MyOwnTutorials\\bin\\game\\pikready.gif");
        //Pik2 = ready.getImage(); */
        // Pik1 = active.getImage();

        //JFrame properties
        addKeyListener(new AL());
        setTitle("Pikachu Attack");
        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);

        x = 15;
        y = 15;
    }



    public void paint(Graphics g){
        dbImage = createImage(getWidth(), getHeight());
        dbg = dbImage.getGraphics();
        paintComponent(dbg);
        g.drawImage(dbImage, 0, 0, this);   

    }

    public void paintComponent(Graphics g){
        g.setColor(Color.red);
        g.fillRect(200, 190, 12, 20);
        g.drawImage(Pik1, x, y, this);
        g.setColor(Color.red);



        repaint();
    }


    public static void main(String[] args) {
        PikachuAttack game = new PikachuAttack();
        Thread t1 = new Thread(game);
        t1.start();
    }

}

Upvotes: 0

Views: 6014

Answers (3)

Abhay Tripathi
Abhay Tripathi

Reputation: 1

You should just create a image with null value or the default image and then create the second image which will take place of the first image when you press the key.In the key listener you should set the value of image to the second image under the key code of the key you want to press.

Here's an eg. of a moving charechter with changing images as key is pressed

public class WorldOfWarriorsDefault extends JPanel implements KeyListener, ActionListener //main game interface
{
	Timer t = new Timer(5, this); 	
	int x = 0, y = 0, velx = 0, vely = 0; //declares the default values co-ordinates of the moving object
    Rectangle r = new Rectangle(100, 100, 40, 40);
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Image image1 = toolkit.getImage("D:\\My Stuff\\frame_2_delay-0.05s.gif");
    Image image2 = toolkit.getImage("D:\\My Stuff\\runtest2.gif");
    Image image3 = toolkit.getImage("D:\\My Stuff\\ezgif-3-4570fcd5e5.gif");
    Image image4 = toolkit.getImage("D:\\My Stuff\\Leftr.gif");
    Image image = image1;
    public WorldOfWarriorsDefault() //makes a constructor
    {
    	t.start(); //starts the timer
    	addKeyListener(this);
    	 //adds a keyboard listener
    	setFocusable(true); 
    	setFocusTraversalKeysEnabled(false); 
    }
    public void actionPerformed(ActionEvent e) 
    {
        x = x + velx;
        y = y + vely;
        repaint();
    }
    public void up()
    {
    	vely = -2;
    	velx = 0;
    }
    public void down()
    {
    	vely = 2;
    	velx = 0;
    }
    public void left()
    {
    	velx = -2;
    	vely = 0;
    }
    public void right() 
    {	
    	velx = 2;
    	vely = 0;
    }
    public void keyPressed(KeyEvent e) 
	{
		
		int code = e.getKeyCode(); 
		
        if (code == KeyEvent.VK_UP || code == KeyEvent.VK_W) 
        {
        	up();
        }
        if (code == KeyEvent.VK_DOWN || code == KeyEvent.VK_S) 
        {
        	down();
        }
        if (code == KeyEvent.VK_LEFT || code == KeyEvent.VK_A) 
        {
        	left();
        	image = image3;
        }
        if (code == KeyEvent.VK_RIGHT || code == KeyEvent.VK_D) 
        {
        	right();
        	image = image2;
        }
	}
    public void keyTyped(KeyEvent e) {}
	public void keyReleased(KeyEvent e) 
	{
		int coder = e.getKeyCode();
		
		if (coder == KeyEvent.VK_LEFT)
		{
			image = image4;
		}
		if (coder == KeyEvent.VK_RIGHT)
		{
			image = image1;	
		}
		velx = 0;
		vely = 0;
		x = r.getBounds().x;
		y = r.getBounds().y;
		repaint();
	}
	public void paintComponent(Graphics g) //starts a painter
    {
    	super.paintComponent(g); //paints the component
    	r.setBounds(x, y, 40, 40);
    	g.drawImage(image, x, y, this); 
    }
    public static void main(String[] args) 
	{
          JFrame f = new JFrame();
          WorldOfWarriorsDefault w = new WorldOfWarriorsDefault();
          f.add(w);
          f.setVisible(true);
          f.setSize(1900, 1000);
          f.setLocationRelativeTo(null);
          f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

Upvotes: 0

Reimeus
Reimeus

Reputation: 159754

Why not create a new reference to the current Image, say currentImage and on the DOWN key do:

if (keyCode == e.VK_DOWN) {
   setYDirection(+1);
   currentImage = Pik2; // the ready image
}   

then in paintComponent, you could draw the current image:

g.drawImage(currentImage, x, y, this);

Upvotes: 1

Festus Tamakloe
Festus Tamakloe

Reputation: 11310

Just call after repaint

revalidate();

Upvotes: 0

Related Questions