Я делаю 2D-игру, и я хочу сделать 2D-видимость. Итак, моя идея состоит в том, чтобы сделать карту, а затем замаскировать ее другим черным (например) полигоном, чтобы игрок мог видеть карту через черный полигон. Итак, моя идея состоит в том, чтобы нарисовать какое-то отверстие (многоугольник) через черный многоугольник, чтобы увидеть карту, которая находится под черным многоугольником. Я уже сделал видимость, но понятия не имею, как сделать маску.
Так программа выглядит на данный момент 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);
}