1

私はこことプログラミングに不慣れです。私はしばらく探していましたが、問題を解決するために役立つものは何も見つかりませんでした。

スプライトシートのさまざまな歩行フレームをスプライトシートで循環させようとしています。IsKeyDownを使用して簡単に実行できましたが、マウスを使用してどこかを歩く場合、「悪い」解決策を見つけるのに時間がかかりました。

if (destination.X > position.X)                
                currentFrame.Y = 6;
            if (destination.X > position.X && destination.Y >= position.Y + 35)
                currentFrame.Y = 7;
            if (destination.X > position.X && destination.Y <= position.Y - 35)
                currentFrame.Y = 5;

それは一種の動作ですが、これに対するより良い回避策があるかどうか疑問に思いました。私が欲しいのは、ゲーム画面をクリックして、スプライトの現在の位置と目的地を基準にして適切なスプライト行を選択し、適切な方法でアニメーション化できるようにすることです。

これまでに質問されたことがある場合は申し訳ありませんが、これを投稿する前に数時間検索しても何も見つかりませんでした。

4

2 に答える 2

0

あなたが何をしているのか正確には少しわかりません。左用と右用の 2 つのスプライトしかありませんか? 現在のコードで確認できるのはこれだけですが、アニメーションについて言及しています。歩行をアニメーション化するためのスプライトの完全なセットがあると仮定します。その場合、このチュートリアルで必要なものがカバーされると思います。

http://coderplex.blogspot.ca/2010/04/2d-animation-part-1-basics.html

(より具体的には、チュートリアルのパート 4: http://coderplex.blogspot.ca/2010/04/2d-animation-part-4-sprite-animation.html )

基本的に、スプライト アニメーションを制御するためにタイマーを設定する必要があります。このタイプのマウスの動きでは、マウスをクリックしてからオブジェクトが目的地に到達するまでの間に (移動に関連する) 入力がなくなるためです。したがって、タイマーを使用して、歩行アニメーションの次のスプライトを呼び出すタイミングを決定する必要があります。

または、if ステートメントをさらに詳しく説明することもできます (currentFrame = 1 の場合は currentFrame = 2、currentFrame = 2 の場合は currentFrame = 3 など)。または、スプライトがスプライトシートから引き出される方法。また、アニメーションが速すぎる可能性が高いため、タイマーを使用して遅くする必要があります。

于 2013-01-29T15:41:42.693 に答える
0

私はそれを考え出した。これが私のコードです(正しくフォーマットされていることを願っています。自分の質問に答えるつもりがない場合は申し訳ありませんが、これは他の誰かに役立つかもしれないと思いました):

public Vector2 position = new Vector2(200, 200);
    Point frameSize = new Point(48, 92);
    Point currentFrame = new Point(0, 0);
    Point sheetSize = new Point(9, 8);
    float speed = 10;
    Vector2 direction;
    Vector2 destination;
    bool mousePressed = false;
    float difference;


    KeyboardState currentState;
    KeyboardState theKeyboardState;
    KeyboardState oldKeyboardState;

    enum State
    {
        Walking
    }

    State mcurrentState = State.Walking;

    TimeSpan nextFrameInterval =
        TimeSpan.FromSeconds((float)1 / 16);
    TimeSpan nextFrame;
    MouseState mouseState;
    MouseState oldState;

    public void Move()
    {
        direction = destination - position;
        direction.Normalize();
        position += direction * speed;

        float Xdistance = destination.X - position.X;
        float Ydistance = destination.Y - position.Y;

        difference = (float)Math.Atan2(Ydistance, Xdistance);

        float differ;
        differ = MathHelper.ToDegrees(difference);

        if (destination.X >= position.X || destination.X <= position.X)
        {                
            currentFrame.X++;
            if (currentFrame.X >= 9)
                currentFrame.X = 0;

            //down = 90dg
            if (differ >= 67.6 && differ <= 112.5)
                currentFrame.Y = 0;
            if (differ >= 112.6 && differ <= 157.5)
                currentFrame.Y = 1;
            if (differ >= 157.6 && differ <= 180 || differ >= -180 && differ <= -157.5)
                currentFrame.Y = 2;
            if (differ >= -157.4 && differ <= -112.5)
                currentFrame.Y = 3;
            if (differ >= -112.4 && differ <= -67.5)
                currentFrame.Y = 4;
            if (differ >= -67.4 && differ <= -22.5)
                currentFrame.Y = 5;
            if (differ >= -22.4 && differ <= 22.5)
                currentFrame.Y = 6;
            if (differ >= 22.6 && differ <= 67.5)
                currentFrame.Y = 7;
        }
    }

    public void Update()
    {
        mouseState = Mouse.GetState();
        currentState = Keyboard.GetState();
        theKeyboardState = Keyboard.GetState();

        if (mousePressed == true)
        {
            if (Vector2.DistanceSquared(destination, position) >= speed * speed)
            {
                Move();
            }
        }

        if (mouseState.LeftButton == ButtonState.Pressed && oldState.LeftButton == ButtonState.Released)
        {
            int mouseY = mouseState.Y;
            int mouseX = mouseState.X;

            destination = new Vector2(mouseX, mouseY);
            mousePressed = true;
        }

        oldState = mouseState;           

        if (mcurrentState == State.Walking)
        {
            #region KB animation

            if (currentState.IsKeyDown(Keys.Down))
            {
                mousePressed = false;
                currentFrame.X++;
                currentFrame.Y = 0;
                if (currentFrame.X >= 9)
                    currentFrame.X = 0;
                position.Y += speed;
            }

            if (currentState.IsKeyDown(Keys.Up))
            {
                mousePressed = false;
                currentFrame.X++;
                currentFrame.Y = 4;
                if (currentFrame.X >= 9)
                    currentFrame.X = 0;
                position.Y -= speed;
            }

            if (currentState.IsKeyDown(Keys.Right))
            {
                mousePressed = false;
                currentFrame.X++;
                currentFrame.Y = 6;
                if (currentState.IsKeyDown(Keys.Down))
                    currentFrame.Y = 7;
                if (currentState.IsKeyDown(Keys.Up))
                    currentFrame.Y = 5;
                if (currentFrame.X >= 9)
                    currentFrame.X = 0;
                position.X += speed;
            }

            if (currentState.IsKeyDown(Keys.Left))
            {
                mousePressed = false;
                currentFrame.X++;
                currentFrame.Y = 2;
                if (currentState.IsKeyDown(Keys.Down))
                    currentFrame.Y = 1;
                if (currentState.IsKeyDown(Keys.Up))
                    currentFrame.Y = 3;
                if (currentFrame.X >= 9)
                    currentFrame.X = 0;
                position.X -= speed;
            }
        }
        oldKeyboardState = theKeyboardState;
            #endregion

    }

    public void Draw(SpriteBatch spriteBatch, Texture2D character)
    {
        spriteBatch.Begin();

        spriteBatch.Draw(character, position, new Rectangle(frameSize.X * currentFrame.X,
            frameSize.Y * currentFrame.Y, frameSize.X, frameSize.Y), Color.White, 0, new Vector2(frameSize.X / 2, frameSize.Y / 2), 1, SpriteEffects.None, 0);

        spriteBatch.End();
    }
于 2013-01-29T23:57:42.800 に答える