Я делаю 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);
}
Ну, это хорошая идея, но я рисую с Graphics2D, и я не знаю, как редактировать пиксели только с помощью Graphics. Я использую тот же алгоритм, что и этот http://ncase.me/sight-and -light/. У вас есть идея, как сделать это без редактирования каждого пикселя? –
Вы можете конвертировать Graphics2D в BuffredImage для доступа к каждому пикселю: Пожалуйста, прочитайте [здесь] (http://stackoverflow.com/questions/6575578/convert-a-graphics2d-to-an-image-or-bufferedimage) – Kami
Да, но не привык это будет медленным, потому что, если у меня будет большое разрешение, это сильно замедлится. Если я сделаю целое в маске, тогда сначала нарисую карту, а затем маску, в которой я не буду проходить через каждый пиксель, если это возможно, хотя –