2012-08-06 50 views
0

我最近完成了一个我正在制作的游戏的基础知识,并且我将它发送给一些朋友,但是只要他们打开.jar,它就只是一个灰色的窗口。当我听说我认为这是因为我得到图像的方式(我使用了完整路径:C:\ Users \ etc)。我做了一些谷歌搜索,并找到了一种看起来更高效的图像。图片错误

private static Image[] mobImages = new Image[1]; 

public static void loadImages() 
{ 
    mobImages[1] = Handler.loadImage("res/EnemyLv1.png"); 
} 

public static Image getMobImages(int index) 
{ 
    return mobImages[index]; 
} 

这就是我想使用的。但是我做到了这一点,并改变了我的其他代码以支持这一点。每当我运行游戏时,我都会遇到一些错误。所有点回

这样的:如果 (的getBounds()相交(tempEnemy.getBounds()))

所以可能我得到的图像太的方式。我怎么能解决这个问题?有没有更好的方法来获取图像?我试了一些,但他们没有工作。

编辑:我终于解决了所有的错误! :D唯一的问题是没有图像出现。再次是my code。还有什么帮助?那太棒了!感谢大家迄今为止的支持!

+1

确切地说你会得到什么错误?知道这将使调试更容易。 – 2012-08-06 14:13:13

+0

那么,当游戏开始画背景时,玩家也是如此,但你不能移动,敌人也不会出现。这个错误说:线程“AWT-EventQueue-0”中的异常java.lang.NullPointerException – Connor 2012-08-06 14:17:26

+1

我想你会得到一个NullpointerException。但是我们需要更多关于异常的信息和2. Handler.loadImage是做什么的。提示:我们需要代码,谢谢! – zip 2012-08-06 14:19:11

回答

1

很难说什么在你的代码去错了。不过,我建议你将图像文件放入java项目的一个包中(这样它们将成为JAR文件的一部分),并使用Class.getResource()/ Class.getResourceAsStream()访问它们。这样可以避免多重陷阱并保持一切。

的样本如何构建您的图像放入包:

的myproject
   图像0​​         ImageLocator.class
        MyImage1.jpg
   然后0   MyImage2.jpg

的ImageLocator类需要使用相对pathes(只是图像名+扩展)来访问资源。

public class ImageLocator { 
    public final static String IMAGE_NAME1 = "MyImage1.jpg"; 

    public static Image getImage(final String name) { 
     URL url = ImageLocator.class.getResource(name); 
     Image image = Toolkit.getDefaultToolkit().createImage(url); 
     // ensure the image is loaded 
     return new ImageIcon(image).getImage();    
    } 
} 

这可以做得更优雅,但这应该让你开始。在ImageLocator类中将图像名称定义为常量可避免在整个项目中传播具体路径(只要ImageLocator中的名称是正确的,其他所有内容将由编译器检查)

+0

好的,所以我会为每个新图像创建一个新的getImage方法?另外,我将如何参考图像?因为我在getBounds()方法中这样做。 – Connor 2012-08-06 15:45:40

+0

ImageLocator.getImage(ImageLocator.IMAGE_NAME1)会让你的图像#1。您只需在ImageLocator中为每个图像定义一个新名称。为了获得最佳性能,我将通过此方法加载所有图像,然后将它们保存在某处。当然,名称常量*应该被选择,以便名称告诉图像是什么(如IMAGE_ENEMY1,IMAGE_PLAYER等) – Durandal 2012-08-06 15:56:58

+0

当我键入getResourceURL(name);它说我需要创建一个方法? – Connor 2012-08-06 16:25:14

0

你的代码仍然使用Enemy.java中的“C:\ Users \ Kids \ Desktop \ Java Game \ Cosmic Defense \ res \ EnemyLv2.png”。你确定这存在吗?如果你移动了宇宙防御文件夹,它不会。

(你在谈论改变为相对路径绝对路径,所以这可能是你的问题)

0

部分原因可能是您的代码指向大小为1的数组中的索引“1”,这意味着唯一可用的索引实际上是“0”。

尝试mobImages[0] = Handler.loadImage("res/EnemyLv1.png");

+0

我尝试过,但它没有奏效。 – Connor 2012-08-06 18:38:27

+0

这不会是整个问题的解决,但它肯定会成为它不工作的一部分。 – Quetzalcoatl 2012-08-06 19:00:37

+0

是的,它试过了,它并没有解决整个问题,但至少我知道我正在取得进展。控制台指向我的checkCollisions方法。有人可以检查我的代码并帮我解决问题吗? – Connor 2012-08-07 18:43:55