如何在移动中绘制精灵 canvas

How to draw a sprite on a moving canvas

我一般都能正常解决这类问题,但我很难过。我怀疑我错过了一个数学组合,但无论如何。

我有一个移动的背景(目前从上到下上下移动) 我有一个移动的物体(目前以编程方式从 canvas 的中心向左和向右移动)。

所以问题来了,我怎样才能让一个物体在 x 和 y 方向上相对于 canvas 上的位置移动?

这是我的相关代码:

//Helper method
    private Vector2 CalculateDirection()
    {
        Vector2 calculatedDirection = new Vector2((float)Math.Cos(direction),
            (float)Math.Sin(direction));
        calculatedDirection.Normalize();
        return calculatedDirection;
    }

对象 canvas

    public void Update(GameTime gameTime, Vector2 center)
    {
        this.currentCentre = originalCentre - center;
        //movement logic here
        Vector2 calculatedDirection = CalculateDirection();
        //deltaTime = ((float)gameTime.ElapsedGameTime.TotalMilliseconds) / 15f;

        if (speed > 0f || speed < 0f)
        {
            ///TODO: work this out!!
            Velocity = calculatedDirection * speed;
            float dir = (originalCentre.Y - currentCentre.Y);
            position.X += Velocity.X * (1.0f - 0.9f);
            position.Y = dir;// *(1.0f - 0.9f); 
        }
    }

canvas 移动方式

    private void determinePitchSize()
    {
        int newHeight = Convert.ToInt32(pitch.Height * ratio);
        this.canvas = new Rectangle(
            0, posHeight,
            device.PresentationParameters.BackBufferWidth,
            newHeight
            );
    }

    public void increasePosHeight()
    {
        posHeight++;
    }

    public void decreasePosHeight()
    {
        posHeight--;
    }

    private void determineDirection()
    {
        if (!direction)
        {
            if (this.canvas.Height + this.canvas.Y <= this.screenY)
                direction = true;
        }
        else
        {
            if (this.canvas.Y >= 0)
                direction = false;
        }
    }
    private void useDirection()
    {
        this.determineDirection();

        if (direction)
            this.increasePosHeight();
        else decreasePosHeight();
    }

如果您需要更多信息,我可以在此处添加。

谢谢

好的,感谢 Nico,我能够回答这个问题。

    Vector2 Velocity { get; set; }
    Vector2 relative { get; set; }
    public void Update(GameTime gameTime, Vector2 center)
    {

        this.currentCentre = center;

        Vector2 calculatedDirection = CalculateDirection();


        if (speed > 0f || speed < 0f)
        {
            Velocity = calculatedDirection * speed * 0.1f;
            relative = relative - Velocity;
            position = currentCentre + relative;

        }
    }

速度创建对象运动以测试它最终到达不同的地方。

相对从 0,0(中心)开始,并根据速度进行调整。

然后将位置设置为中心加上相对位置。已由速度设置。