特定の部分にのみアクセスする必要があるオブジェクトがある場合、その特定の部分だけを渡す必要がありますか、それともオブジェクト全体を渡す必要がありますか?
私の場合、XNA を使用して C# でゲームを構築しており、「DrawLayer.cs」の Camera クラスの「境界」にアクセスする必要があります。これは、単一のレイヤーを描画するクラスです (視差のために複数のレイヤーがあると仮定します)。ゲームの画面に。カメラの「境界」は、以下のプロパティとして存在します。
public Rectangle Bounds { get { return onScreenCamera.Bounds; } }
このゲームは、アクションに応じてプレイヤー間でジャンプするカメラを持つマルチプレイヤー ゲームであるため、「onScreenCamera」は現在使用する必要があるカメラを参照します。また、カメラの機能はプレイヤーのタイプによって異なるため、ここで説明しているカメラが実装するインターフェイス ICameraSetup.cs を作成しました。ICameraSetup インターフェイスは次のとおりです。
interface ICameraSetup
{
Vector2 Position { get; }
Rectangle Bounds { get; }
void Update(GameTime pGameTime);
}
DrawLayer.cs では、コンストラクター ヘッダーを次のように記述したいと思いました (Rectangle は構造体であり、値型であることを意味することに注意してください)。
public DrawLayer(ref Rectangle pBounds)
そしてコンストラクター呼び出しでは、次のようになりました。
new DrawLayer(ref levelState.Camera.Bounds)
これは、カメラの境界のみを DrawLayer.cs に渡すことになりますが、「プロパティ Game.Camera.ICameraSetup.Bounds には setter がありません」というエラーが発生しているようです。問題は、境界を設定できる唯一のクラスがカメラクラスであり、境界が設定される方法が上記のカメラクラスのプライベート変数を介して行われるため、インターフェイスで境界のセッターを宣言したくないことです。 、「onScreenCamera」と呼ばれます。
しかし、Set を Bounds プロパティに追加しても、DrawLayer.cs コンストラクター呼び出しで「'ref' 引数は変数として分類されていません」というエラーが発生します。
さて、私が知っている解決策の 1 つは、次のように、カメラ全体を DrawLayer.cs に渡し、そこから境界を使用することです。
public DrawLayer(ICameraSetup pCamera)
それから
new DrawLayer(levelState.Camera)
次にCamera.Boundsを使用しますが、必要なのはそのクラスの境界だけなので、これは不要のようです。
私が抱えている可能性のある別の問題は、参照渡しの理解にあります。渡したクラスの外部で値に加えられた変更に合わせて値型参照を更新する必要がある場合に役立つことを理解しましたが、それが逆であることも読みました。最初に宣言された場所の外で値の型を変更し、同じままにします。
カメラの境界の DrawLayer への参照渡しを間違えているのでしょうか?