2012-12-12 40 views
1

我有一個Arraylist對象,其中包含我想要使用Graphics2D在屏幕上繪製的對象的位置和旋轉。如何在Java中正確旋轉多個對象?

public void render(Graphics g1) { 
Graphics2D g = (Graphics2D) g1; 
g.setColor(Color.white); 
for(PhysicObject object : entities) { 

if (object.getBody().getType() == BodyType.DYNAMIC) { 
      Vec2 position = object.getBody().getPosition().mul(30); 
      g.translate(position.x, position.y); 
      g.rotate(object.getBody().getAngle()); 
      g.fillRect((int)-(object.width), (int)-(object.height), (int)(object.width*2), (int)(object.height*2)); 
     } 
    } 

} 

第一個對象總是旋轉正確,但下面的內容圍繞第一個旋轉而不是圍繞自己。

希望有人能幫助我,謝謝。

回答

5

要獨立旋轉每個對象,必須撤消第一個對象的平移和旋轉。所以最簡單的方法是使用AffineTransform來「結合」這兩個轉換並簡化它們的撤銷。例如

AffineTransform t = new AffineTransform(); 
    t.translate(position.x, position.y);   
    t.rotate(object.getBody().getAngle()); 
    g.transform(t); 
    g.fillRect((int)-(object.width), (int)-(object.height), (int)(object.width*2), (int)(object.height*2)); 
    try{ 
     g.transform(t.createInverse()); 
    }catch(NoninvertibleTransformException e){ 
     //... 
    } 

的createInverse()創建了「相反」轉化,並返回圖形空間到其原始狀態。然後下一個轉換應該可以正常工作。

+0

非常感謝你! – user1734282

0

當您translaterotate這會永久影響您的圖形對象。請務必在撥打fillRect之後將原始來源和方向轉換並旋轉至原始位置。

g.translate(-position.x, -position.y); 
g.rotate(-object.getBody().getAngle()); 
0

不要使用Graphics上下文旋轉方法,而應嘗試使用AffineTransformation

您將需要重置每個循環上的變換。

什麼會更好是利用形狀API和改造形狀,而不是