繁体   English   中英

为什么我看不到文件?

[英]Why I can't read file?

嗨,我想做简单的游戏。 但是在我创建游戏逻辑之前,我遇到了一个问题。 正如我在标题上提到的。 我无法阅读jpg文件。 我收到此错误消息“无法读取输入文件!”。 我知道它来自e.getMessage()。 但是,仅此而已。 我真的不知道为什么会这样。 在missilegame软件包中,已经有3个jpg文件。

所以,这是代码。

package missilegame;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

class GraphicObject {
BufferedImage img = null;
int x, y = 0;

public GraphicObject(String name) {
    try {
        img = ImageIO.read(new File(name));
    } catch (Exception e) {
        System.out.println(e.getMessage());
        System.exit(0);
    }
}

public void update() {
}

public void draw(Graphics g) {
    g.drawImage(img, x, y, null);
}

public void keyPressed(KeyEvent event) {

}

public void keyPressed(KeyEvent event, int x, int y) {
    // TODO Auto-generated method stub

}
}

class Missile extends GraphicObject {
    boolean launched = false;

    public Missile(String name) {
        super(name);
        y = -200;
    }

    @Override
    public void update() {
        if (launched)
            y -= 1;
        if (y < -100) {
            launched = false;
        }
    }

    @Override
    public void keyPressed(KeyEvent event, int x, int y) {
        if (event.getKeyCode() == KeyEvent.VK_SPACE) {
            launched = true;
            this.x = x;
            this.y = y;
        }
    }
}

class Enemy extends GraphicObject {
    int dx = -10;

    public Enemy(String name) {
        super(name);
        x = 500;
        y = 0;
    }

    public void update() {
        x += dx;
        if (x < 0) {
            dx = +10;
        }
        if (x > 500)
            dx = -10;
    }

}

class SpaceShip extends GraphicObject {
    public SpaceShip(String name) {
        super(name);
        x = 150;
        y = 350;
    }

    @Override
    public void keyPressed(KeyEvent event) {
        if (event.getKeyChar() == KeyEvent.VK_LEFT) {
            x -= 10;
        }
        if (event.getKeyChar() == KeyEvent.VK_RIGHT) {
            x += 10;
        }
        if (event.getKeyChar() == KeyEvent.VK_UP) {
            y -= 10;
        }
        if (event.getKeyChar() == KeyEvent.VK_DOWN) {
            y += 10;
        }
    }
}

class MyGamePanel extends JPanel implements KeyListener {
    Enemy enemy;
    SpaceShip spaceShip;
    Missile missile;

    public MyGamePanel() {
        this.addKeyListener(this);
        this.requestFocus();
        setFocusable(true);

        enemy = new Enemy("./enemy.jpg");
        spaceShip = new SpaceShip("./spaceship.jpg");
        missile = new Missile("./missile.jpg");
        class MyThread extends Thread {
            public void run() {
                while (true) {
                    enemy.update();
                    spaceShip.update();
                    missile.update();
                    repaint();
                    try {
                        Thread.sleep(50);
                    } catch (Exception e) {
                    }
                }
            }

        }
        Thread t = new MyThread();
        t.start();
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        enemy.draw(g);
        spaceShip.draw(g);
        missile.draw(g);
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        spaceShip.keyPressed(e);
        missile.keyPressed(e,spaceShip.x,spaceShip.y);
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

}

public class MissileGame extends JFrame {
    public MissileGame() {
        setTitle("MY Game");
        add(new MyGamePanel());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(500, 500);
        setVisible(true);
    }

    public static void main(String[] args) {
        new MissileGame();
    }

}

在missilegame软件包中,已经有3个jpg文件。

但是您的代码不会从missilegame软件包中读取。 它读取文件系统上当前目录中的文件。 当前目录是执行java命令的目录。 并且您的文件(不是必须)不在文件系统上。 它们是应用程序中嵌入的资源,应使用类加载器加载。

更换

img = ImageIO.read(new File(name));

通过

img = ImageIO.read(GraphicObject.class.getResourceAsStream("/missilegame/" + name));

并将"./enemy.jpg"替换为"enemy.jpg"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM