2015-06-19 34 views
1

當玩家與其中一個收藏品發生碰撞時,我一直試圖讓我的分數正常工作,但碰撞發生時得分似乎沒有改變,我不確定爲什麼會發生這種情況。當碰撞發生時得分不會改變

在我的收藏我有這樣的:

class BlueBall : Obj 
{ 
    public BlueBall(Vector2 pos) 
     : base(pos) 
    { 
     position = pos; 
     spriteName = "BlueBall"; 
     solid = false; 
     score = 0; 
    } 

    public override void Update() 
    { 
     if (!alive) return; 

     Player player = CheckCollisionAgainst<Player>(); 
     if (player != null) 
     { 
      score = score + 20; 
      alive = false; 
     } 

我在Game1級拉絲搭配:

spriteBatch.DrawString(font, "Score: " + score.ToString(), scorePos, Color.White); 

所以,如果玩家碰撞與藍色圓球,20應加得分和藍球隊應該消失,它確實消失,但得分不變,爲什麼呢?

在這一刻我宣佈我的分數在Game1類與public int scoreVector2 scorePos定位它。然後我使用score = 0;初始化分數,然後在更新中加載scorePos值。

+0

你能告訴我們什麼分數是。 – deathismyfriend

+0

@deathismyfriend得分我只是簡單地做了'int得分'並宣佈它將得分設置爲0 – KizzaWellz

+0

並且得分定義在哪裏?這個變量是否真的被繪製?它的範圍是否正確? **沒有足夠的代碼**。 – BradleyDotNET

回答

0

從你的代碼和你的意見中,很明顯實際上有兩個得分變量。一說是由遊戲擁有:

public class Game 
{ 
    private int score; 

    void Draw(...) 
    { 
     spriteBatch.DrawString(font, "Score: " + score.ToString(), scorePos, Color.White); 
    } 
} 

,另一種是由資:

public class BlueBall : Obj 
{ 
    private int score; 

    public void CheckCollisions() 
    { 
     if (collision) 
      score += 20; 
    } 
} 

現在,絕對沒有關於彼此這兩個分數的變量。事實上,他們被命名爲是完全不相關的

爲了做個快速的比喻,想象一下編程對象是盒子。每個變量都是一個「計數器」。您在「遊戲」框中放置一個計數器並將其稱爲「分數」。您將另一個計數器放在「球」框中,並將其稱爲「分數」。顯然,修改「球」框中的計數器不會影響「遊戲」框中的計數器,反之亦然。一般來說,這個概念在編程中被稱爲「範圍」。每個變量的作用域都是它的框,它可以是一個類,函數,甚至是一個使用塊(範圍由{}創建)。

現在你明白這個問題,有幾種方法可以解決這個問題:

  1. 創建全球變量。在C#中實際上不能這樣做,但可以創建其他對象都可以訪問的另一個對象。兩個對象都不是引用/修改它的「分數」屬性。一個簡單的(和窮人的做法)的例子是:

    public static class GlobalState 
    { 
        public static int GameScore { get; set; } 
    } 
    

的所有引用的得分將成爲GlobalState.GameScore。再次,這只是爲了讓你去,這種代碼是非常糟糕的做法,並可能導致錯誤(特別是在多線程情況下)

  1. 讓球在碰撞時產生事件。遊戲將註冊此事件並適當增加其「分數」變量。

  2. 通過ref將遊戲的「分數」變量傳遞給碰撞方法,以便它可以改變它。 警告:這是爲了完整而包含的,這隻應在特定情況下完成,其中您的可能不是其中之一。

  3. 將一個代表傳遞給創建時的球以在需要增加分數時調用。這實際上是事件方法的變體。

我確定還有其他人。考慮到你的經驗水平,我會採用全球方法開始(因爲它是最簡單的並且需要最少的知識),然後轉向瞭解事件並在未來採用這種方法。

+0

我還是不太確定如何實現這個插入我已有的代碼中。我爲Variable創建了新的公共靜態類,但我不知道 – KizzaWellz

+0

@KizzaWellz考慮後應該怎麼做。爲什麼會在「BlueBall」對象內跟蹤玩家分數?爲什麼'Game1'對象存儲玩家的分數? 「玩家」應該有一個公共的'Score'屬性,並且你應該在碰撞時更新它。 – Kcvin

+0

@KizzaWellz另外,我說過要做什麼之後,將'score'的用法更新爲靜態變量。 NETScape是正確的,但是Player對象會比你有更好的設計。 – BradleyDotNET