2014-02-17 3 views
0

Я пытаюсь создать простую программу, которая отображает изображение растрового зомби, а затем вращает его вокруг, используя AffineTransform и Thread. Я следовал примеру, который я должен был выполнить, но всякий раз, когда я запускаю программу, растровое изображение зомби просто вращается один раз и останавливается. Кроме того, по какой-то причине, когда я рисовал растровое изображение зомби, изображение частично выходит за экран вдоль оси y.Как повернуть растровое изображение с помощью AffineTransform

Итак, мои вопросы: почему растровое изображение не вращается и почему это растровое изображение с экрана.

код выглядит следующим образом:

import java.awt.*;// Graphics class 
import java.awt.geom.*; 
import java.net.*;//URL navigation 
import javax.swing.*;//JFrame 
import java.util.*;//Toolkit 

public class BitMapZombies2 extends JFrame implements Runnable 
{ 
    private Image zombieOneRight; 
    Thread zombieRun; 


    public static void main (String[] args) 
    { 
     new BitMapZombies2(); 
    } 

    public BitMapZombies2() 
    { 
     super("Bit Map Zombies..RUN FOR YOUR LIFE!!!"); 
     setSize(800,600); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Toolkit Zkit = Toolkit.getDefaultToolkit(); 

     zombieOneLeft = Zkit.getImage(getURL("_images/_production_images/zombie_1_left_75h.png")); 
     zombieOneRight = Zkit.getImage(getURL("_images/_production_images/zombie_1_right_75h.png")); 

     zombieRun = new Thread(this); 
     zombieRun.start(); 

    } 

    AffineTransform zombieIdentity = new AffineTransform(); 

    private URL getURL(String filename) 
    { 
     URL url = null; 
     try 
     { 
      url = this.getClass().getResource(filename); 
     } 
     catch (Exception e) {} 
     return url; 
    } 

    public void paint(Graphics z) 
    { 
     Graphics2D z2d = (Graphics2D) z; 
     AffineTransform ZombiePowered = new AffineTransform(); 

     z2d.setColor(Color.BLACK); 
     z2d.fillRect(0,0, 800, 600); 

     ZombiePowered.setTransform(zombieIdentity); 
     ZombiePowered.rotate(2,37.5,37.5); 
     z2d.drawImage(zombieOneRight,ZombiePowered,this); 
    } 

    public void run() 
    { 
     Thread zT = Thread.currentThread(); 
     while (zT == zombieRun) 
     { 
      try 
      { 

       Thread.sleep(500); 
      } 
      catch(InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 

      repaint(); 
     } 
    } 


     } 

Цените любую помощь я могу получить на это.

ответ

0

Комментируя свой код:

AffineTransform ZombiePowered = new AffineTransform();//Create an Id. transform 
    ZombiePowered.setTransform(zombieIdentity);//Set it as a copy of an Id. transform 
    ZombiePowered.rotate(2, 37.5, 37.5);//Concatenate the rotation with the Id. transform 
    z2d.drawImage(zombieOneRight, ZombiePowered, this);//Apply the rotation 

Так ваши всегда вращающиеся 2rads вашего изображения. Если вы сделаете это задание в конце методы краски:

  zombieIdentity = ZombiePowered; 

в следующий раз вы рисуете изображение будет Rotate 2rads больше. О проблемах с позицией, взгляните на циклическом сдвиг Javadoc:

сцепляется это преобразование с преобразованием координат, которая вращается вокруг якорной точки. Эта операция эквивалентна переводу координат так, чтобы точка привязки находилась в начале координат (S1), затем вращала их вокруг нового источника (S2) и, наконец, переводила так , что промежуточное происхождение восстанавливается в координатах оригинальный якорный пункт (S3).

Эта операция эквивалентна следующая последовательность вызовов:

translate(anchorx, anchory);  // S3: final translation 
rotate(theta);     // S2: rotate around anchor 
translate(-anchorx, -anchory); // S1: translate anchor to origin 

Надеется, что это помогает.

+0

Спасибо, что позаботились о ротации, мне нужно сделать немного больше исследований, чтобы понять комментарии, но теперь у меня есть место для начала. Изображение по-прежнему отображается частично на экране, даже при 0 вращении. –

+0

С вращающейся работой я решил использовать эту информацию и применить ее к переводу. Я заменил ZombiePowered.rotate (2, 37.5, 37.5); с ZombiePowered.translate (5,0) ;. У меня все еще было движение, на этот раз по экрану, но одна вещь, которую я заметил, - это первый раз, когда изображение рисуется, местоположение намного больше, чем 5 пикселей от 0,0 точки.Итак, как я могу заставить изображение начинать с 0,0, а затем переводить его по 5 пикселей за раз. Кроме того, изображение все еще сидит высоко на оси y с частью экрана сидения. Любая идея, как исправить это или что может быть причиной этого. –

0

После того как вы создали преобразование, необходимо применить его к графическому контексте ...

public void paint(Graphics z) 
{ 
    //... 
    z2d.setTransform(ZombiePowered); 
    //... 
} 

После применения преобразования, он будет влиять на все окрашенные в Graphics контекст после того, как это так, Вы необходимо сбросить его или изменить его. Там много способов сделать это, но проще было бы создать копию Graphics контекста и просто dispose его, когда вам больше не нужно ...

public void paint(Graphics z) 
{ 
    Graphics2D z2d = (Graphics2D) z.create(); 
    //... 
    z2d.dispose(); 
} 

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

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