Не знаю, нужно кому либо сейчас, но напишу - вдруг кому-то понадобится в будущем.
Масштабирование текстуры на мониторе происходит так:
Код
Масштаб = РазмерЭкрана / РазмерКартинки
Лучше всего использовать метод рисования Draw(..), в котором масштаб принимает Vector2 значение а не float.
Нужно всегда следить за тем, когда меняется размер монитора, чтобы картинка сама изменяла свой масштаб. Проще всего это сделать с помощью событий.
1) Создайте метод, который будет менять расширение экрана.
2) Между namespace и областью класса объявите делегат.
3) В методе вызывайте событие
4) В классе, представленной как картинка ( обычно создают класс, а не используют Texture2D ), подпишитесь на событие изменения и выполните указанный више код.
Пример:Код
public delegate void DimensionEvent( Vector2 Size );
public class Dimension {
public static GraphicsDeviceManager graphic;
private static Vector2 size;
public static event DimensionEvent DimensionChanged;
public static Vector2 Value {
get {
return size;
}
set {
size = value;
graphic.PreferredBackBufferWidth = (int) size.X;
graphic.PreferredBackBufferHeight = (int) size.Y;
graphic.ApplyChanges();
if ( DimensionChanged != null )
DimensionChanged( size );
}
}
public Dimension( Vector2 Size ) {
Value = Size;
}
}
В классе Game1 нужно задать значение графики, чтобы класс имел доступ до методов изменения расширение экрана.Код
public Game1() {
graphics = new GraphicsDeviceManager( this );
Content.RootDirectory = "Content";
Dimension.graphic = this.graphics;
}
protected override void Initialize() {
// TODO: Add your initialization logic here
Dimension dim = new Dimension( new Vector2( 640, 480 ) );
base.Initialize();
}
Класс картинки напишу кратко:Код
public class Picture {
Texture2D image;
Vector2 Zoom, size;
Rectangle SourceRect;
public Vector2 Size {
get {
return new Vector2( image.Width, image.Height );
}
}
/*
content - это менеджер контента, он также должен присутствовать в классе картинки. Как вариант - установите статическое поле, чтобы получать достут к нему из любого класса.
*/
public Picture( string Path ) {
image = content.Load<Texture2D>( Path );
/* прочие установки по умолчанию в классе */
Dimension.DimensionChanged += Dimension_DimensionChanged; // Делаем подписку на изменения расширения
}
void Dimension_DimensionChanged( Vector2 Size ) {
Zoom = Dimension.Value / Size;
} // Обрабатываем событие, изменяя масшаб картинки ( значение Zoom );
public void Draw( SpriteBatch spriteBatch) {
spriteBatch.Draw( image, position, sourceRectangle, color, rotation, origin, Zoom, SpriteEffects.None, 0.0f );
}
}
Примерно так. Я правда использую масштабирование только в меню игры, но уж никак не в самом скрине, где управлять игроком.