通常XNA从左上角开始绘制精灵,但我想从底部中心开始绘制对象,如何做到这一点?
答案 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