gpt4 book ai didi

c# - MonoGame/XNA 缩放和起源

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:09 24 4
gpt4 key购买 nike

我希望能够缩放我的 Sprite 并将它们保持在缩放前的相同位置。我使用 Sprite 的中心作为原点参数,因为我也希望能够旋转我的 Sprite 。

我确定解决方案会很简单,但我找不到合适/通用的解决方案来解决这个问题。

如果不是很清楚,我制作了一些图片来展示我的代码、这段代码的结果以及我想要实现的目标。

1 - 这是我的代码和结果,这是我缩放 Sprite 时得到的结果,你可以看到 Sprite 已缩放但它“移动”了:

正如评论中所建议的,代码如下:

    Vector2 scale = Vector2.One;
float rotation = 0;

public void Update(GameTime gameTime)
{
if (Input.IsKeyPressed(Keys.P))
scale += new Vector2(0.05f, 0.0f);
if (Input.IsKeyPressed(Keys.M))
scale -= new Vector2(0.05f, 0.0f);

if (Input.IsKeyPressed(Keys.O))
scale += new Vector2(0.0f, 0.05f);
if (Input.IsKeyPressed(Keys.L))
scale -= new Vector2(0.0f, 0.05f);

if (Input.IsKeyPressed(Keys.D))
rotation += MathHelper.ToRadians(5);
if (Input.IsKeyPressed(Keys.Q))
rotation -= MathHelper.ToRadians(5);

Input.Update(gameTime);
}

public void Draw(GameTime gameTime, SpriteBatch spriteBatch)
{
spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp, null, null, null, Matrix.CreateScale(4));

spriteBatch.Draw(Sprites.BACKGROUND, Vector2.Zero, new Rectangle(0, 0, 128, 128), Color.White);

Vector2 marioPosition = new Vector2(64, 112 - 32);
Rectangle source = new Rectangle(0,0,16,32);

Vector2 origin = source.Size.ToVector2() / 2;

spriteBatch.Draw(Sprites.MARIO, marioPosition + origin, source, Color.White, rotation, origin, scale, SpriteEffects.None, 0f);

spriteBatch.End();
}

2 - 这是我想要实现的,我知道我可以通过移动我的原点来做到这一点,但我想把它保持在 Sprite 的中心,这样我就可以围绕这个点应用旋转:http://pasteboard.co/rzMfc0p.png

最佳答案

有人帮助我并找到了解决我的问题的方法 (Pema99 @pemathedev),正如其他人所建议的那样,解决方案确实是移动 sprite,这里是移动 sprite 需要多少:

public void Update(GameTime gameTime)
{
if (Input.IsKeyPressed(Keys.P))
scale.X += .05f;
if (Input.IsKeyPressed(Keys.M))
scale.X -= .05f;

//Solution ---------------------------------------------------
if (Input.IsKeyPressed(Keys.O))
{
float previousSize = source.Height * scale.Y;
float newSize = source.Height * (scale.Y + .05f);
scale.Y += .05f;
marioPosition.Y -= (Math.Abs(previousSize - newSize)/2)
}
if (Input.IsKeyPressed(Keys.L))
{
float previousSize = source.Height * scale.Y;
float newSize = source.Height * (scale.Y - .05f);
scale.Y -= .05f;
marioPosition.Y += (Math.Abs(previousSize - newSize)/2)
}
//--------------------------------------------------------------

if (Input.IsKeyPressed(Keys.D))
rotation += MathHelper.ToRadians(5);
if (Input.IsKeyPressed(Keys.Q))
rotation -= MathHelper.ToRadians(5);

Input.Update(gameTime);
}

谢谢大家!

关于c# - MonoGame/XNA 缩放和起源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36886132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com