4

私はC#とXNAにかなり慣れておらず、プログラミングも上手です(チュートリアルに従うことはできますが、自分で作成することのほとんどはまだ本当に難しいです)。今、私はこの1つの「単純な」ことを行う方法を理解しようと何度も行っています。

これがアイデアです。タワーディフェンスゲームになります。今、私は裸の骨の基本に取り組んでいます。キーボード入力で動き回る小さなスプライトの男がいます。画面のどこかをクリックして、そのポイントまで「歩いて」もらいたいと思います。私だけが論理に迷っています。クリックすると、彼はそこにジャンプします

if (aMouse.LeftButton == ButtonState.Pressed)
{
  Position.X = aMouse.X;
  Position.Y = aMouse.Y;
} 

他のマウス入力について読んだことから、スプライトをある方向に移動し、彼がそれに到達したかどうかを確認するためにチェックを実行する必要がある、ある種のループ(ブール値かもしれませんか?)が必要だと思いますまだポイント。しかし、マウスクリック後にそのポイントを取得し、そのループを作成して、チェックを実行します...私は無知です。

4

4 に答える 4

2

いくつかのインスタンス変数を追加する必要があります:

Point2D targetPos;

そしていくつかの定数:

const Point2D speed;

Update() ループを実行するときは、ターゲット位置から事前に定義されたしきい値内になるまで (通常、しきい値は速度ベクトルから計算されます)、速度ベクトルを (もちろん正しい方向に) 追加して現在位置を更新します。 - 現在位置から目標位置までの距離が速度ベクトルの長さより短い場合は、その位置にいます)。この場合、bool を使用するとうまくいきます。マウスをクリックしたら、別のインスタンス変数 (moving) を true に設定し、目的の位置に到達したら、moving を false に設定します。

于 2011-02-17T05:26:53.150 に答える
2

人々はあなたの質問に非常に低いレベルで答えています。問題をより高いレベルで考えることが役立つ場合があります。

必要なのは、一種の状態管理です。これを意味するコンピューター サイエンス用語は、Finite State Machine です。しかし、今はわざわざ調べないでください。最初はかなり乾燥していて混乱します:)

あなたのキャラクターは現在、「立っている」という 1 つの状態を持っています。「目的地まで歩いている」状態を追加して処理する必要があります。

他のマウス入力について読んだことから、ある種のループが必要になると思います

ゲーム ループと呼ばれる 1 つのループが必要です。XNA を使用している場合は、既に XNA を取得しています。しかし、あなたは正しい軌道に乗っています。

ゲーム ループを通過するたびに、現在の状態を処理し、状態遷移と呼ばれるものを確認する必要があります。それは、世界の何かをある状態から別の状態に変えるときです。たとえば、マウスをクリックすると、男が動き始めます。

ゲーム ループで、マウス クリックが発生したかどうかを確認します。もしそうなら、いくつかのデータ(どこに移動するか)を設定し、状態を「目的地まで歩く」に設定して歩き始めるように彼に伝えます。次の更新では、代わりにその状態を処理します。

キャラクターが「desintation への歩行」状態にある場合、最後のゲーム アップデートからの経過時間に基づいて位置を更新する必要があります。XNA では、これは自動的に計算されます。XNA を使用していない場合は、自分で確認する必要があります。Stopwatchクラスのようなものを使用して、Elapsedフィールドを確認できる場合があります。

キャラクターが目的地にいる場合は、「立っている」状態に戻す必要があります。

別のマウス クリックを受け取った場合、「目的地まで歩いている」状態に注意を払うかどうかはあなた次第です。注意すれば、「立ち回り」状態から遷移したときと同じようなデータを設定することになります。

したがって、次の変数が必要になります。

  • 最後のゲーム ループからの経過時間を調べるためのタイマー (XNA が提供します)
  • 現在のプレーヤーの状態 (おそらくenum)
  • 現在のプレーヤーの位置 (ベクトル)
  • プレーヤーの歩行速度 (おそらくフロート)、単位/秒 (またはミリ秒) で測定
  • 「目的地まで歩いている」状態のデータ - 目標位置 (別のベクトル)
  • ユーザー入力に関連するデータ (前回の更新以降に発生したマウス イベント、それらのクリックの位置など)

キャラクター固有のデータはゲーム内のキャラクターごとに異なるため、それぞれの新しいコピーが必要です。おそらくクラスに入れたいと思うでしょう。残りの部分はよりグローバルであるため、個別に保持することも、ゲーム、ゲーム ループ、入力クラスなどの一部にすることもできます (ただし、整理することを選択します)。

部分的な動きを実際に計算する方法については、他の人が説明しているので、ここでは説明しません。それらの回答を複製しても意味がありません。基本的には、現在の位置と目標位置の間のベクトルを作成し、それを歩行速度で乗算/除算します (1 回の更新で移動した距離に切り刻みます)。

于 2011-02-17T06:03:49.440 に答える
1

私はあなたが3つのものを持っていると仮定しています:

  1. 現在位置
  2. 望ましい位置
  3. 各「ゲーム ティック」を移動する速度 // ゲーム ティックとは何かわかりませんか? 探し出す!

あなたはこれをすることを見ています

ここに画像の説明を入力

// dx, dy are delta x and delta y. It's how far in each direction
// the player must travel
// note, I fixed a typo where they were desired - desired... should be
// desired - current, as they are now
float dx = desiredX - currentX;
float dy = desiredY - currentY;

// d uses the pythagorean theorum to find the distance between current and desired
float d = sqrt(dx*dx + dy*dy);
// fac is how far along that line between desired and current will you move
float fac = d / speed;

// mx is the component of the dx line proportional to the size of fac : d
// which means it's how far in the x direction you'll move
float mx = dx * fac;
float my = dy * fac;

// the new postition is the old position plus the move value
float newPositionX = dx + mx;
float newPositionY = dy + my;
于 2011-02-17T05:28:53.780 に答える