2012-03-15 2 views
3

아마도 간단한 질문과 함께 질문. 나는 우주선 (소행성 스타일)을 움직이려고하고있다. 지금은 Graphics2D 회전 메서드를 사용하고 있습니다. 그러나 지금은 내 이미지가 흐릿 해지고 있습니다. 무엇에 대해이 일을 올바르게 수행하는 가장 간단한 방법은 무엇입니까?이미지 회전 애니메이션

public void rotate(double rot) { 
    g = bi1.getGraphics(); 
    Graphics2D g2d=(Graphics2D)g; 
    g2d.rotate(rot, 15, 15); 
    g2d.drawImage(bi1, 0, 0, null);  
} 

public BufferedImage getImage() { 
    return bi1; 
} 
+0

를 사용할 수 있습니다. [** 링크 **] (http://carlfx.wordpress.com/2012/03/29/javafx-2-gametutorial-part-1/). – arttronics

답변

2

는 아핀 변환을 사용하여 시도 (. 된 GetImage 방법 매번 화면이 갱신 호출되는, 상기 회전 방법은 사용자 프레스 좌우마다 호출되는 오른쪽 BI1 이전에 판독되는 BufferedImage이다)

  public void paint(Graphics g) { 
     // clear off screen bitmap 
      super.paint(g); 
      // cast graphics to graphics 2D 
      Graphics2D g2 = (Graphics2D) g; 
      AffineTransform tfm = new AffineTransform(); 
      tfm.rotate(0,0,0); 
      g2.setTransform(tfm); 
      g2.drawImage(backImage, 0, 0, this); 
      tfm.rotate(Math.toRadians(player.angle+90), player.x+32, player.y+32); 
      g2.setTransform(tfm); 
      g2.drawImage(tank, player.x, player.y, this);       
  } 

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/geom/AffineTransform.html

+0

불행히도 이것은 여분의 쓰레기를 생성한다는 것을 제외하고'Graphics2d.rotate()'를 사용하는 것과 같습니다. 'Graphics2D'는 빌트인 AffineTransform을 가지고 있습니다. 동일한 렌더러에서 둘 이상이 필요하면 자신 만 할당하면됩니다. – Gene

2

당신이 '권리'작동하도록 할 수있는 일이없는 것보다 당신은 Graphics.setRenderingHint (노는 시도)와 높은 품질을 설정하지만, 다른 수 .

Graphics2D에서 제공하는 품질이 사용자의 요구를 충족시키지 못하면 그래픽 프로그램을 사용하여 '우주선'의 회전 이미지를 만들고 우주선의 방향에 따라 올바른 미리 회전 된 이미지를 선택하십시오. 이렇게하면 품질은 더 이상 그래픽 API에 의존하지 않고 그래픽 프로그램에서만 (그리고 회전 된 이미지를 만들기 위해 얼마나 많은 노력을했는지) 결정됩니다. 각도에 대한 세밀한 정도 (미리 렌더링 된 이미지의 수)를 결정해야합니다. 보통 숫자는 16에서 64 사이입니다.

1

나는 Graphics2D.setRenderingHint()에 대한 제안에 동의합니다. VALUE_INTERPOLATION_BILINEAR으로 KEY_INTERPOLATION을 시도하십시오.

또한 원본 이미지를 실제로 그리려하는 것보다 최대 4 배 크기로 만든 다음 회전 이외에도 Graphics2D.scale(1/multiple)을 사용하십시오.

이유 : 크기 조정을하지 않으면 픽셀의 대각선이 가장자리의 1.4 배 이상이므로 회전이 홀수 45도 배수에 가까워지면서 이미지의 14 개 픽셀이 단지 10 개를 참조하여 그려집니다 원본 이미지에서. 이것은 결과에 불투명 함을 더합니다.

다른 방법은 모두 소스 및 목적지 BufferedImage을 사용하는 것이다

tx = new AffineTransform(); 
    tx.rotate(theta, xCenter, yCenter) 
    op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); 
    BufferedImage destImg = op.filter(srcImg, null); 

마지막 OpenGL로 전환 (예를 들어 JOGL 또는 LWGL로), 안티 앨리어싱 제어 등등의 모든 종류를 제공한다. 반면에 많은 그래픽 드라이버에는 OpenGL 버그 IME가 있기 때문에 하드웨어 비 호환성 문이 열립니다.

0

우주선 이미지를 저장하고있는 BufferedImage의 그래픽 컨텍스트에 그리는 중입니다.

게임이나 다른 버퍼의 컨텍스트를 표시하는 UI 구성 요소의 그래픽 컨텍스트를 그리면 rotate 메서드를 사용해야합니다.

0

당신은 당신의 자바 기반 버전에 대한 통찰력을 제공 할 수있는 소행성 게임이 자바 FX 튜토리얼 우연히 getRotateInstance(double theta)

public void paint(Graphics g) { 
    ... 
    Graphics2D g2d = (Graphics2D)bi1.getGraphics(); 
    AffineTransform af = new AffineTransform(
     AffineTransform.getRotateInstance(theta, x, y)); 
    g2d.setTransform(af); 
    g2d.drawImage(bi1, af, this); 
} 

docs: AffineTransform (getRotateInstance)

관련 문제