我有一个包含名称的数组,然后使用:
显示相应的图形public void paintComponent(Graphics g){
for(int i = 0; i<20; i++)
{
for(int j = 0; j<20; j++)
{
if(testMap.getData(i+(rowX-7), j+(columnY-7)).indexOf("rock") >= 0)
{
g.drawImage(image3, j*50 + 5*add, i*50 + 5*add2, 50, 50, this);
}
}
}
这很好地显示了我游戏的实际图形。但是,对于我的小地图,我做同样的事情,在for循环中'i'和'j'中的值不同并且数字增加。这会创建一个较小版本的地图,其范围更大,这让我有了这个。 (注意,我只包含了一个drawImage()方法,我在这里删除了其余的以使代码更具可读性):
这几乎是我想要的效果(除了我可以轻松改变的定位),然而,这只显示了我在屏幕上看到的较小版本。然而,任何大于约20 x20的游戏都开始严重滞后 - 可能与我编码它的可怕方式有关。
我尝试使用fillRect用正方形替换图像,但这对问题没有帮助。
以下是我主要课程的代码,如果有人想看一看:http://pastebin.com/eEQWs2DS
paintComponent方法中的for循环从第3160行开始,主显示的循环大约是2678.我在1260左右设置Jframe。
所以,尽管如此,基本上我的问题是:
有没有更好,更有效的方法来创建我的迷你地图?我的想法是在程序开始时生成一个图像,这样游戏就不必每次刷新帧时都重新计算。我可以提前创建地图,但每次更改地图时我都必须手动更新,这绝对是一件麻烦事。我在研究如何做前者时遇到了麻烦。我的另一个想法是仅减慢小地图的刷新率,但我也不知道该怎么做。
除此之外,如果对滞后问题有任何简单的解决方法,请赐教。我为这个非常非常混乱的代码道歉 - 这是我第一次用显示器编程任何东西,所以我只是......在它工作之前就已经黑了。
答案 0 :(得分:1)
我不知道这对你的实现有多容易,但是你可以根据它应该是什么类型的瓷砖来绘制一个特定颜色的正方形而不是绘制图像?
例如,如果您循环浏览瓷砖列表并找到草砖,则首先在适当的位置绘制草砖,然后在小地图上绘制一个较小的绿色方块。
这样做的缺点是,首先你必须定义用于瓷砖的颜色,或者当你加载瓷砖时,你可以计算每个瓷砖的平均颜色,然后使用它。另一个问题是房屋可能无法很好地转化为小地图,因为瓷砖有更多的细节。你可以在小地图上绘制某种房子图标,而不是实际绘制任何房屋瓷砖。
基本上,您希望在小地图上使用地图中对象的更简单的表示,因为它可以更小,也可以绘制更少的细节。
答案 1 :(得分:0)
看看我如何在暴君(Java roguelike)中做到这一点:
关键技巧:
BufferedImage
。对此进行缓存以避免每次绘制时重新创建它。int[]
数组为每个图块设置单一颜色如果您想要更高效,请保留changed
标记,并仅在迷你地图上可见的内容发生更改时更新迷你地图BufferedImage。我不认为这是值得的,因为上面已经非常有效,但是YMMV。