1

つまり、基本的には2Dプラットフォームのシューティングゲームです。そして、個々の弾丸のパスを描きたいと思います。すべての弾丸の後に白い線があり、アルファ値は弾丸から発射された位置まで減少しているはずです。

どうすればそのような効果を生み出すことができますか?

編集:私は詳細なコードの代わりに基本的な方法を求めています。それを行うにはパーティクルエフェクトを使用する必要があると思いますか?

編集2:ありがとう!しかし、グラデーションテクスチャのソース長方形をスケーリングする代わりに変更できますか?

どこかで間違えたら訂正してください、ありがとう!

Texture2Dgradlineは次のようになります。ここに画像の説明を入力してください

(Math.Atan2を使用してベクトルの角度を見つけるときに覚えている限り、0度は正のY軸にある必要があります)

この方法を使用して、ベクトルの次数を見つけています。正のYはウィンドウ座標系でウィンドウを下に行くので、ここで-vector.Yに変更しました:(これは私にとってより理にかなっています)

protected float VectorToRadians(Vector2 vector)
{
    return (float)Math.Atan2(vector.X, -vector.Y);
}

また、ソースの長方形の高さを決定するために、弾丸とそれが発射された位置との間の距離を見つける必要があります。だから私はこのような方法を持っています

protected int GetRectangleHeight(Vector2 startingPos, Vector2 currentPos, int lineTextureLength)
{
    float distance = (startingPos - currentPos).Length();
    if (distance < lineTextureLength)  // if distance is smaller than the texture length, only draw part of it
        return distance;
    else                        // if distance is larger or equal to the texture length, draw the entire texture
        return lineTextureLength;
}

そして最後に引き分け

spriteBatch.Draw(
  gradline,
  bulletCurrentPos,
  new Rectangle(0, 0, gradline.Width, GetRectangleHeight(bulletStartingPos, bulletCurrentPos),
  Color.White,
  VectorToRadians(bulletCurrentPos - bulletStartingPos),
  Vector2.Zero,     // actually i think setting the top-center as origin might look better
  1f,                  // full scale
  SpriteEffects.None,
  0f);

そして、弾丸が何かに当たって消えた場合でも、パスは画面に描画されます。その間、ソースの長方形のy(および長方形がテクスチャから外れないようにするための高さ)は、yがの高さに達するまで、トレイルの端の部分のみを描画するように変更する必要があります。テクスチャ。

4

1 に答える 1

1

これは、線が透明な色にフェードするイメージで行うことができます。このような:

ここに画像の説明を入力してください

これは、画面の中央からカーソル(レーザーサイト)までトレースを描画するバージョンです。

(他の場所から描画したい場合は、弾丸の現在の位置やその弾丸が最初に発射された位置など、好みのVector2に置き換えることができcenterScreenますcursor_v2。そのために、私の答えの最後にあるコード部分を使用します。最高かもしれません。)

Texture2D gradline; // set this var to your fading line texture in LoadContent 

Vector2 centerScreen = new Vector2(
  GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height);
Vector2 cursor_v2 = new Vector2(currentMouseState.X, currentMouseState.Y);

spriteBatch.Draw(           // this is one of many Draw overloads
  gradline,                // your line texture
  centerScreen,           // we just set this to be at your game window center
  null,                  // this means entire texture will be drawn
  Color.White,                        // no tinting
  GetAngle(centerScreen, cursor_v2), // this rotates texture, see my code below
  Vector2.Zero,      // texture will be drawn from screen center without offset
  new Vector2(GetDistance(centerScreen, cursor_v2) / gradline.Width, 1),
    // ↑ This is scaling vector, X scales texture to distance from screen center
   //  to cursor and then divides by the texture's length.
  //  See how Y is set to 1, which means texture height will not be changed.

  SpriteEffects.None,  // this can mirror the texture, we don't do this now
  0f);                // everybody leaves this zero :p

コメントなしでもう一度:

spriteBatch.Draw(gradline、centerScreen、null、Color.White、GetAngle(centerScreen、cursor_v2)、Vector2.Zero、new Vector2(GetDistance(centerScreen、cursor_v2)/ gradline.Width、1)、SpriteEffects.None、0f);

角度の値を取得するための私のコード:(ゲームクラスのどこかに配置するだけです)

public float GetAngle(Vector2 v1, Vector2 v2)
{
    Vector2 v = Vector2.Normalize(Vector2.Subtract(v2, v1));

    return (float)Math.Atan2(v.Y, v.X);
}

または、一定の長さのテクスチャを作成し、次のコードで回転させることもできます。

spriteBatch.Draw(gradline, centerScreen, null, Color.White,
  GetAngle(centerScreen, cursor_v2), Vector2.Zero, 1, SpriteEffects.None, 0f);
                                      // look here ↑
  // this Draw overload takes float value instead of Vector2 for scaling textures
  //   so with 1 the texture size will not be scaled

もう1つの方法は、ゲーム内のすべての弾丸の位置に0.5秒ごとにパーティクルを作成し、パーティクルの有効期限が切れたら削除することです。あなたの弾丸は放物線ではなく一列に並んでいるのではないかと思うので、パフォーマンスの面ではおそらく価値がありません。

弾丸の方向が頻繁に変わる場合は、フルパスを描画できますが、リストを描画する必要がありVertexPositionColorます。これはより複雑ですが、良い結果が得られる場合があります。

于 2013-01-12T23:17:22.450 に答える