В настоящее время я пытаюсь рисовать изображения на экране с постоянной скоростью, как в видеоигре.
К сожалению, из-за скорости, с которой движется изображение, некоторые кадры идентичны, потому что изображение еще не переместилось на полный пиксель.
Есть ли способ предоставить Graphics2D значения float
для положения на экране для рисования изображения, а не значения int
?
Изначально вот что я сделал :
BufferedImage srcImage = sprite.getImage ( );
Position imagePosition = ... ; //Defined elsewhere
g.drawImage ( srcImage, (int) imagePosition.getX(), (int) imagePosition.getY() );
Это, конечно, пороговые значения, поэтому изображение не перемещается между пикселями, а перескакивает от одного к другому.
Следующий метод заключался в том, чтобы вместо этого установить цвет краски на текстуру и рисовать в указанной позиции. К сожалению, это привело к неправильным результатам, которые показали скорее мозаичное, чем правильное сглаживание.
g.setRenderingHint ( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
BufferedImage srcImage = sprite.getImage ( );
g.setPaint ( new TexturePaint ( srcImage, new Rectangle2D.Float ( 0, 0, srcImage.getWidth ( ), srcImage.getHeight ( ) ) ) );
AffineTransform xform = new AffineTransform ( );
xform.setToIdentity ( );
xform.translate ( onScreenPos.getX ( ), onScreenPos.getY ( ) );
g.transform ( xform );
g.fillRect(0, 0, srcImage.getWidth(), srcImage.getHeight());
Что мне делать, чтобы добиться желаемого эффекта субпиксельного рендеринга изображения на Java?