Java - 按键时更改图像

标签 java image if-statement keylistener

Java新手来了!

我正在开发一款小游戏,它只需在屏幕上移动即可攻击我正在创建的小 AI 矩形。

我有两个 GIF 文件 pikachu.gif(是的,它是一个口袋妖怪游戏)和 pikready.gif。

我已经实现了 KeyListener 和所有内容,并且可以使用箭头键让 Pikachu.gif 在框架中移动。

我想要的是,当我按下箭头键时将图像更改为 pikready.gif,我在网上查了一下,似乎找不到答案。

代码如下,任何注释掉的内容都是我尝试过的不同内容。

正如我所说,我是一名 Java 新手,所以对我要宽容一些!

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();
    }

}

最佳答案

为什么不创建对当前Image的新引用,说currentImage并按向下键执行以下操作:

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

然后在paintComponent中,您可以绘制当前图像:

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

关于Java - 按键时更改图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902250/

相关文章:

java - 缓冲一个大文件; BufferedInputStream 限制为 2gb;数组限制为 2^31 字节

java - 使用参数调用方法

django - 无法在简单的 django 站点中显示图像

javascript - 在 angularJS 中使用 ng-if 条件停止循环

python - 重新混合两个表中接收命令的两个函数,使两个函数合而为一

java - Android RecyclerView 仅在关闭并重新启动应用程序后显示项目

java - 使用反射修改抽象类中的字段

Android旋转图像ontouch

c++ - 使用 C++ 使用虚拟键截取屏幕截图

Java:条件运算符不同于 if/else