【问题标题】:How to detect in which direction the sprite is moving?如何检测精灵向哪个方向移动?
【发布时间】:2014-12-03 18:12:20
【问题描述】:

我正在制作一个用于学习目的的 2D 塔防游戏,现在我被困在如何让敌人在移动时看向正确的方向。

这是我尝试但没有成功的方法:

    // Class constructor
    public AnimatedSprite(Texture2D texture, int lines, int columns, Vector2 position)
        : base ( texture, position)
    {
        this.texture = texture;
        this.position = position;
        Lines = lines; // How many lines the sprite-sheet have
        Columns = columns; How many columns the sprite-sheet have
        totalFrames = Lines * Columns;
    }

这是更新方法,它是一个 5x4 的 sprite sheet:

    public override void Update(GameTime gameTime)
    {

        // Depending on the direction the sprite is moving
        // it will use different parts of the sprite-sheet

        if (west == true)
        {
            initialFrame = 0;
            finalFrame = 4;
        }

        if (east == true)
        {
            initialFrame = 5;
            finalFrame = 9;
        }

        if (north == true)
        {
            initialFrame = 10;
            finalFrame = 14;
        }

        if (south == true)
        {
            initialFrame = 15;
            finalFrame = 19;
        }

        // When to update the current frame
        timeSinseLastFrame += gameTime.ElapsedGameTime.Milliseconds;
        if (timeSinceLastFrame > milisecondsPerFrame)
        {
            timeSinceLastFrame -= milisecondsPerFrame;
            currentFrame++;

         // Reset the frame to complete the loop
            if (currentFrame == finalFrame)
                currentFrame = initialFrame;
        }
    }

在绘制方法中,我尝试检测精灵所面对的位置,我不确定最好的方法,但它不起作用,敌人被正确绘制和动画但有时沿地图朝向错误的方向路径并在某个点消失:

    public override void Draw(SpriteBatch spriteBatch)
    {
        int width = texture.Width / Columns;
        int height = texture.Height / Lines;
        int line = (int)((float)currentFrame / (float)Columns);
        int column = currentFrame % Columns;

        Rectangle originRectangle = new Rectangle(width * column, height * line, width, height);
        Rectangle destinationRectangle = new Rectangle((int)position.X, (int)position.Y, width, height);


        // Heres what i think it's not correct, how to detect the direction
        // I tried to calculate it by the last X and Y position
        // So if the current Y value is smaller the last Y value
        // The sprite moved south
        Rectangle lastPosition = originRectangle;
        Rectangle destinationPosition = destinationRectangle;

        if (lastPosition.Y < destinationPosition.Y)
        {
            north = true;
            south = false;
            east = false;
            west = false;
        }

        if (destinationRectangle.Y > lastPosition.Y)
        {
            north = false;
            south = true;
            east = false;
            west = false;
        }

        if (destinationRectangle.X > lastPosition.X)
        {
            north = false;
            south = false;
            east = true;
            west = false;
        }

        if (destinationRectangle.X < lastPosition.X)
        {
            north = false;
            south = false;
            east = false;
            west = true;
        }

        spriteBatch.Draw(texture, destinationRectangle, originRectangle, Color.White);

    }
}
}

【问题讨论】:

  • 你还没有在这里真正问过问题;并且有很多代码(虽然总比没有代码好!)。你能缩小范围吗?根据给定的输入(提供实际/预期的输出)指出没有做你想做的事情的行/部分?
  • 如果此代码与此问题相关,那么您似乎需要设计具有 FacingDirection 的角色的概念。似乎与此无关。设计完成后,您可以更新 Draw 方法以根据该数据操作图像/绘图。
  • 我用代码上的一些 cmets 更新了问题以澄清。

标签: c# xna


【解决方案1】:

首先看一下你的代码段:

if (lastPosition.Y < destinationPosition.Y)
{
    north = true;
    south = false;
    east = false;
    west = false;
}

if (destinationRectangle.Y > lastPosition.Y)
{
    north = false;
    south = true;
    east = false;
    west = false;
}

(lastPosition.Y lastPosition.Y) 是相同的条件,所以在这两种情况下你都会有 south = true。

其次,为什么要使用四个布尔变量?而是使用一个具有四种可能状态的变量。枚举对此有好处:

enum Direction
{
    None = 0, // default
    North = 1,
    South = 2,
    East = 3,
    West = 4
}

而不是四个布尔值,而是使用一个方向变量。变量越少,麻烦就越少。

最后。 我不明白你是如何移动你的精灵的?我的意思是你如何在改变坐标之前检测方向? 在我看来,它应该是这样的:

  1. 在 Update() 中检测您需要向哪个方向移动和更改 Direction 变量,并根据它更改和更新精灵状态。
  2. 在 Draw() 中只绘制当前状态的精灵。

【讨论】:

  • 您好,谢谢您的回答。我已经解决了它,并且我相信它变得更简单,没有变量。
【解决方案2】:

我解决了,我从基类中选择位置并更新基类中的最后一个位置,在敌人类中,更新方法将根据位置处理它将使用的帧。

敌人类更新方法:

            if (lastPosition.Y < position.Y)
            {
                initialFrame = 15;
                lastFrame = 19;
            }

            if (position.Y < lastPosition.Y)
            {
                initialFrame = 10;
                lastFrame = 14;
            }

            if (position.X > lastPosition.X)
            {
                initialFrame = 5;
                lastFrame = 9;
            }

            if (position.X < lastPosition.X)
            {
                initialFrame = 0;
                lastFrame = 4;
            }

            currentFrame = initialFrame;
            totalFrame = lastFrame;

            timeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;
            if (timeSinceLastFrame > milisecondsPerFrame)
            {
                timeSinceLastFrame -= milisecondsPerFrame;
                currentFrame++;
                if (currentFrame == totalFrame)
                    currentFrame = 0;
            }       
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多