2012-03-13 7 views
1

Вот моя проблема. Я пытаюсь нарисовать круговую часть одного изображения.Рисование части изображения (Java)

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

drawImage(Image img, 
      int dx1, 
      int dy1, 
      int dx2, 
      int dy2, 
      int sx1, 
      int sy1, 
      int sx2, 
      int sy2, 
      Color bgcolor, 
      ImageObserver observer) 

Но, похоже, что он будет рисовать только квадратный подраздел. Кто-нибудь, возможно, знает более простой способ, чем рисовать тонны маленьких квадратов, чтобы создать иллюзию круга?

Благодаря

+1

Почему бы просто не наложить черное изображение с прозрачной частью посередине? http://i.imgur.com/eOmFF.png – jonmorgan

+0

Для получения кода о том, как создать такое изображение, проверьте мой ответ. –

ответ

1

Вы можете сделать это с помощью метода setClip() в Graphics.

Она нуждается в какой-либо другой работы, но:

import java.awt.Graphics; 
import java.awt.geom.QuadCurve2D; 
//... 

    g.setClip(new QuadCurve()); // Set the bounding curve for the image. 
    g.drawImage(...); 

Как я уже сказал, что нужно больше работать, означая QuadCurve2D объект, возможно, необходимо определить по-разному, но вы можете check the doc для этого.

+0

Я рассмотрю это. Спасибо. Как вы думаете, я могу заменить Ellipse2D вместо QuadCurve? –

+0

Я не уверен, я действительно не смотрел в нее так сильно. Если 'Ellipse2D' реализует' Shape', то он будет работать. – Jon

+0

Хорошо, я поиграю с ним в течение часа или двух. Благодаря! –

0

Это не является отличным решением, но что, если вы нарисовали весь пол, то черное изображение с прозрачным отверстием в центре?

+0

Я как бы думал об этом, но я хотел бы найти другой способ, если это вообще возможно. Плюс, если только я не сделал это изображение в Photoshop, это все равно оставляет меня проблемой кругового отверстия. Я бы хотел сделать это на Java, желательно. –

1

Наилучшим эффектом для радиуса света будет использование наложения с градиентом в его альфа-канале.

Что-то вроде этого:

// do this once during setup 
overlay = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGBA); 
for (int x = 0; x < width; ++x) 
{ 
    for (int y = 0; y < height; ++y) 
    { 
     double range = 100; 
     double distance = Math.sqrt(Math.pow(x - width/2, 2) + Math.pow(y - height/2, 2)); 
     int value = Math.max(100, (int)Math.round(255 - 100 * distance/range)); 
     overlay.setRGB(x, y, new Color(0, 0, 0, value)); 
    } 
} 
.... 
// do this every frame 
gfx.drawImage(overlay, 0, 0, null); 

Я не компилировать это так, что это, вероятно, полна ошибок!

Если вам нужно какое-то «мерцание», вы можете сгенерировать несколько карт и добавить некоторый шум к альфа-значениям. Или даже настройте цвета, чтобы получить теплый свет.

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