博主最近在设计一个游戏,叫做21点,有兴趣的读者可以去网上查一下,这是游戏的截图
这个游戏跟我们讨论的主题有什么关系呢?我们都知道,在游戏设计中最重要的就是图片的显示问题,我在设计这个游戏的时候有2个问题:
1.图片存放在什么位置?
2.图片的读取是以什么样的方式?
首先我们来看第二个问题,一般在java里面读取图片的方式有很多种,但是在游戏中最常见的还是这个方式:
Image img =Toolkit.getDefaultToolkit().getImage("images\\xxx.jpg");
然后将图片显示在面板上的语句是:
g.drawImage(cardImage, x, y, (ImageObserver)p);
这样的方式本身没什么问题,不过还是需要结合第一个问题来讨论,这里运用的是相对路径,就是说必须在项目中新建一个文件夹,并命名为images,这里所说的相对其实是相对于类文件来说的,类文件在读取图片的时候如果项目下面没有Images文件夹肯定会报错,所以在eclipse中只要加上了这个文件夹,并把相应的图片放在下面是不会有什么问题的,最后的运行结果确实如图所示。
但是,当我们将项目打包成jar文件时,却没有这么幸运了,项目打包之后就是这个样子:
这样子有什么问题呢?我们运行这个jar文件的时候,就是这个样子:
根本就看不到牌面,然而当我们将images文件夹复制粘贴到jar文件并列时,look
居然又能够显示图片了,这就是博主百思不得其解的地方,按理说在jar包中已经包含了类文件,并且类文件也和Iamges在同一个文件夹下面,但是这些类文件反而读取不到jar包中的iamges,偏偏可以读取到jar包外面的images,所以这个地方我也没有搞懂。
其实问题到了这个地方已经解决了,但是为了不影响使用,总不能每次做一个游戏之后,都要在生成jar文件之后,再把images文件夹复制到和jar文件并列,那么有没有什么办法可以使得只需要生成一个jar文件,该jar文件就可以直接运行,而不用在去复制图片过。
答案是可以!
怎么做呢?只需要把那么些个图片直接和类文件放在一起,也就是放在.java文件那里,就是包中。但是问题来了,把图片放到包中之后怎么读取呢?还能用之前的
Image img =Toolkit.getDefaultToolkit().getImage("images\\xxx.jpg");
吗?显然是不行的,就算改变一下路径
Image img =Toolkit.getDefaultToolkit().getImage("xxx.jpg");
也是不行的,为啥不行这里我也不太清楚原理,反正运行的时候就是没有。所以这里就用到了另外一种方式
url=getClass().getResource("s1.gif");
imageIcon=new ImageIcon(url);
image=imageIcon.getImage();
这个是啥玩意其实我也不是很懂,但是这里面有个方法确实非常有效:
getClass().getResource("s1.gif");
有了这个之后,就可以直接把所有的图片全部放在类文件下面,然后就再生成jar文件之后就可以直接显示所有的图片了,而不用再次复制粘贴。