2013-02-13 100 views
1

我持有的名称,然后数组使用显示相应的图形:如何使一个简单的迷你地图为Java RPG游戏

公共无效paintComponent(图形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); 
     } 
    } 
} 

这很好地显示了我的游戏的实际图形。然而,对于我的小地图,我做同样的事情,不同的值和增加的数字在'我'和'j'在for循环。这会创建一个更小版本的地图,这个地图会有更大的范围,这让我感到很开心。 (请注意,我只包括的drawImage()的一个方法,我删除了在此休息,使代码更易读):

my rpg game

这几乎是从定位,我想要的效果(除了其中我可以很容易地更改),但是,这只显示我已经在屏幕上看到的较小版本。尽管如此,任何大于20x20的比赛,游戏开始严重滞后 - 可能与我编码它的可怕方式有关。

我试图用fillRect替换正方形的图像,但它没有帮助的问题。

这里是我的主类的代码,如果有人想看一看:http://pastebin.com/eEQWs2DS

的对的paintComponent方法内循环开始在各地线3160,主显示屏循环大约是2678.我建立JFrame的大约1260

因此,与所有的说,基本上我的问题是这样的:

有没有创造我的小地图更好的,更有效的方式?我的想法是在程序开始时生成一个图像,以便游戏在每次刷新帧时都不必重新计算。我可以提前创建地图,但每次更改地图时都必须手动更新,这绝对是一件麻烦事。我很难研究如何做前者。我的另一个想法是只减慢小地图的刷新率,但我也不知道该怎么做。

除此之外,如果对滞后问题有任何简单的修正,请赐教。我为非常非常混乱的代码表示歉意 - 这是我第一次用显示器编程任何东西,所以我只是......砍了它,直到它工作。

回答

1

我不知道这将是多么容易与您的实现,而不是绘制图像,也许你可以绘制一个基于它应该是什么类型的瓷砖的某种颜色的平方?例如,如果您正在循环显示您的瓷砖列表并找到了草地砖,则应先将草地砖绘制在适当的位置,然后在小地图上绘制一个较小的绿色方形。

这样做的缺点是,首先你必须定义瓷砖使用的颜色,或者当你加载瓷砖时,你可以计算每个瓷砖的平均颜色,然后使用它。另一个问题是,房子可能不会很好地转换到小地图,因为瓷砖有更多的细节。尽管如此,你可以在迷你地图上绘制某种房屋图标,而不是实际绘制任何房屋瓦片。

基本上,您希望在小地图上使用地图中对象的更简单的表示形式,因为它更小且无论如何都可以绘制更少的细节。

+0

这是我的第一个想法,我有。我曾尝试使用fillRect更改颜色,但同样的滞后仍然发生。我认为问题在于我试图以每秒20次的5个方块像素打印2500张图像。 – 2013-02-13 01:16:51

+0

也许试图以某种方式简化地图中的数据量。例如,不是使用50x50的正方形,使用15x15或类似的东西,而是使正方形代表更大的区域。例如,如果在常规地图上有一条3平方公里的道路,它会在小地图上占用更多的空间,但它在地图上可以代表道路。同样,房屋可能只占用1块瓦片,或者更大的瓦块,也许在小地图上可能有2×2的面积,可能不会成比例,但可以相当准确地表示房屋的实际位置。 – Feles 2013-02-13 01:31:29

+0

也许不是for循环中的i ++和j ++,我使用i = i + 4等? 谢谢,我会尽力的。 – 2013-02-13 01:35:03

0

看一看我如何做到这一点的暴君(一个Java roguelike):

主要招数:

  • 使用的屏幕外BufferedImage。将其缓存以避免在每次绘制时重新创建它。
  • 使用的int[]阵列设置了单一颜色为每瓦
  • 使用setRGB与阵列来绘制所有的地图立刻
  • 在X2变焦绘制迷你地图来获得2×2像素块用于每个图块。

如果您希望效率更高,请保留changed标志,并且只在迷你地图上可见的内容发生变化时更新迷你地图BufferedImage。我不认为这是值得的,因为上述已经非常有效,但是YMMV。