2D рендеринг - алгоритм определения островов и применения "пляжей"?

Я играю с программированием 2D игр. Мой игрушечный проект - парусная игра с изумительными островами и многое другое, но на данный момент я пытаюсь найти лучший способ применить "пляжи" (т.е. Мягкие концы) к другим довольно грубым островам. Размер плитки - 64x48.

enter image description here

Мое настоящее решение состоит в том, чтобы проходить через каждую плитку и искать окружающие плитки, и в зависимости от их окружения, замените водометную плиту на правильную текстуру.

Я понимаю, что это очень ошибочный подход:

  • Невероятно неэффективен, поскольку метод объемного звучания вызывается для каждого фрагмента, даже те, которые затронуты изменением
  • Порядок выполнения может означать, что некоторые изменения в плитке перезаписаны.

У вас, ребята, есть идея, как я могу обойтись и решить это лучше?

Спасибо!

изменить

Этот алгоритм выполняется при загрузке карты.

4
задан Leonard 02 дек. '12 в 21:40
источник поделиться
2 ответов

Алгоритм обнаружения границ (но не углов вначале) за один проход в строке/строке будет:

for each horizontal line
  previousTag = getTag( first line pixel ) // land or water in our example
  for each pixel of the line
    currentTag = getTag( this pixel )
    if ( previousTag == currentTag ) 
       continue // not a border
    else 
       // We got a vertical border, do what is needed

    previousTag = currentTag
  endforeach
endforeach

То же самое касается вертикальных линий (вместо увеличения x, вы увеличиваете y. Мы также можем знать, получим ли мы угол вместо вертикальной границы:

for each vertical line
  previousTag = getTag( first line pixel ) // land or water in our example
  for each pixel of the line
    currentTag = getTag( this pixel )
    if ( previousTag == currentTag ) 
       continue // not a border
    else 
       if ( pixel on the right or on the left is a border )
         // we got a corner
       else
         // we got a horizontal border

    previousTag = currentTag
  endforeach
endforeach

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

2
ответ дан Vincent Mimoun-Prat 02 дек. '12 в 22:20
источник поделиться

По крайней мере, я бы поставил флаг плитки, так что вам нужно сделать это, как только первый раз вы сделаете плитку, а затем повторно используйте значение флага вместо того, чтобы пытаться выяснить его снова.

Если вы делаете это во время рендеринга, предполагая, что вы показываете только часть карты за раз, то это намного эффективнее, чем делать это для всей карты одновременно.

Кроме этого, я не могу придумать другого способа сделать алгоритм более эффективным. По определению название "пляж" определяется как таковое наличием земли на краю водоема. Поэтому у вас нет другого выбора, кроме как смотреть на окружающие плитки...

2
ответ дан mprivat 02 дек. '12 в 21:55
источник поделиться

Другие вопросы по меткам или Задайте вопрос