简体   繁体   English

为什么我看不到文件?

[英]Why I can't read file?

hi i want to make simple game. 嗨,我想做简单的游戏。 but before i create game logic, i got a problem. 但是在我创建游戏逻辑之前,我遇到了一个问题。 as i mentioned on the title. 正如我在标题上提到的。 i can't read jpg file. 我无法阅读jpg文件。 i got this error message "Can't read input file!". 我收到此错误消息“无法读取输入文件!”。 I know it's from e.getMessage(). 我知道它来自e.getMessage()。 But that's all. 但是,仅此而已。 I really don't know WHY this happened. 我真的不知道为什么会这样。 In the missilegame package, there is 3 jpg files already. 在missilegame软件包中,已经有3个jpg文件。

so, here is code. 所以,这是代码。

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

} }

In the missilegame package, there is 3 jpg files already. 在missilegame软件包中,已经有3个jpg文件。

But your code doesn't read from the missilegame package. 但是您的代码不会从missilegame软件包中读取。 It reads a file in the current directory, on the file system. 它读取文件系统上当前目录中的文件。 The current directory is the directory from where the java command is executed. 当前目录是执行java命令的目录。 And your files are not (necessarily) on the file system. 并且您的文件(不是必须)不在文件系统上。 They're resources embedded in the application, that should be loaded with the class loader. 它们是应用程序中嵌入的资源,应使用类加载器加载。

Replace 更换

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

by 通过

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

and replace "./enemy.jpg" by "enemy.jpg" . 并将"./enemy.jpg"替换为"enemy.jpg"

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

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