Xna 翻转字符

Xna 翻转字符,xna,monogame,Xna,Monogame,我想在角色向左/向右行走时翻转角色,我从不同的身体部位创建了一个角色,因此翻转每个部位会导致以下情况: 原因当然是因为它将身体各部分翻转到自己的位置,但不是所有的玩家都翻转到一起 在那之后,我有了一个想法,那就是画播放器来渲染目标,并在绘制时翻转渲染目标,这很有效(有点),但当我在翻转时,它会向后移动,同时也会翻转播放器在屏幕上的位置。代码如下: if(mLeavusSprite.isflipped==0) spriteBatch.Draw(character, rec,r

我想在角色向左/向右行走时翻转角色,我从不同的身体部位创建了一个角色,因此翻转每个部位会导致以下情况:

原因当然是因为它将身体各部分翻转到自己的位置,但不是所有的玩家都翻转到一起

在那之后,我有了一个想法,那就是画播放器来渲染目标,并在绘制时翻转渲染目标,这很有效(有点),但当我在翻转时,它会向后移动,同时也会翻转播放器在屏幕上的位置。代码如下:

  if(mLeavusSprite.isflipped==0)
        spriteBatch.Draw(character, rec,rec, Color.White,0,Vector2.Zero,SpriteEffects.None,0);
        else
            spriteBatch.Draw(character, rec, rec, Color.White, 0, Vector2.Zero, SpriteEffects.FlipHorizontally, 0);
character=玩家被吸引到的渲染目标

有什么我能做的吗?手动翻转将是一个严重的痛苦,我需要手动移动超过10个动画,每个动画4+帧两次

编辑: 以下是绘图代码:

           if (Frame == 0)
            {
                HeadPosition.X = Position.X;
                HeadPosition.Y = Position.Y;
                BodyPosition.X = HeadPosition.X + 8;
                BodyPosition.Y = HeadPosition.Y + 32;
                TopHandPosition.X = HeadPosition.X + 2;
                TopHandPosition.Y = HeadPosition.Y + 36;
                BackHandPosition.X = HeadPosition.X + 20;
                BackHandPosition.Y = HeadPosition.Y + 36;
                HeadSource = new Rectangle(0, 0, this.Head.Width, this.Head.Height);
                BodySource = new Rectangle(0, 0, 24, 54);
                TopHandSource = new Rectangle(0, 0, 10, 27);
                BackHandSource = new Rectangle(0, 0, 15, 27);
                theSpriteBatch.Draw(BackHand, BackHandPosition, BackHandSource,
   Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0);
                theSpriteBatch.Draw(Body, BodyPosition, BodySource,
             Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0);
                theSpriteBatch.Draw(Head, HeadPosition, HeadSource,
                Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0);
                theSpriteBatch.Draw(TopHand, TopHandPosition, TopHandSource,
         Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 

            }
编辑2:

  if (Frame == 0)
            {
                HeadPosition.X = Position.X;
                HeadPosition.Y = Position.Y;
                BodyPosition.X = HeadPosition.X + 8 ;
                BodyPosition.Y = HeadPosition.Y + 32;
                TopHandPosition.X = HeadPosition.X + 2 ;
                TopHandPosition.Y = HeadPosition.Y + 36;
                BackHandPosition.X = HeadPosition.X + 20 ;
                BackHandPosition.Y = HeadPosition.Y + 36;
                HeadSource = new Rectangle(0, 0, this.Head.Width, this.Head.Height);
                BodySource = new Rectangle(0, 0, 24, 54);
                TopHandSource = new Rectangle(0, 0, 10, 27);
                BackHandSource = new Rectangle(0, 0, 15, 27);
                int bigx=0;
                int smallx=0;
                float[] numbers = new[] { HeadPosition.X, BodyPosition.X , TopHandPosition.X, BackHandPosition.X};
                float min = numbers.Min();
                numbers = new[] { HeadPosition.X+HeadSource.Width, BodyPosition.X + BodySource.Width, TopHandPosition.X + TopHandSource.Width, BackHandPosition.X + BackHandSource.Width };
                float max = numbers.Max();
                float center = (max - min) / 2;
                if (flip==1)
                {
                    HeadPosition.X = Position.X;

                    BodyPosition.X = HeadPosition.X +center+ 8*flipOffset;

                    TopHandPosition.X = HeadPosition.X +center+ 2*flipOffset;

                    BackHandPosition.X = HeadPosition.X +center+ 20*flipOffset;

                }
                Debug.WriteLine("fff: " + center);
                theSpriteBatch.Draw(BackHand, BackHandPosition, BackHandSource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0);
                theSpriteBatch.Draw(Body, BodyPosition, BodySource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0);
                theSpriteBatch.Draw(Head, HeadPosition, HeadSource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0);
                theSpriteBatch.Draw(TopHand, TopHandPosition, TopHandSource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0);
            }

嗯。。这是一个棘手的问题

可能有几种不同的方法可以做到这一点,我认为如果你能让它工作的话,将他们的播放器绘制到渲染目标是一种合理的方法

但是,如果您想要快速且肮脏的方法,您可以简单地翻转每个零件的偏移,如下所示:

var flipOffset = FlipIs == SpriteEffects.FlipHorizontally ? -1 : 1;

if (Frame == 0)
{
    HeadPosition.X = Position.X;
    HeadPosition.Y = Position.Y;
    BodyPosition.X = HeadPosition.X + 8 * flipOffset;
    BodyPosition.Y = HeadPosition.Y + 32 * flipOffset;
    TopHandPosition.X = HeadPosition.X + 2 * flipOffset;
    TopHandPosition.Y = HeadPosition.Y + 36 * flipOffset;
    BackHandPosition.X = HeadPosition.X + 20 * flipOffset;
    BackHandPosition.Y = HeadPosition.Y + 36 * flipOffset;
    HeadSource = new Rectangle(0, 0, this.Head.Width, this.Head.Height);
    BodySource = new Rectangle(0, 0, 24, 54);
    TopHandSource = new Rectangle(0, 0, 10, 27);
    BackHandSource = new Rectangle(0, 0, 15, 27);
    theSpriteBatch.Draw(BackHand, BackHandPosition, BackHandSource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0);
    theSpriteBatch.Draw(Body, BodyPosition, BodySource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0);
    theSpriteBatch.Draw(Head, HeadPosition, HeadSource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0);
    theSpriteBatch.Draw(TopHand, TopHandPosition, TopHandSource,Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
}
这是假设
位置
正好位于精灵的中心,如果不是,您可能需要进行一些调整

听着,我对你说实话。有更好的方法来解决这个问题,但它们需要对代码进行重大的重新设计,而且很难用一个答案来解释


重构设计的第一件事是创建一个类来表示单个Sprite部分,将公共数据点(偏移、源矩形、纹理、颜色等)和设置数据保存在一个位置。动画代码需要与绘图代码分离,等等。

请发布绘制各个身体部位的代码。@craftworkgames Edited如果(翻转==1),为什么要添加
代码?你试过我答案中的代码了吗?@craftworkgames是的,正如我说的位置不是中心,这就是为什么我在flip中添加flip==1,以将中心添加到位置,然后执行你编写的操作。执行您的代码和我在线程中编写的内容都不起作用。谢谢您的帮助,但解决方案对我不起作用,不确定为什么。位置不是中心,但我试图找到中心并添加它,我编辑了结果和新代码