2015-07-28 5 views
1

Я делаю 2d-игру, и я хочу сделать видимость 2d. Поэтому моя идея - сделать карту, а затем замаскировать ее другим черным (например) полигоном, чтобы игрок мог видеть через черный полигон карту. Поэтому моя идея - нарисовать какую-то дыру (многоугольник) через черный полигон, чтобы увидеть карту, которая находится ниже черного полигона. Я уже сделал видимость, но я понятия не имею, как сделать маску.2D видимость с java grapics (Fog of War)

Это то, что программа выглядит так далеко http://prntscr.com/7y36ev

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

Редактировать - для тех, кто хочет сделать то же самое Я сделал это с Path2D. Сначала я делаю внешний многоугольник с Path2D, затем создаю внутренний многоугольник (отверстие) и присоединяем отверстие к внешнему многоугольнику. Это пример код:

public void paintComponent(Graphics g){ 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(Color.red); 

     Path2D.Double poly = new Path2D.Double(); 
     Path2D.Double hole = new Path2D.Double(); 

     hole.moveTo(40,40); 
     hole.lineTo(40,60); 
     hole.lineTo(60,60); 
     hole.lineTo(60,40); 
     hole.lineTo(40,40); 

     poly.moveTo(80,2); 
     poly.lineTo(80,80); 
     poly.lineTo(2,80); 
     poly.lineTo(2,2); 
     poly.lineTo(80,2); 

     poly.append(hole, true); 
     g2d.fill(poly); 
    } 

ответ

0

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

Получите BufferedImage карты и BufferedImage of Mask и используя два для циклов, проверьте, имеет ли маска черный пиксель в позиции (X, Y), если это так, добавьте пиксель Map to new BufferedImage в позицию (X, Y) в противном случае добавит черный пиксель к полученному BufferedImage в позиции (X, Y).

Edit: Немного псевдокоде

BufferedImage mapBI = .... // the map as BufferedImage 
BufferedImage maskBI = .... // the mask as BufferedImage 
BufferedImage resultBI = ... // new BufferedImage with same size as mask 

for (i=0; i< maskBI.width; i++){ 
    for(j=0; j< maskBI.height; j++){ 
     if (maskBI.pixelAt(i,j) == blackPixel){ 
      resultBI.setPixel(i,j,mapBI.pixelAt(i,j)); 
     }else{ 
      resultBI.setPixel(i,j,blackPixel); 
     } 
    } 
} 

Я надеюсь, вы понимаете, что я имею в виду.

+0

Ну, это хорошая идея, но я рисую с Graphics2D, и я не знаю, как редактировать пиксели только с помощью Graphics. Я использую тот же алгоритм, что и этот http://ncase.me/sight-and -light/. У вас есть идея, как сделать это без редактирования каждого пикселя? –

+0

Вы можете конвертировать Graphics2D в BuffredImage для доступа к каждому пикселю: Пожалуйста, прочитайте [здесь] (http://stackoverflow.com/questions/6575578/convert-a-graphics2d-to-an-image-or-bufferedimage) – Kami

+0

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

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

  • Нет связанных вопросов^_^