2012-11-19 33 views
2

我即將提出的問題可能會有些困難。我會盡力使這個儘可能清晰和有凝聚力。遊戲編程難度很大的數學問題

我目前做一個遊戲,在其中我有一個「激光環,」如下所示:

A laser ring

這種激光環,提示時,將觸發一個「抓鉤」,這是簡單地如下圖所示。調整此圖片的frame.width屬性以使其發火(拉長)和縮回(縮短)。它的寬度從0開始,隨着幀的進展,它會延長到達到所需的點。

enter image description here

這抓鉤,解僱的時候,應該讓他們看起來是一個項目排隊與環。請參閱下面的圖片爲清楚:

enter image description here

*注意抓鉤的寬度改變幾乎每一個幀,所以一定的寬度不能假設。

還有一點要注意的是,由於難以解釋的原因,我只能訪問擒縱鉤的frame.center屬性,而不是frame.origin屬性。

所以,我所有的問題都是這樣的:我怎樣才能只訪問抓鉤的frame.center.xframe.center.y屬性,將它放在激光環周圍,看起來好像從環上無縫延伸如上圖所示 - 大概是根據任何給定幀的抓鉤的角度和寬度來計算的?

任何幫助非常感謝。

+0

我有點知道如何做到這一點,但我真的不知道如何解釋給你。下面是一個線索:座標(Radius * cos(theta),Radius * sin(theta))給出與圓心成θ角的圓周上的點。 –

+0

你應該在數學堆棧交換中發佈這個。 –

+0

如果只能訪問中心,您如何旋轉抓鉤(更改其角度)? –

回答

6

好吧,我在我自己的應用程序中完成了同樣的事情。

我做的更簡單的訣竅是有一個函數來計算該行的「unitVector」。

即行矢量變化基礎上的1

它只是使用簡單pythagorus線路長度...

- (CGSize)unitVectorFromPoint:(CGPoint)start toPoint:(CGPoint)end 
{ 
    //distance between start an end 
    float dX = end.x - start.x; 
    float dY = end.y - start.y; 
    float distance = sqrtf(dX * dX + dY * dY); // simple pythagorus 

    //unit vector is just the difference divided by the distance 
    CGSize unitVector = CGSizeMake(dX/distance, dY/distance); 

    return unitVector; 
} 

注...這並不重要全面開始和結束都是平方,數字只會給出正值。

現在,您可以使用此向量來沿着兩點之間的線(圓的中心和目標)之間的任何點。

因此,該行的開始是......

CGPoint center = // center of circle 
CGPoint target = // target 
float radius = //radius of circle 

float dX = center.x - target.x; 
float dY = center.y - target.y; 

float distance = sqrtf(dX * dX + dY * dY); 

CGSize unitVector = [self unitVectorFromPoint:center toPoint:target]; 

CGPoint startOfLaser = CGPointMake(center.x + unitVector.x * radius, center.y + unitVector.y * radius). 

CGPoint midPointOfLaser = CGPointMake(center.x + unitVecotr.x * distance * 0.5, center.y + unitVector.y * distance * 0.5); 

這只是乘以你想能走多遠(半徑)去在那個距離行點的單位向量。

希望這有助於:如果你想在兩個點之間的中點d

,那麼你只需要改變「半徑」是要計算距離,它會給你的中點。 (等等)。

+0

這是一個非常乾淨的做法。我希望我能再次提升這一點。 –

+0

感謝:D我必須在我的Sudoku Wiki應用程序中完成相當多的操作,並且它達到了我在各處進行計算的地步。最後,我寫了幾個函數在各地重用。 – Fogmeister

+0

我正在考慮使用三角函數,但這太令人困惑。這個更好。 –