2012-06-20 204 views
0

編程語言:JavaJava旋轉動畫

好的,所以我想有一個BufferedImage,無限旋轉。我在問好問題方面還很新,所以請耐心等待。

我有一個名爲手臂的BufferedImage,它是長方形的,我有一個ActionListener是循環重繪()每100毫秒 我的代碼是:

public void paint(Graphics g){ 
    AffineTransform t = new AffineTransform(); 
    t.rotate(Math.toRadians(90),(a­­rm.getWidth()/2)*scale,0); 
    t.translate(300,300); 
    g.drawImage(arm,t,null); 
} 

如果你想知道我調整圖像大4倍所以變量規模= 4.我認爲我的錯誤是我沒有正確映射樞軸點,但我不知道。我真的需要這個爲我的遊戲,所以請幫助我現在很絕望。

+0

你的問題是什麼? – cklab

+0

我很抱歉!這是「我的代碼有什麼問題」。 – JavaMan111

+0

基於Swing使用'paintComponent()'rahted而不是'paint()' – mKorbel

回答

2

新的AffineTransform始終爲零旋轉。您正在添加90度旋轉,因此動畫的每一幀看起來都是一樣的:圖像從正常方向旋轉90度。

您需要計算當前的旋轉角度。

// Instance variable intialized at zero. 
double angle = 0.0; 

// In your ActionListener timer handler increment the angle. 
{ 
    angle += Math.toRadians(5); // 5 degrees per 100 ms = 50 degrees/second 
    while (angle > 2 * Math.pi()) 
     angle -= 2 * Math.pi(); // keep angle in reasonable range. 
} 

public void paint(Graphics g) { 
    // Just use the transform that's already in the graphics. 
    Graphics2d g2 = (Graphics2d) g; 
    g2.setToIdentity(); 
    // The code for your other transforms is garbled in my browser. Fill in here. 
    g2.rotate(angle); 
    g2.drawImage(arm, t, null); 
} 

希望這會讓你更接近。

我會補充一點,100毫秒對於幀率來說相當慢。動畫看起來不平坦。平滑的動作最多需要30毫秒或30幀/秒。使用GPU的遊戲有時會運行超過100 fps。

如果可能的話,您應該在動畫循環中避免使用new。這將需要垃圾收集器更頻繁地運行。這可能會導致動畫中出現口吃。

+0

1+用於更改ActionListener中的角度(可能在Swing Timer中調用)。對於原始海報:考慮創建一堆圖像,存儲它們,並在ActionListener中,只需交換圖像,也許通過交換JLabel中的ImageIcons。 –

+0

謝謝!我不是數學中最亮的,所以我得到角度+ = 5f/180f * 3.1415926f;但是謝謝你,我會盡我所能得到它! – JavaMan111

+0

這與'Math.toRadians(5)完全一樣;'我剛剛編輯過這個。圓是2 * pi,所以半圓(180度)是pi。所以弧度爲π/ 180度。你有5個,所以5 *π/ 180弧度。如果你想做圖形,你必須擁抱數學! – Gene