2010-07-15 61 views
2

我創建了一個碰撞類來檢測使用像素的碰撞。在我的班級中,我還開發了一些確定校正角度的功能。在此基礎上我創造了一些例子:Actionscript碰撞:解決異常和奇怪的情況

http://megaswf.com/serve/25437/

http://megaswf.com/serve/25436/

(空間來改變重力,左/右給予一定的速度球)

正如你可能會注意到,有這種奇怪的事情發生:

  • 當球的速度很低
  • 當球的方向是 幾乎相切的障礙。

collision http://img514.imageshack.us/img514/4059/colisao.png

上述圖像顯示瞭如何計算碰撞角度。 我把紅點稱爲關鍵點。我搜索最大數量的關鍵點(通常是4)。如果我找到2個以上的關鍵點,則選擇2個關鍵點(如其中一個藍色對象所示)。那就是我如何找到物體碰撞表面的正常角度。我不知道這是否是一種過時的做事方式。

基於該角度,我旋轉速度矢量做彈跳。

的一段代碼做數學是在這裏:

static public function newSpeedVector(speedX: Number, speedY: Number, normalAngle: Number): Object{ 
      var vector_angle: Number = Math.atan2(speedY, speedX) * (180/Math.PI); 
      var rotating_angle: Number = (2*(normalAngle - vector_angle) + 180) % 360; 
      var cos_ang: Number = Math.cos(rotating_angle/DEGREES_OF_1RAD); 
      var sin_ang: Number = Math.sin(rotating_angle/DEGREES_OF_1RAD); 
      var final_speedX: Number = speedX * cos_ang - speedY * sin_ang; 
      var final_speedY: Number = speedX * sin_ang + speedY * cos_ang; 

      return {x_speed: final_speedX, y_speed: final_speedY}; 
     } 

這是新的速度矢量是如何計算的?

我的問題是,有沒有人遇到這樣那樣的問題或對如何避免這種情況有一些想法?

+0

您需要從您的碰撞代碼發佈相關片段 – colithium 2010-07-15 23:12:54

回答

3

沒有看到你的代碼,這是我能提供的最好的。

碰撞物理應該有一些被認爲是「停止」的速度閾值。也就是說,一旦速度變得足夠小,您應該明確標記一個對象停止並將其從衝突代碼中排除。這將有助於穩定緩慢移動的物體。試驗和錯誤是需要一個良好的門檻。

當碰撞發生時,重要的是至少嘗試糾正任何相互滲透。這很可能是切線碰撞行爲奇怪的原因。試圖以合理的方式將碰撞物體從其擊中的位置移開。

確定正常的方法應該可以正常工作。遊戲物理是關於作弊(作弊的方式仍然看起來不錯)。我把它旋轉和摩擦不是你要去的一部分?

試試這個。您的聯繫人正常。當您檢測到碰撞時,計算穿透深度並沿着法線移動物體,以便不再穿透。你可以使用你已經計算的兩點來得到一個滲透點,但你需要計算另一點。對於圓圈很容易(中心點+法線方向的半徑)。有更復雜的方法來解決這個問題,但看看簡單的方法是否適合你。

我已閱讀並推薦這本書:Game Physics Engine Development

+0

添加更多信息:) – jmacedo 2010-07-16 00:00:46

+0

關於小的速度問題,是的,我知道我必須定義一個不同於0的最小速度。但是如果我這樣做球穿透牆壁。所以這一切都是保持在牆外的球... – jmacedo 2010-07-16 13:17:15

+0

也增加了更多的信息 – colithium 2010-07-16 20:39:30

1

我做了一件有點像,並得到了類似的問題。 我所做的是,當來自彈跳對象的像素(您的案例中的球)與來自障礙物的像素重疊時,您需要將球移出障礙物,使它們不重疊。

說球在障礙物上滾動,再次呈現球之前,您需要將其移回「重疊」的量。如果你知道球以何種角度擊中了頑固球,那麼就沿着這個角度移動球。

您還需要添加一些阻尼否則球永遠不會停止。取一個非常小的值,如果球的速度低於該值,則將速度設置爲0.

+0

但是我有多少像素讓球迴歸? 原因可以說:讓它回去,直到它不再接觸表面。但知道這需要一次移動一個像素,並檢查它是否已經沒有觸摸......這對CPU來說是一個非常密集的過程。讓我知道如果我在你的答案中愚蠢或誤解了某些東西.. :)謝謝。 – jmacedo 2010-07-16 00:10:45

+0

你有所需的所有變量來計算你必須遠離「牆」的距離。首先找到兩個「關鍵點」之間的中心點。然後從你的球的中心測量到這個點的距離。然後從你的球半徑減去這個距離,你就有了將球移開的距離。那麼你只需要得到角度來移動它。 – 2010-07-16 03:12:45

+0

這應該適用於各種形狀,不只是球。 – jmacedo 2010-07-16 13:05:05

0

您可以嘗試更多的東西,我認爲這非常有效。

您可以在遊戲對象中創建諸如getNextX()和getNextY()(它們當然會在下次更新後協調其位置),並基於它們的下一個位置而不是當前位置來檢查對象的碰撞。

這樣,物體將永遠不會重疊,你會知道他們什麼時候碰撞,並適度地應用你的碰撞物理後!