2014-02-17 70 views
0

我想創建一個簡單的程序,顯示一個位圖殭屍圖片,然後使用AffineTransform和線程旋轉它。我遵循我必須完成的例子,但是每當我運行該程序時,殭屍位圖只是旋轉一次並停止。此外,由於某些原因,當我繪製殭屍位​​圖時,圖像沿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; 

下一次繪製圖像時,它會旋轉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);.我仍然有動作,這次是在屏幕上,但我注意到的一件事是第一次繪製圖像時,位置遠遠大於0,0點的5個像素。那麼,我怎樣才能讓圖像從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的新實例,這些東西都是容易完全搞砸了......