所以,我正在编写一个基本的TowerDefense游戏。结合得很好,但是我被困在尝试预加载图像。我的困境是,当我为我的Canvas类调用paint方法(它扩展了JPanel)时,它将打开一个名为“ Image Fetcher x”的线程,其中“ x”是一个以0开头并且在该线程的多个实例中向上的数字。据我了解,该线程正在从我的图像变量中获取图像,将它们定位在磁盘上,将它们加载到RAM中以供我的游戏显示,然后绘制它们。
这样做很好,但是在游戏中间,有些时候什么也没出现,因为我调用的draw方法试图绘制尚未加载的图像。游戏玩法仍然有效,但是视觉表现混乱了,因为玩家基本上会看到一个草皮射击敌人。然后突然间图像加载并绘制并看起来正常。
一切都很好,但我希望能够预加载所有资源(并可能制作一个加载屏幕,以便玩家知道游戏正在加载),以便未加载的图像不要破坏游戏的幻想-如果那是有道理的。我尝试使用MediaTracker,但没有用。我已经对此进行了研究,但似乎找不到任何地方。
我当前的代码由图像映射中的图像阵列组成。阵列中的每个图像均根据某些标识符在画布上绘制,这些标识符告诉游戏绘制哪个瓦/塔。我正在使用java.awt.Image类存储图像。因此,有什么方法可以预加载我的图像,从而不必在游戏进行时加载它们吗?
谢谢!
编辑:
代码:
for(int y=0; y<tileMap.length; y++) {
for(int x=0; x<tileMap[y].length; x++) {
tileMap[y][x] = new ImageIcon("res/tileMap.png").getImage();
tileMap[y][x] = createImage(new FilteredImageSource(tileMap[y][x].getSource(), new CropImageFilter(x * Room.blockSize, y * Room.blockSize, Room.blockSize, Room.blockSize)));
}
}
public void paintcomponent(Graphics g) {
g.drawImage(tileMap[1][2], 5, 7, null);
}
这是一个简化的版本,我大约有1500行,所以我不希望您看到所有这些,哈哈。基本上,我只是创建图像变量,然后绘制它们。在绘制它们时,将启动Image Fetcher线程,加载图像,然后在图像加载完成后消失。加载图像时(并且Image Fetcher线程处于活动状态),由于未将图像预加载到RAM中,因此drawImage方法不会绘制任何内容。但是,一旦完成加载图像,drawImage方法实际上将绘制正确的图像,并且Image Fetcher线程不再处于活动状态。是否有一种方法可以启动图像获取过程,以使所有这些操作均在启动程序之前 发生?
我还尝试过在开始时就绘制所有内容,但由于程序运行得太快,导致图像提取程序无法在用户播放之前成功加载每个图像,因此该操作不起作用。 idk,图像获取程序很复杂。我只需要知道如何将图像预加载到RAM中即可。