2017-02-03 2 views
0

Also arbeite ich gerade an der Auflösung Unabhängigkeit für mein Spiel, und ich teste es auf einem Schwert Bild. Die Positionsänderung funktioniert, aber wenn ich mit der Größe anfange, lande ich mit einem leeren Bildschirm.Skalieren einer Sprite-Größe mit einem Vektor2 Monogame C#

Dies sind die Funktionen, die ich ausführen, um die neue Position und Größe des Sprites zu erhalten.

private static float CalcRatio(Vector2 size) 
    { 
     return size.Y/size.X; 
    } 

    public static Vector2 CalculateNewPos(Vector2 refPos, Vector2 refScreenSize, Vector2 currentScreenSize) 
    { 
     return new Vector2((refPos.X/refScreenSize.X) * currentScreenSize.X, 
          (refPos.Y/refScreenSize.Y) * currentScreenSize.Y); 
    } 

    public static Vector2 CalculateNewSize(Vector2 refSize, Vector2 refScreenSize, Vector2 currenScreenSize) 
    { 
     float origRatio = CalcRatio(refSize); 
     float perW = refSize.X * 100f/refScreenSize.X; 
     float newW = perW/100f * currenScreenSize.X; 
     float newH = newW * origRatio; 
     return new Vector2(newW, newH); 
    } 

In der Initialisierungsfunktion in Game1 betreibe ich diesen Code:

graphics.PreferredBackBufferHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height; 
graphics.PreferredBackBufferWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width; 
swordPosition = CalculateNewPos(swordRefPosition, new Vector2(1920, 1080), new Vector2(GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width, GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height)); 
swordSize = CalculateNewSize(swordRefSize, new Vector2(1920, 1080), new Vector2(GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width, GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height)); 

In der Ladefunktion ich dies auszuführen:

swordTexture = content.Load<Texture2D>("SOLDIER_Sword"); 
swordPosition = new Vector2(300, 0); 
swordRefSize = new Vector2(557, 490); 
swordSize = new Vector2(557, 490); 
swordRefPosition = new Vector2(300, 0); 
swordColor = Color.White; 
sword = new StaticSprite(swordTexture, swordPosition, swordSize, swordColor); 

In Update jedes Mal die Bildschirmauflösung ändert (ich habe Tasten eingestellt, um dies zu tun) dies:

graphics.PreferredBackBufferHeight = setHeight; 
graphics.PreferredBackBufferWidth = setWidth; 
graphics.ApplyChanges(); 
swordPosition = CalculateNewPos(swordRefPosition, new Vector2(1920, 1080), new Vector2(setWidth, setHeight)); 
swordSize = CalculateNewSize(swordRefSize, new Vector2(1920, 1080), new Vector2(setWidth, setHeight)); 

Und in Draw:

batch.Draw(swordTexture, swordPosition, null, swordColor, 0f, Vector2.Zero, swordSize, SpriteEffects.None, 0f); 

Leider gibt es so viel Code ist, bin ich wirklich ratlos und kann nicht erkennen, wo es schief läuft, so dass ich eingeschlossen nur alles, was die Variablen ändert.

Vielen Dank, dass Sie sich die Zeit genommen haben, durchzusehen.

+0

Sie können einen Blick auf die Antwort werfen, die ich für diese Frage geschrieben habe: http://stackoverflow.com/questions/18645032/change-and-scale-resolution-of-xna-game/20813250#20813250 – Falgantil

+0

Beachten Sie, dass aktuelle Der Anzeigemodus ist nur dann sinnvoll, wenn Sie im Vollbildmodus sind. Es ist der VIEWPORT, der Ihnen die Breite/Höhe der Spritebatch-Projektionsmatrix angibt. – James

Antwort

0

Beachten Sie, dass der aktuelle Anzeigemodus nur dann sinnvoll ist, wenn Sie im Vollbildmodus sind. Es ist der VIEWPORT, der Ihnen die Breite/Höhe der Spritebatch-Projektionsmatrix angibt.

Das heißt, Sie sollten wirklich in Bjarkes Beitrag schauen, weil Sie normalerweise nicht jedes einzelne Element neu skalieren möchten.