C#XNA - 从底部中心开始绘制

时间:2016-05-22 14:18:39

标签: c# xna

通常XNA从左上角开始绘制精灵,但我想从底部中心开始绘制对象,如何做到这一点?

2 个答案:

答案 0 :(得分:1)

假设您在位置Width x Height上绘制了X x Y的图像。

spriteBatch.Draw(texture, position, Color.White);

首先让我们通过从位置的Y坐标减去图像高度来将图像的底部放在这些坐标上(减去,因为在XNA中Y轴是反转的,而不是像你的数学课

spriteBatch.Draw(texture, position + new Vector2(0, -texture.Height), Color.White);

第二次,让我们通过从位置的X坐标减去图像宽度的一半来向左移动图像。

spriteBatch.Draw(texture, position + new Vector2(-texture.Width/2, -texture.Height), Color.White);

你有它。

编辑:另一个想法:您可以创建名为DrawPosition的新变量,并在需要时使用该变量,而不是总是减去。这看起来像这样:

private Texture2D texture;
public Vector2 position;
public Vector2 DrawPosition
{ get { return position + new Vector2(-texture.Width/2, -texture.Height); } }

public void Draw(SpriteBatch spriteBatch)
{ spriteBatch.Draw(texture, DrawPosition, Color.White); }

或者,如果这个新变量没有为您提供场景,请创建一个将返回DrawPosition()

的函数
public Vector2 DrawPosition()
{ return position + new Vector2(-texture.Width/2, -texture.Height); }

答案 1 :(得分:1)

您想在SpriteBatch.Draw来电中指定其他来源。默认值为0,0(左上角)。请注意,原点是相对于精灵而不是屏幕。

因此,如果你的精灵是64x64,你想使用32x64的原点作为底部中心。

e.g。使用this override(MSDN)

spriteBatch.Draw (
         texture,
         position,
         sourceRectangle,
         color,
         rotation,
         new Vector2(32, 64), // origin
         scale,
         effects,
         layerDepth
)

如果您愿意,可以动态计算这些。例如,如果您使用完整纹理,则可以将其指定为new Vector2(texture.Center.X, texture.Height)。或者,如果您使用精灵表,则可以将其基于sourceRectangle

您需要指定一堆其他参数才能使用这些Draw覆盖,但您可以传入默认值。默认值为:

sourceRectangle: null = full texture
color: Color.White = default color (sprite colors will be used)
rotation: 0f = no rotation
scale: 1f = default scale
efects: SpriteEffects.None = no flipping
layerDepth: 0 = default layer