2

あなたが私を助けてくれることを願っています。

ユーザーが次のように右ボタンをクリックすると、マウスの位置に応じてスプライトが移動します。

protected override void Update(GameTime gameTime)
{
    int nextX = SpritePosition.X;
    int nextY = SpritePosition.Y;
    int SpriteWidth = 135;
    int SpriteHeight = 135;
    int Speed = 3;

    MouseState ms = Mouse.GetState();
    if (ms.RightButton == ButtonState.Pressed)
    {
        if (ms.X > SpritePosition.X + SpriteWidth) //check to move right
        {
            nextX = SpritePosition.X + Speed;
        }
        else if (ms.X < SpritePosition.X) //check to move left
        {
            nextX = SpritePosition.X - Speed;
        }

        if (ms.Y > SpritePosition.Y + SpriteHeight) //Check to move bottom
        {
            nextY = SpritePosition.Y + Speed;
        }
        else if (ms.Y < SpritePosition.Y) //Check to move top
        {
            nextY = SpritePosition.Y - Speed;
        }

        //Change the Sprite position to be updated in the DRAW.
        SpritePosition = new Rectangle(nextX, nextY, graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height);
    }

    base.Update(gameTime);
}

現在は機能していますが、移動方法は次のようになります。

間違った移動http://i.imgur.com/xGsFy38.png

私が望む方法:右に動くhttp://i.imgur.com/kkEnoYD.png

みんな、今私は以下の答えから、以下を試しました:

            Vector2 From = new Vector2(SpritePosition.X, SpritePosition.Y);
            Vector2 To = new Vector2(ms.X, ms.Y);
            From = Vector2.Subtract(From,To );
            Vector2 Direction = Vector2.Normalize(From);
            Direction = Direction * Speed;

            SpritePosition = new Vector2(Direction.X, Direction.Y);

私のスプライトは動いていません、何が間違っているのですか?

4

3 に答える 3

2

2つのポジションがあり、両方をVector2として保存します。

ターゲット位置から現在の位置を減算して、2点間のベクトルを取得します。

そのベクトルを正規化して、方向ベクトルを取得します。

方向ベクトルに移動速度を掛けて、方向ベクトルに沿って目的の速度で移動します。

于 2013-03-12T15:12:03.407 に答える
2

以下のコードで例を作成しました。これは次のとおりです。

http://pastebin.com/ep659g76

画面上のオブジェクトである5x5ピクセルの単純なドットを作成しました。好きなように変更できます。

これは、私がスプライトアニメーションを使用したトップダウンシューターに使用した方法です。C ++からC#に変換しましたが、同じように機能するはずです。私の場合、スプライトの位置に応じて、正しい結果を得るために+90度の回転を追加する必要がありましたが、うまくいけば、それを理解できます。

public static class Helper_Direction
{

    // Rotates one object to face another object (or position)
    public static double FaceObject(Vector2 position, Vector2 target)
    {
        return (Math.Atan2(position.Y - target.Y, position.X - target.X) * (180 / Math.PI));
    }

    // Creates a Vector2 to use when moving object from position to a target, with a given speed
    public static Vector2 MoveTowards(Vector2 position, Vector2 target, float speed)
    {
        double direction = (float)(Math.Atan2(target.Y - position.Y, target.X - position.X) * 180 / Math.PI);

        Vector2 move = new Vector2(0, 0);

        move.X = (float)Math.Cos(direction * Math.PI/180) * speed;
        move.Y = (float)Math.Sin(direction * Math.PI / 180) * speed;

        return move;
    }
}
于 2013-03-12T15:39:43.757 に答える
0

位置を次のように変更する必要があります。

nextY = SpritePosition.Y + SpriteHeight + Speed;

ただし、これによりスプライトが開始時にジャンプするため、最初に終了位置を計算してから、ゆっくりとその位置に移動することをお勧めします。

于 2013-03-12T15:14:13.327 に答える