Reputation: 1604
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
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
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