2017-05-29 2 views
-1

私はあなたがカーソルに向かって飛んでいる投射物を撃つためにクリックするゲームを作っています。しかし、カーソルの方向に飛行機を飛ばす方法についてはわかりません。私はしかし、それはカーソルで撮影し、それを撮影した場所のほぼランダム思えませんでした...カーソルを使って投射物を投射する

public bool PreFilterMessage(ref Message m) 
     { 
      if(m.Msg == 0x0201) 
      { 
       Point MousePos = PointToClient(Form.MousePosition); 

       slope = (MousePos.Y - aCharacter.Location.Y)/(MousePos.X - aCharacter.Location.X); 
       aLaser.Location = aCharacter.Location; 
       if (MousePos.X < aCharacter.Location.X) 
        lasDir = -1; 
       else 
        lasDir = 1; 
       laserLaunched = true; 
       return true; 
      } 

    private void aChMvmTimer_Tick(object sender, EventArgs e) 
    { 

     if(laserLaunched) 
     { 
      aLaser.Location = new Point(aLaser.Location.X + lasDir, aLaser.Location.Y + (slope * lasDir)); 
      aLaser.Visible = true; 

     } 

     else 
     { 
      aLaser.Visible = false; 
     } 
} 

をこのような直線の傾きを見つけてみました。これをどうやってやりますか?

別の解決方法を試しましたが、私はそれが正しいことを疑っています。

int currentTime = Environment.TickCount; 
     double deltaTime = (currentTime - lastTime)/1000.0; 
     lastTime = currentTime; 
     if (laserLaunched) 
     { 

      int movementSpeed = 20; 
      //aLaser.Location = new Point(aLaser.Location.X + lasDir, aLaser.Location.Y + (slope * lasDir)); 
      aLaser.Visible = true; 
      double x = aLaser.Location.X - curMousePos.X; 
      double y = aLaser.Location.Y - curMousePos.Y; 
      double loc = ((int)x^2) + ((int)y^2); 
      loc = Math.Sqrt(((int)x^2) + ((int)y^2)); 
      x = (x/(int)loc); 
      y = (y/(int)loc); 
      x *= (int)deltaTime * movementSpeed; 
      y *= (int)deltaTime * movementSpeed; 
      aLaser.Location = new Point(aLaser.Location.X + (int)x, aLaser.Location.Y + (int)y); 
     } 

私はそれを正しく行いましたか?

+0

"それは動作しませんでしたが、" 問題の説明ではありません。そして、「わずかな」修飾子は、それを全く改良しない。 –

+0

これを指摘してくれてありがとう!私がそれを投稿したとき、私はそれを認識しませんでした。 – Beldar4000

答えて

0

簡単なベクトル演算を使用することです最も簡単な方法:あなたがSystem.Windows.Pointを使用しての代わりに、WinFormsのバージョンされた場合は、使用でき

V = B - A // That means subtracting each component of B from the respective component of A. 

がAからBに指すベクトルを取得しますPoint.Subtract(Point,Point)メソッドはすぐに結果としてVectorオブジェクトを返します。

次に、そのベクトルを正規化して、発射体の望ましい移動速度に合わせてスケールを調整することができます。正規化されたベクトルの各コンポーネントの相対的な大きさは同じですが、合計の長さは1です。これを達成するには、ベクトルの全長で各コンポーネントを分割するか、前述のSystem.Windowsアプローチを使用している場合はVector.Normalize()を使用します。

正規化されたベクトルを取得した後、実際の発射位置の座標を、すべての目盛りで、ベクトル量に、目盛りイベントの希望の速度とフレームレート*を掛けて変更できます。

繰り返しになりますが、この「手で」行うかVectorの組み込み関数を使用することができます。

newLocation = Vector.Add(Vector.Multiply(movementVector, movementSpeed * deltaTime), currentLocation); 

* Iは、システム時刻を格納することによって取得することができ、ここで使用さdeltaTime(中ミリ秒)を指定し、現在のシステム時刻と前の時刻を比較します。これを1000で割って、時間差を秒単位で示す浮動小数点値を取得します。これにより、投射物の移動速度を「ピクセル/秒」で指定することができます。これにより、実際の動きはチック機能が動作するフレームレートとは無関係になりますので、プレイヤーのCPUがボトルネックであれば遅くなる傾向はなく、スムーズにティックアップデートの頻度を変更すると変更されません後でゲームプレイの経験。

例:

private int lastTime; // Initialize this to Environment.TickCount in your constructor. 

private void TickUpdate() { // Called by your tick event. 

    int currentTime = Environment.TickCount; 
    double deltaTime = (currentTime - lastTime)/1000.0; 
    lastTime = currentTime; 

    // Do stuff with deltaTime. 
} 
+0

これは理にかなっていますが、私はWPFを使用していません。どうすればいいですか? – Beldar4000

+0

さて、これらの場所のWindows.Pointを明示的に参照して、最終結果の座標をDrawing.Pointに使用することができます。私が記事の中で指摘したように、あなたは手作業ですべてをやる。つまり、便利なメソッドを使うのではなく、XのYコンポーネントのすべての操作を直接行うだけです。だからあなたは 'B.X - A.X'、' B.Y - A.結果ベクトル( 'Sqrt(X^2 + Y^2)')の長さを計算し、それによってXとYを除算します。次に、XとYに移動速度とdeltaTimeを掛け、最終的にそれを古い場所のそれぞれのXとYに追加します。 –

+0

それはうまくいくはずですが、私はdeltaTimeについてどうやって行くのかちょっとおもしろいです。あなたはそれを取得する方法について、より深く知ることができますか?ありがとう! – Beldar4000

関連する問題