2013-02-13 98 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。