1

我有一个包含名称的数组,然后使用以下方法显示适当的图形:

公共无效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); 
        }   
    }
}

这很好地显示了我的游戏的实际图形。然而,对于我的小地图,我做同样的事情,在 for 循环中的“i”和“j”中使用不同的值和增加的数字。这将创建具有更大范围的较小版本的地图,这让我有了这个。(注意,我只包含了其中一个 drawImage() 方法,我在这里删除了其余的方法以使代码更具可读性):

我的rpg游戏

这几乎是我想要的效果(除了我可以轻松更改的定位),但是,这仅显示了我在屏幕上已经看到的较小版本。但是,任何大于约 20 x20 的尺寸,游戏开始严重滞后——可能与我编码它的糟糕方式有关。

我曾尝试使用 fillRect 将图像替换为正方形,但这无济于事。

如果有人想看看,这是我的主要课程的代码:http: //pastebin.com/eEQWs2DS

paintComponent 方法中的 for 循环从 3160 行左右开始,主显示的循环在 2678 左右。我将 Jframe 设置在 1260 左右。

所以,说了这么多,基本上我的问题是这样的:

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

除此之外,如果对滞后问题有任何简单的修复,请赐教。对于非常非常混乱的代码,我深表歉意——这是我第一次用显示器编写任何东西,所以我有点……在它工作之前一直在破解它。

4

2 回答 2

1

我不知道这对你的实现有多容易,但不是绘制图像,也许你可以根据它应该是什么类型的瓷砖来绘制某种颜色的正方形?

例如,如果您循环浏览您的图块列表并找到一个草图块,您将首先在其正确位置绘制草图块,然后在小地图上绘制一个较小的绿色方块。

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

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

于 2013-02-13T01:12:14.630 回答
0

看看我在 Tyrant(Java roguelike)中是如何做到的:

关键技巧:

  • 使用屏幕外BufferedImage。缓存它以避免每次绘制时重新创建它。
  • 使用int[]数组为每个图块设置单一颜色
  • 使用 setRGB 和数组一次绘制所有地图
  • 以 x2 缩放绘制迷你地图,以获得每个图块的 2x2 像素块。

如果您想提高效率,请保留一个changed标志,并且仅在小地图上可见的内容发生变化时才更新小地图 BufferedImage。我不认为这是值得的,因为上面已经很有效了,但是 YMMV。

于 2013-02-13T02:24:30.967 回答