2

XNAで簡単なゲームを作ろうとしています。

横にスプライトシートがあるプレーヤーがいます。スプライトシートは一種の武器であり、先端があります。

このスプライトを、先端をマウスの位置に向けて回転させるにはどうすればよいですか?

        float y2 = m_Mouse.Y;
        float y1 = m_WeaponOrigin.Y;
        float x2 = m_Mouse.X;
        float x1 = m_WeaponOrigin.X;

        // Get angle from mouse position.
        m_Radians = (float) Math.Atan2((y2 - y1), (x2 - x1));

Drawing with: 
activeSpriteBatch.Draw(m_WeaponImage, m_WeaponPos, r, Color.White, m_Radians, m_WeaponOrigin, 1.0f, SpriteEffects.None, 0.100f);

これにより回転しますが、マウスに正しく追従せず、動作がおかしくなります。

これを機能させるためのヒントはありますか?

私が抱えているもう1つの問題は、銃口であるポイントを定義し、角度に基づいてそれを更新して、ショットがそのポイントからマウスに向かって正しく発射されるようにすることです。

ありがとう


スクリーンショット: 早い段階で、マウスとカーソルを所定の位置に配置します

スーパーレーザーで遊ぶ

すべての敵タイプでスーパーレーザーを使用する

もう一度ありがとう、楽しいゲームであることが判明しました。

4

1 に答える 1

5

基本的にはを使用しますMath.Atan2

Vector2 mousePosition = new Vector2(mouseState.X, mouseState.Y);
Vector2 dPos = _arrow.Position - mousePosition;

_arrow.Rotation = (float)Math.Atan2(dPos.Y, dPos.X);

概念実証(カーソルにプラスのテクスチャを使用しました。残念ながら、シーンショットには表示されません):

カーソルを指す


「なに_arrow?」

その例_arrowはタイプSpriteであり、状況によっては便利な場合があり、コードが少しきれいに見えるようになります。

public class Sprite
{
    public Texture2D Texture { get; private set; }

    public Vector2 Position { get; set; }
    public float Rotation { get; set; }
    public float Scale { get; set; }

    public Vector2 Origin { get; set; }
    public Color Color { get; set; }

    public Sprite(Texture2D texture)
    {
        this.Texture = texture;
    }

    public void Draw(SpriteBatch spriteBatch, GameTime gameTime)
    {
        spriteBatch.Draw(this.Texture, 
                         this.Position, 
                         null, 
                         this.Color, 
                         this.Rotation, 
                         this.Origin, 
                         this.Scale, 
                         SpriteEffects.None, 
                         0f);
    }
}

宣言する:

Sprite _arrow;

開始する:

Texture2D arrowTexture = this.Content.Load<Texture2D>("ArrowUp");
_arrow = new Sprite(arrowTexture)
        {
            Position = new Vector2(100, 100),
            Color = Color.White,
            Rotation = 0f,
            Scale = 1f,
            Origin = new Vector2(arrowTexture.Bounds.Center.X, arrowTexture.Bounds.Center.Y)
        };

描く:

_spriteBatch.Begin();
_arrow.Draw(_spriteBatch, gameTime);
_spriteBatch.End();
于 2012-12-04T00:38:46.783 に答える