2

構造物を作りたいという2Dゲームを作っています。プレイヤーは特定の構造から利益を得ることができなければなりません。今日のゲームは次のようになります。

ここに画像の説明を入力してください (青い点はプレーヤー、他の点はaisです)

Structureという名前のクラスとStructureから継承する他の3つのクラスを作成しました。これらのクラスは多かれ少なかれ空です。ゲームのタイルには、Tileという名前の独自のクラスがあります。このクラスで私はいくつかのことを書きましたが、興味のあるコードはこれです:

public LinkedList<Structure> Structures = new LinkedList<Structure>();

構造(たとえば暖炉)を構築すると、コードは次のようになります。

Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.
    AddFirst(new Fireplace());

私がよくわからないのは、リストに暖炉(Fireplaceという名前のクラス)やその他の建物が含まれているかどうかを確認する方法です。たとえば、プレーヤーがタイルに暖炉を見つけた場合、彼/彼女は暖かさを取り戻します。これは動作しません。おそらく私はこれらすべてに対して間違ったアプローチをとっています。どちらの場合でも、コード例を教えてください。

答えの結論:

bool anyFireplace = Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.OfType<Fireplace>().Any();
if (anyFireplace)
{
    Warmth = MaxWarmth;
}
else
{
if (Warmth > 0)
{
    Warmth--;
}
else
{
    HP--;
}
}
4

5 に答える 5

2

たとえば、次のように使用できEnumerable.OfType<TResult>()ますEnumerable.Any(TSource)

LinkedList<Structure> structures = new LinkedList<Structure>();

// Add Different Types of Structures

Boolean anyFireplace = structures.OfType<Fireplace>().Any();

次のことを確認してください。

using System.Linq;

ソースの上部にあるusingディレクティブとSystem.Coreアセンブリモジュールへの参照。LinkedList内の暖炉の正確な数を知る必要がある場合は、Count()メソッドを使用することもできます。そうでない場合、LinqオブジェクトではAny()の方が効率的です。

于 2013-01-12T20:03:58.003 に答える
2

isキーワードを使用することをお勧めします。変数が特定の型を持っているかどうかを確認するために使用されます。例えば:

object example = "Hello World!";
bool isString = example is string; // Evaluates to true

そして、それをコードでそのまま使用できます。

foreach (Structure s in Structures)
{
    if (s is FirePlace)
    {
        // Warmup the player
    }
}

また、 (一般的に)の方がはるかに高速であるため、List<T>の代わりに を使用することをお勧めします。LinkedList<T>List<T>

他のいくつかの回答から得たかもしれないように、複数の方法がここローマにつながっています。ただし、このテストによると、それisを行う方法は、他のすべての提案された方法よりも優れています (このテストの Hogan btw に感謝します)。

OfType 時間: .6702958、GetType 時間: .2268946、プロパティ時間: .1400208、Is 時間: .1112995

そして、このようにisきれいな私見。

于 2013-01-12T19:30:59.763 に答える
1

これには LINQ to Objects を使用できます。

LinkedList<Structure> list = ...

List<Fireplace> fireplaces = list.OfType<Fireplace>().ToList();

fireplacestype のリスト内のすべての要素のリスト、Fireplaceまたは存在しない場合は空のリストです。

存在するかどうかだけを知りたい場合は、これを次のように適応させることができます。

bool hasFirplace = list.OfType<Fireplace>().Any();
于 2013-01-12T17:17:14.503 に答える
0

おそらく、クラス名でオブジェクトを説明することはお勧めできません。ちょっと遅いリフレクションを使用する必要があります。そして、1 つの説明 (クラス名) しか得られません。1つ以上が必要になります。次のような基本オブジェクトを検討することをお勧めします。

public abstract class MapObject
{
   public int x,y;  // object location
   public string myclass;  // object class
   public string mytype;   // object type
   // etc

   // constructor
   public MapObject(string myclass, string mytype);

}

次に、暖炉はこのように見えるかもしれません

public class FirePlace : MapObject
{
   public FirePlace() 
       : base("Builtin furniture", "Fireplace") { }
   // etc
}

これで、mytype = "Fireplace" のものに対してすべての MapObject をループできるようになりました。

于 2013-01-12T17:18:49.683 に答える
-1

Type を使用して、次のことを知ることができます。

foreach(var s in Structures)
{
  var type = s.GetType();
  if(type == typeof(FirePlace)
  {
    (your code here)
  }
}

単一のメソッドの場合

public bool HasType<T>(IEnumerable<T> list, Type t)
{
    return list.Any(e=>e.GetType() == t);
}

使用法は次のようになります。

if(HasType(Structures,typeof(FirePlace))
{
  (code here)
}

最後に、これを拡張メソッドに変えることができますが、そのオプションはあなたに任せます ;)

于 2013-01-12T17:16:57.187 に答える