2014-01-06 90 views
1

使用簡單的Java 2D遊戲。坦克由用戶控制。它可以以任何角度旋轉,並沿該角度的方向移動。精靈旋轉時邊界框不旋轉

我正在爲坦克製作一個邊框,所以後來我可以添加碰撞檢測。目前,我在無論哪裏都有精靈,但精靈旋轉時它不會旋轉。我試圖添加代碼以使該框與精靈一起旋轉,但添加此代碼只會使邊框變得瘋狂。它不再像盒子一樣出現,更像是一條只閃爍和四處移動的線條。

(顯然,邊界框應該是不可見的,但現在我正在屏幕上繪製它以檢查問題)。

xcoo[]ycoo[]都是double類型,每個都有四個值。這些值是邊界框的四個頂點的座標(矩形形狀Path2D)。

(請注意,只創建了一個實際邊界框時,需要在屏幕上繪製,或在我還沒有寫的碰撞檢測。大多數時候,它只是座標。)

坦克的move()方法被稱爲遊戲循環的每個週期。

move()方法更新精靈的位置和邊界框的位置。這工作正常。但正如我所說,試圖在該方法旋轉邊框(又名操縱它利用旋轉矩陣頂點),使得它走

這裏是Tankmove()方法:

public void move(){ 

    // Updates the location of the sprite. (works) 
    x += dx; 
    y += dy; 

    bbCenterX += dx; 
    bbCenterY += dy; 

    // Updates the location of the bounding box. (works)  
    for(int i=0;i<4;i++){ 
     xcoo[i] += dx; 
     ycoo[i] += dy; 
    } 

    // Should rotate the bounding box (aka, manipulate it's coordinates 
    // so when it is created with these coordinates, it's rotated). 
    // (Doesn't work). 
    for(int z=0;z<4;z++){ 

     xcoo[z] = xcoo[z] - bbCenterX; 
     ycoo[z] = ycoo[z] - bbCenterY; 

     xcoo[z] = ((xcoo[z] * Math.cos(angle)) - (ycoo[z] * Math.sin(angle))); 
     ycoo[z] = ((xcoo[z] * Math.sin(angle)) + (ycoo[z] * Math.cos(angle))); 

     xcoo[z] = xcoo[z] + bbCenterX; 
     ycoo[z] = ycoo[z] + bbCenterY; 

    } 

} 

什麼問題我的輪換?我懷疑這是問題出現的代碼部分,但如果你有不同的想法,請告訴我發佈更多代碼。

非常感謝

+0

提醒我一個故事,我的商業藝術家叔叔告訴我約1970年。他正在製作一些最早的電腦圖形的電視廣告(卡車)。極客們首先讓卡車車輪滾到屏幕上,然後卡車車身下降到車輪上。然後輪子滾開,留下(哎呀!)卡車車身站在那裏。他們在第二次考試中正確無誤。 –

回答

1

回答你的問題的標題 - 當精靈旋轉

在計算機圖形邊框的最常見的實現邊界框不旋轉是Axis-aligned minimum bounding box這明顯當你旋轉你的精靈時不會旋轉,因爲它是軸對齊的

我不知道你使用的是什麼實現Java 2D包,但肯定聽起來像這樣,而不是你想要的Arbitrarily oriented minimum bounding box

也許你的邊界框的渲染不知何故假設它是axis-aligned,因此當你用不是axis-aligned的方框顯示時渲染失敗。

+0

不,可悲的是我需要邊界框旋轉,因爲精靈必須旋轉並且邊界框必須包含所有精靈並且只包含精靈。我希望我能使它成爲一個軸對齊的矩形,這會讓我更容易。 當你看我的輪換代碼時,你看到有什麼問題嗎? – user3150201