2016-12-26 6 views
0

私はコーディングでロードブレイクを犯しています。私はC#でコーディングして、Monogameでプログラムを作っています。リスト内の特定のオブジェクトへの読み込み/書き込み可能な参照の保存

私はユニットのリストを持っており、私はそれらを使ってマウスピッキングをしようとしています。私は、マウスからスクリーンに光線を投射し、どのオブジェクトが最初に遭遇するのかを見つける。

// A method to find which units are currently under the mouse. 
    static public void FindPickedUnits(string ID) 
    { 

     foreach (Unit unit in ListDictionary[ID]) 
     { 

      // Run the code to check whether or not it is picked, and returns a float representing how close it is. 
      unit.IsPicked = Cursor.Pick(unit.Collisions); 

      // And if it is picked... 
      if (unit.IsPicked != null) 
      { 

       // We will clone it as the closest unit if none exist, or... 
       if (ClosestUnit == null) 
       { 

        ClosestUnit = unit; 

       } 

       // if one already does, overwrite it if it's even closer. 
       else if (unit.IsPicked < ClosestUnit.IsPicked) 
       { 

        ClosestUnit = unit; 
        Console.WriteLine("The new closest unit is at X" + unit.Position.X + " Y" + unit.Position.Y); 

       } 
      } 
     } 
    } 

    // elsewhere... 

    Console.WriteLine("The selected unit's color is " + ClosestUnit.Tint); 

このコードは、選択したユニットをClosestUnitオブジェクトにクローンします.ClosestUnitオブジェクトは、問題なく使用できます。

もつとも

私は、私は彼らに書きたい、純粋に最も近い単位の値を読みたい、そのうちのいくつかを変更しないでください。しかし、ClosestUnitオブジェクトの値を変更した場合、それはリストの単位の実際の単位に反映されません。

TL; DR単位のリストから1つの単位を単体化して、コードの別の場所に書き込むことができるようにします。 ClosestUnitオブジェクトがrefパラメータに類似して機能する場合、実際のユニットを直接参照することはできませんが、これを行う方法はわかりません。

この問題を処理する、または回避する最も効率的な方法は何ですか?

+0

'Unit'はクラスまたは構造体ですか? – Klinger

+0

私はデフォルトでそれをクラスにしましたが、おそらくそれを構造体tbhに変更することができます。どうして? – Charybdizs

+0

この問題を抱えているのがわかる方法の1つは、Unitが構造体の場合です。クラスは参照渡しされ、オブジェクトの参照にアクセスできる場合はそのプロパティを変更できます。もう1つの可能性は、ListDictionaryがそれを返す前に 'Unit'のインスタンスを複製することです。 – Klinger

答えて

0

皮肉なことに、いつも自分のコードに間違いはありませんでした。 ClosestUnitオブジェクトは、クラス(参照型)であるという性質上、ListDictionary内のユニットを直接参照していたのではなく、そのクローンであることに気づいていませんでした。

ClosestUnitオブジェクトの値を変更するだけで、元の状態に戻すことができます。わーい!

関連する問題