2013-02-13 3 views
1

У меня есть массив, который содержит имена, а затем отображает соответствующую графику с помощью:Как сделать простую мини-карту для рпг игры Java

общественного недействительного paintComponent (График г) {

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); 
     } 
    } 
} 

Это хорошо отображает фактическую графику моей игры. Однако для моей мини-карты я делаю то же самое, с разными значениями и увеличенными числами в «i» и «j» в цикле for. Это создает меньшую версию карты с большим объемом, что оставляет меня с этим. (Обратите внимание, я включен только один из DrawImage() методы, я удалил все остальное здесь, чтобы сделать код более читаемым):

my rpg game

Это в значительной степени мой желаемый эффект (в сторону от позиционирования, который Я могу легко меняться), однако это показывает только меньшую версию того, что я уже вижу на экране. Однако, чем больше 20 x20, и игра начинает сильно задерживаться - возможно, что-то связано с ужасным способом, которым я его закодировал.

Я попытался заменить изображения квадратами с помощью fillRect, но это не поможет.

Вот код моего основного класса, если кто-нибудь хотел бы посмотреть: http://pastebin.com/eEQWs2DS

для цикла в рамках метода paintComponent начинается около линии 3160, петля для основного дисплея составляет около 2678. I настроить JFrame около 1260.

Итак, со всем, что сказал, в основном мой вопрос заключается в следующем:

есть ли лучший, более эффективный способ создать свои миникарты? Моя идея состояла в том, чтобы сгенерировать изображение в начале программы, чтобы игра не приходилась пересчитывать каждый раз, когда кадр обновляется. Я мог бы создать карту заранее, но мне пришлось бы вручную обновлять ее каждый раз, когда я изменил карту, что определенно является проблемой. У меня возникают проблемы с поиском того, как это сделать. Моя другая идея - замедлить частоту обновления только мини-карты, но я также не знаю, как это сделать.

Кроме этого, если есть какие-либо простые исправления проблемы с задержкой, пожалуйста, просветите меня. Я прошу прощения за очень, очень грязный код. Это мой первый программный код с дисплеем, поэтому я вроде как ... взломал его, пока он не сработал.

ответ

1

Я не знаю, насколько это было бы легко с вашей реализацией, но вместо того, чтобы рисовать изображение, возможно, вы могли бы нарисовать квадрат определенного цвета, исходя из того, какой тип плитки он должен быть?

Например, если вы зацикливаете свой список плиток, и вы найдете плитку с травой, вы сначала нарисуете траву в нужном месте, затем нарисуете меньший зеленый квадрат на мини-карте.

Недостатком этого является то, что сначала вы должны определить, какие цвета использовать для плиток, или, возможно, при загрузке плиток вы можете вычислить средний цвет для каждого из них, а затем просто используйте это. Другая проблема заключается в том, что дома не могут хорошо переходить на миникарту, так как плитки имеют гораздо более подробную информацию. Тем не менее, вы могли бы нарисовать какой-то значок дома на мини-карте, а не нарисовать любую из плиток дома.

В принципе, вы хотите использовать более простые представления объектов в вашей карте на мини-карте, так как в любом случае все меньше и меньше деталей.

+0

Это была моя первая идея, которую я имел. Я попытался изменить цвета с помощью fillRect, но все же произошел такой же лаг. Я думаю, проблема заключается в том, что я пытаюсь напечатать 2500 изображений на 5 квадратных пикселей каждые двадцать раз в секунду. –

+0

Возможно, попробуйте упростить объем данных на карте. Например, вместо того, чтобы иметь 50x50 квадратов, используйте 15x15 или что-то подобное, но сделайте квадраты более крупными. Например, если у вас есть дорога шириной 3 квадрата на обычной карте, это займет больше места на мини-карте, чем должно было бы, но это было бы достаточно хорошим представлением дороги на карте. Точно так же дома могут занимать только 1 плиту или большую площадь 2x2, возможно, на мини-карте и не могут масштабироваться, но достаточно точно представляют, где находятся дома. – Feles

+0

Возможно, вместо i ++ и j ++ в цикле for я использую i = i + 4 и т. Д.? Спасибо, я попробую. –

0

Посмотрите на то, как я делаю это в тирана (Ява рогаликов):

Основные приемы:

  • использовать закадровый BufferedImage. Кэшируйте это, чтобы не воссоздавать его каждый раз, когда вы рисуете.
  • Используйте int[] массив для настройки до одного цвета для каждой плитки
  • Использование setRGB с массивом рисовать все карты сразу
  • Нарисуйте мини-карту на х2 зумом, чтобы получить 2х2 пикселей, блоки для каждой плитки ,

Если вы хотите быть еще эффективнее, сохраните флаг changed и обновите мини-карту BufferedImage, если что-то заметное на мини-карте изменится. Я не думал, что это того стоит, так как вышеупомянутое уже очень эффективно, но YMMV.

Смежные вопросы