【问题标题】:Flipping character翻转字符
【发布时间】:2015-09-15 22:41:32
【问题描述】:

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

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

之后我有了一个想法,就是绘制玩家来渲染目标并在绘制时翻转渲染目标,它起作用了(有点),但是当我翻转时它向后走并且它也翻转了玩家位置屏幕。这是代码:

  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);
            }

【问题讨论】:

  • 你能贴出绘制各个身体部位的代码吗?
  • @craftworkgames 已编辑
  • 为什么要添加if (flip==1) 代码?您是否完全按照我写的方式尝试了我的答案中的代码?
  • @craftworkgames 是的,正如我所说的位置不是中心,这就是为什么我在翻转的情况下添加了 flip==1 以将中心添加到该位置,然后执行您所写的操作。做你的代码和我在线程中写的都不起作用。

标签: xna monogame


【解决方案1】:

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

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

但是,如果您想要一种快速而肮脏的方法,您可以像这样简单地翻转每个部分的偏移量:

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); 
}

这是假设Position 位于精灵的中心,如果不是,您可能需要进行一些调整。

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

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

【讨论】:

  • 感谢您的帮助,但该解决方案对我不起作用,不确定原因。位置不是中心,但我试图找到中心并添加它,我在结果和新代码中编辑
猜你喜欢
  • 1970-01-01
  • 2015-03-15
  • 2014-06-04
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2022-11-08
  • 2020-12-06
相关资源
最近更新 更多