2012-12-07 87 views
0

我只是尋找任何可以使這段代碼更好的推薦。如果我以這種方式繼續前進,將會是一段我認爲可以避免的代碼,但現在這種方式已經超出了我的想象。這會很快失去控制。如何讓這段代碼更容易處理碰撞音頻?

public enum PhysicMaterialType 
{ 
    SoundFailure = 0, 

    AsteroidBall, 

    BalloonRubber 
} 

public void PlaySoundBasedOnCollision (PhysicMaterialType phyMatA, PhysicMaterialType phyMatB) 
{ 
    switch (phyMatA) 
    { 
     case PhysicMaterialType.AsteroidBall: 
      { 
       CheckAsteroidBallCollision (phyMatB); 

       break; 
      } 
     case PhysicMaterialType.BalloonRubber: 
      { 
       CheckBalloonRubberCollision (phyMatB); 

       break; 
      } 
    } 

} 

void CheckAsteroidBallCollision (PhysicMaterial phyMatB) 
{ 
    switch (phyMatB) 

    { 
     case PhysicMaterialType.AsteroidBall: 
      { 
       //Play AsteroidAsteroidBallSound 

       break; 
      } 
     case PhysicMaterialType.BalloonRubber: 

      { 
       break; 
      } 
    } 
} 
+0

如果'phyMatA'是一個AsteroidBall和'phyMatB'是一個BalloonRubber,你想要發生什麼? (反之亦然)如果他們都是同一類型,你只有一個聲音播放? –

+0

這只是一個簡短的例子,我現在有大約15種材料可以全部相互碰撞,都可以播放聲音。雖然如果您交換phyMatB命令phyMatA的順序,它將發揮與phyMatA命中phyMatB相同的聲音。 –

回答

1

如果你將有很多的類型,和預期碰撞的聲音之間的不同類型必須在各種不同的方式來處理,考慮獲得從PhysicMaterial一個類你將每種類型實行。在派生類中定義一個公共方法來處理確定要播放的聲音 - 將第二個對象的類型傳遞給此方法。像這樣:

class PhysicMaterial 
{ 
    public virtual string GetCollisionSound (PhysicMaterialType targetType) 
    { 
     // define default behavior here, if derived class doesn't need to do anything special 
    } 
} 

class AsteroidBall : PhysicMaterial 
{ 
    public override string GetCollisionSound (PhysicMaterialType targetType) 
    { 
     ... 
    } 
} 

class BalloonRubber: PhysicMaterial 
{ 
    public override string GetCollisionSound (PhysicMaterialType targetType) 
    { 
     ... 
    } 
} 

返回任何數據類型最適合您的方案。