我的问题是,我试图制作一个资源加载器,将过去的纹理保存到HashMap,并将其位置作为关键。它在将图像加载到包外时非常有效,但是当它试图加载内部图像时它就不会保存。
这是我的资源加载器代码
public Map<String,BufferedImage> loads = new HashMap<String,BufferedImage>();
public BufferedImage loadImage(String imagePath){
BufferedImage temp = new BufferedImage(9, 16, BufferedImage.TYPE_INT_RGB);
String location = imagePath.replaceAll("[.]", "/");
location += ".png";
//internal
if(location.startsWith("CLASS_")){
if(loads.get(location) != null){
System.out.println("OLD");
return loads.get(location);
}else{
location = location.replaceAll("CLASS_", "");
try{
temp = ImageIO.read(this.getClass().getClassLoader().getResource("net/minegeek360/platformer/assets/"+location));
loads.put(location, temp);
}catch(Exception e){System.err.println("CANT LOAD IMAGE");}
System.out.println("NEW | "+temp);
}
//external
}else{
try{
if(loads.get(location) != null){
//System.out.println("LOADED ORIGIONAL IMAGE");
return loads.get(location);
}else{
temp = ImageIO.read(new File("assets/textures/"+location));
//System.out.println("LOADED NEW IMAGE");
}
}catch(Exception e){ e.printStackTrace(); }
loads.put(location, temp);
}
return temp;
}
正如我所说,外部装载工作完美,它只是内部装载问题。它正确加载所有图像所以我知道BufferedImages不是问题,这就是为什么我认为它是HashMaps。
答案 0 :(得分:2)
当数据放入地图时,前缀“CLASS_”将从用作密钥的位置删除。
但是,从地图中查询数据时,前缀仍然存在。
请问您可以为内部部件试用此代码并从控制台提供输出吗?
if(location.startsWith("CLASS_")){
location = location.replaceFirst("CLASS_", "");
if(loads.get(location) != null){
System.out.println("OLD");
return loads.get(location);
} else {
try{
temp = ImageIO.read(this.getClass().getClassLoader().getResource("net/minegeek360/platformer/assets/"+location));
System.out.println("Loading image, current size: " + loads.size());
loads.put(location, temp);
System.out.println("Image loaded, new size: " + loads.size());
}catch(Exception e){System.err.println("CANT LOAD IMAGE");}
System.out.println("NEW | "+temp);
}
}
答案 1 :(得分:0)
负载永远不会添加任何东西!即使它在我的代码中,它什么都不做!
疑。
您检查内部加载的图像如下:
if(location.startsWith("CLASS_")){
if(loads.get(location) != null){
如果你没找到,那么就像这样加载它:
location = location.replaceAll("CLASS_", "");
try{
temp = ImageIO.read(this.getClass().getClassLoader().getResource("net/minegeek360/platformer/assets/"+location));
loads.put(location, temp);
您当然会存储图像,但对以前加载的内部图像的测试永远不会成功,因为您使用不同的密钥(所有外观都已移除"CLASS_"
)来存储它们,而不是您以后尝试使用的他们了。
答案 2 :(得分:0)
问题是我有同一个加载器的多个实例。所以我只是让我的文件只访问一个实例。