2012-05-10 7 views
0

私はXNAでゲームを作っています。 私のカメラ、私の背景と私のスクロールクラスは準備ができています。"If(X increase)"機能はありますか?

私が欠けているのは、カメラの位置が変わったときにスクロールするように指示することです。それについての声明はありますか?

同様:

if (cameraposition.X ""Increases"") 
{ 
    Scrolling.Update() 
} 

感謝。

+2

カメラ座席またはX値(サポートしている場合)でイベントを処理するために登録するか、古い値を覚えて比較する必要があります。私はイベントがあるかもしれないと思う? – Rup

+2

私はXNAを実際には知りませんが、 'CameraPosition.Change'イベントのようなものを探します。 – phg

+0

ゲーム開発のイベントには注意してください。通常ポーリングが使用され、フレームごとに目的の状態をチェックするだけです。 – TJHeuvel

答えて

6

古いカメラの位置を把握して、変更されているかどうかを確認する必要があります。であるかどうだからあなた:

if(cameraPosition.X != oldCameraPosition.X) 

のようなあなたがoldCameraPosition変数を更新するすべてのフレームの終わりに:

oldCameraPosition = cameraPosition; 

両方の位置の差は、通常、デルタ、または速度と呼ばれています。今度は、スクロールのためにカメラのDeltaで更新を呼び出すかもしれないので、同じ(または変更された量)をスクロールします。たとえば、

//In Camera.cs 
Scrolling.Update(oldCameraPosition - cameraPosition); 

//In your scrolling class 
void Update(Vector3 offset) 
{ 
background.Position += offset * .5f; 
} 

このように、カメラが移動するたびに、バックグラウンドプレーンが動いて、半分の速度で動きます。そのトリックを異なる修飾子で3回実行すると、パラレックス効果が得られます。

通常は、しかし、例外がゲーム開発のために行うことができ、このためにイベントを使用したいと思います。あなたはすでにイベントループに似たゲームループを持っているので、ポーリングは通常はやり方です。 いずれにしても、最初にカメラの位置を変更するたびにScrolling.Update()と呼ぶだけでいいでしょう。

+4

純粋な "増加"の場合、 'if(cameraPosition.X> oldCameraPosition.X)' – Attila

+0

が船外に出た可能性があります。 – TJHeuvel

+0

@Attila:カメラの位置も小さくなる可能性があるので、!=正しい選択です。 *相違点*がある場合は、その相違点を選択してスクロールに適用します。これが基本的に論理です。 – Tigran

3

それは当然、パフォーマンスの選択肢ですが、あなたは、単に何を言う場合:

Scrolling.Update(cameraPosition.X, cameraPosition.Y) 

スクロールが有効な位置にすでにある場合は、何も変更されません。

使用前に測定する必要があります。このようにして、の状態変数、または古い変数を格納するための追加変数を格納することは避けられます。

+0

良い選択肢ですが、新しいポジションに向かって楽にしたい場合は問題が発生する可能性があります。多くの場合、あなたが停止したポジションは望みのポジションとまったく同じであるため、バックグラウンドが大きく詰まる可能性があります。 – TJHeuvel

関連する問題