| 
	
		
		
			| Снова Я )))  (и снова про XNA) |  |  |  | 
| arthurfok | Дата: Суббота, 25 Августа 2012, 16:57 | Сообщение # 1 |  |   частый гость Сейчас нет на сайте | можно ли сделать так, что бы программа (игра) автоматически изменила все свои размеры под любой монитор (под любое разрешение) в том числе и окна WinForms (которые я добавил в проект) ??? Например у меня разрешение стоит 1280*1024 и я пишу программу под свой монитор (размеры текстур и т.д.) и что бы она отображалась на других мониторах (скажем 1024*768) в таком же масштабе как и у меня , я сделал так:
 в Vector2 scale считал scale.X и scale.Y в зависимости от разрешения экрана и
 при рисовании в spriteBatch.Draw передал аргумент scale ,,, но т.к. у меня до фига текстур, которых надо рисовать, то таким образом придется у всех передать этот scale.
 Вот,,,, можно ли как нибудь это автоматизировать??
 например в конструкторе Game1 написать что то, после чего все сделалось автоматически , или как то еще? (и вообще как все это делают в написании игр?! )
 
 Спасибо
 
 
 Сообщение отредактировал arthurfok - Суббота, 25 Августа 2012, 18:10 |  |  |  |  |  | 
| VolkodavAD | Дата: Понедельник, 27 Августа 2012, 13:48 | Сообщение # 2 |  |   частый гость Сейчас нет на сайте | Уже который день тема висит, и без ответов. Не актуально уже? А вообще, не совсем понял что именно требуется? За что отвечает Vector2? За масштаб самого спрайта, или точку начала спрайта? Просто если их масштабировать под конкретный монитор, то в широкоформатных версия будет сильное искажение, так как масштаб по Х и У будут заметно отличаться.
 
 Думай, что говоришь. Говори, что думаешь.
 |  |  |  |  |  | 
| Stalker_Shooter | Дата: Понедельник, 27 Августа 2012, 15:48 | Сообщение # 3 |  |   3D XNA'шник Сейчас нет на сайте | arthurfok, помойму есть такая функция в самой XNA. Сейчас времени нет, позже гляну, отпишусь. 
 *Не убегай от снайпера, умрешь уставшим.
 *Мои статьи...
 |  |  |  |  |  | 
| arthurfok | Дата: Вторник, 28 Августа 2012, 11:04 | Сообщение # 4 |  |   частый гость Сейчас нет на сайте | Stalker_Shooter, хорошо, буду ждать. заранее спасибо. VolkodavAD, да ты прав, искажение есть (написал Vector2 ,чтоб передать в аргументы в spritebatch.Draw() ,, scalxe.X -это масштаб по оси Х, а scale.Y - по оси Y)
 
 
 Сообщение отредактировал arthurfok - Вторник, 28 Августа 2012, 11:04 |  |  |  |  |  | 
| Stalker_Shooter | Дата: Вторник, 28 Августа 2012, 12:12 | Сообщение # 5 |  |   3D XNA'шник Сейчас нет на сайте | arthurfok, увы, что-то не могу найти. Возможно, я ошибся... 
 *Не убегай от снайпера, умрешь уставшим.
 *Мои статьи...
 |  |  |  |  |  | 
| arthurfok | Дата: Вторник, 28 Августа 2012, 17:57 | Сообщение # 6 |  |   частый гость Сейчас нет на сайте | Stalker_Shooter, (((( |  |  |  |  |  | 
| wmysterio | Дата: Пятница, 25 Апреля 2014, 07:47 | Сообщение # 7 |  |   был не раз Сейчас нет на сайте | Не знаю, нужно кому либо сейчас, но напишу - вдруг кому-то понадобится в будущем. 
 Масштабирование текстуры на мониторе происходит так:
 
 Код Масштаб = РазмерЭкрана / РазмерКартинкиЛучше всего использовать метод рисования 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 );
 }
 
 }
 
Примерно так. Я правда использую масштабирование только в меню игры, но уж никак не в самом скрине, где управлять игроком.
 
 
 Сообщение отредактировал wmysterio - Пятница, 25 Апреля 2014, 07:50 |  |  |  |  |  | 
| Folleah | Дата: Пятница, 25 Апреля 2014, 07:54 | Сообщение # 8 |  |   Архитектор Сейчас нет на сайте | wmysterio, собственно, такой метод масштабирования везде используется, вроде как... 
 
   
 
 Сообщение отредактировал Folleah - Пятница, 25 Апреля 2014, 07:54 |  |  |  |  |  | 
| wmysterio | Дата: Пятница, 25 Апреля 2014, 08:07 | Сообщение # 9 |  |   был не раз Сейчас нет на сайте | Возможно и так. Я написал только тот, который знаю. Над другим способом не приходилось думатьЦитата Folleah (  ) собственно, такой метод масштабирования везде используется, вроде как...   
 формула уже потом подгоняется под свои нужды. в данном методе идёт масштабирование картинки на весь экран.
 
 
 Сообщение отредактировал wmysterio - Пятница, 25 Апреля 2014, 08:17 |  |  |  |  |  
 |