2016-04-27 7 views
2

私の問題は、私がスプライトをスケールし、それらがスケールの前と同じ場所に保持できるようにしたいということです。私は私のスプライトも回転できるようにしたいので、私は原点のパラメータにスプライトの中心を使用します。MonoGame/XNA Scaling and Origin

私は解決策は簡単だろうと確信していますが、私はこの問題を解決するための適切な/一般的な解決策を見つけることができません。

実際にはっきりしない場合は、私のコード、このコードの結果、および達成したいことを示すために写真をいくつか作成しました。ここのコメントで示唆したようhttp://pasteboard.co/uOogJeL.png

がある: -

1は、この私のコードと、この結果は私がスプライトをスケーリングするときに、スプライトが拡大縮小されますが、それは「移動」を参照してくださいすることができますよう私は、得るものですコード:

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 - これは、私が達成したいものです、私は私の原点を移動することでこれを行うことができます知っているが、私はこの点を中心に回転を適用することができるようにスプライトの中心でそれを維持したいです:http://pasteboard.co/rzMfc0p.png

ありがとうございました。

+0

ようこそ。あなたは質問の本文にコードを貼り付けることができます。これにより、ページ間を移動することなく質問を読むことが容易になります。リンクしたページが削除された場合でも、将来の読者のために質問にコードが残っています。 –

答えて

1

誰かが私を助け、私の問題(Pema99 @ pemathedev)の解決策を見つけました。他の人に示唆されているように、ソリューションはスプライトを実際に動かしていました。ここであなたのsp儀式:

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

みんなありがとう!

0

まあ、あなたは確かにあなたのキャラクターを維持しています。文字通り。あなたが必要なのは、実際にあなたの脚が常に地面にとどまるようにあなたのキャラクターを移動することです。

これがコード全体であれば、物理学(まだ)がないことを意味します。この場合、キャラクターの位置を画面上の高さの半分(image.height * scale)の上下に動かす必要があります。垂直スケールが変化している場合にのみ行います。物理学をいったん配置するとこれはうまくいきませんが、今のところテストされていませんが、提案されたコードはここにあります。あなたはそれがより迅速に行うことができることを確認するために、そしてあなたのコードをより読みやすくすることができますため

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

    if (Input.IsKeyPressed(Keys.O)) 
    { 
     scale.Y += .05f; 
     marioPosition.Y -= scale.Y * (Sprites.MARIO.Height/2f); 
    } 
    if (Input.IsKeyPressed(Keys.L)) 
    { 
     scale.Y -= .05f; 
     marioPosition.Y += scale.Y * (Sprites.MARIO.Height/2f); 
    } 

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

    Input.Update(gameTime); 
} 

私はscale.Y += .05f;scale += new Vector2(0.0f, 0.05f);を変更する唯一の理由です。

また、XNAの反転縦(Y)軸のために、文字が上に移動するためには、を自分の位置から引き、をその位置から減算する必要があります。

いくつかの余分なヒント:

  • クラスすべてのスプライトのためには素晴らしいアイデアです、また、すべての入力(入力)のためのクラスがあまりにも

  • の代わりに4で.05fを書いて素晴らしいですそれらの場所にある変数を作成し、その値をに設定します。05F

0

私はあなたが提案し何をしたが、それは実際にはスプライトを移動します。ここで/

は私が行った変更である:http://pasteboard.co/vqTN2vX.png

:ここ

 Vector2 scale = Vector2.One; 
     float rotation = 0; 
     Vector2 marioPosition = new Vector2(64, 112 - 32); 
     Rectangle source = new Rectangle(0, 0, 16, 32); 

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

      if (Input.IsKeyPressed(Keys.O)) 
      { 
       scale.Y += 0.05f; 
       marioPosition.Y -= scale.Y * (source.Height/2f); 
      } 

      if (Input.IsKeyPressed(Keys.L)) 
      { 
       scale.Y -= 0.05f; 
       marioPosition.Y += scale.Y * (source.Height/2f); 
      } 


      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 origin = source.Size.ToVector2()/2; 

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

      spriteBatch.End(); 
     } 

は結果であり、