2013-12-17 48 views
0

spriteManager是我擁有的外部類的實例,要訪問PlayerHelath和selectedFrameOffset,我必須重新開始:spriteManager。多次。達到外部價值?

if (spriteManager.PlayerHealth == 3) 
     spriteManager.selectedFrameOffset = 0; 
    else if (spriteManager.PlayerHealth == 2) 
     spriteManager.selectedFrameOffset = 30; 
    else if (spriteManager.PlayerHealth == 1) 
     spriteManager.selectedFrameOffset = 60; 
    else if (spriteManager.PlayerHealth == 0) 
     spriteManager.selectedFrameOffset = 90; 

是否有機會引用spriteManager的使用。只有一次,並最終與此:代碼,以獲得更多的可讀性?

if (PlayerHealth == 3) 
     selectedFrameOffset = 0; 
    else if (PlayerHealth == 2) 
     selectedFrameOffset = 30; 
    else if (PlayerHealth == 1) 
     selectedFrameOffset = 60; 
    else if (PlayerHealth == 0) 
     selectedFrameOffset = 90; 
+0

請指出爲什麼這個用戶得到了一個downvote。用戶顯然是新的。請教育新人,而不是猛烈抨擊。 – Subby

+0

如果'PlayerHealth'不在[3,2,1,0]中會發生什麼? –

回答

3
spriteManager.selectedFrameOffset = GetFrameOffset(spriteManager.PlayerHealth); 

private int GetFrameOffset(int playerHealth) 
{ 
    return (3 - playerHealth) * 30; 
} 
+0

很好的隱藏邏輯 –

+2

@SergeyBerezovskiy抱歉重新使用你的代碼:),但你的「開關」解決方案似乎更合適,因爲我的方法可以返回負值。 – daryal

+1

這沒關係)我已經在我的解決方案中引用了你的偉大的捕獲,當然,upvoted你:) –

7
spriteManager.selectedFrameOffset = GetFrameOffset(spriteManager.PlayerHealth); 

在哪裏得到偏移量是簡單的開關

private int GetFrameOffset(int playerHealth) 
{ 
    switch(playerHealth) 
    { 
     case 3: return 0; 
     case 2: return 30; 
     case 1: return 60; 
     // etc 
     default: 
      throw new ArgumentException(); 
    } 
} 

也可考慮移動該邏輯進入SpriteManager類。例如。你可以計算出selectedFrameOffset屬性根據當前的健康值:

public int selectedFrameOffset 
{ 
    get 
    { 
     switch(PlayerHealth) 
     { 
      case 3: return 0; 
      case 2: return 30; 
      case 1: return 60; 
      // etc 
      default: 
       throw new ArgumentException(); 
     } 
    } 
} 

由於@daryal在你的if..else塊注意到隱藏的邏輯,我會去用SpriteManager類以下解決方法:

private const int frameOffset = 30; 

public int SelectedFrameOffset 
{ 
    get 
    { 
     if (PlayerHealth <= 3) 
      return (3 - PlayerHealth) * frameOffset; 

     return defaultValue; // or throw 
    } 
} 
+0

等待,您的最新編輯(與算術)產生負面結果playerhealth <3 ... – elgonzo

+0

@elgonzo同意。如果健康的價值不是0,1,2或3,很難說出會發生什麼。也許使用一些默認值。或者它根本不可能是其他值。無論如何,添加支票 –

+0

hehe,你需要一些咖啡,我想:)))只需要在@ daryal的答案中轉一下減法。 '3-playerHealth'而不是'playerHealth-3' - 這將產生與OP示例代碼中相同的結果...(但當然不包括[0,1,2,3]之外的值) – elgonzo

1

VB.net中,你可以做這樣的事情:

Dim theCustomer As New Customer 

theCutomer.Name = "Paul" 
theCutomer.City = "New York" 

// or alternativly: 

With theCustomer 
    .Name = "Paul" 
    .City = "New York" 
End With 

但是在C#中沒有辦法做到這一點。 在C#中,你可以使用更短的變量名:

SpriteManager sp = new SpriteManager(); 
sp.selectedFrameOffset = 90; 

switch -statemets等優化你的代碼像謝爾蓋所示。