Среда, 27 Ноября 2024, 00:16

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Снова Я ))) (и снова про 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 ()
собственно, такой метод масштабирования везде используется, вроде как...
Возможно и так. Я написал только тот, который знаю. Над другим способом не приходилось думать biggrin

формула уже потом подгоняется под свои нужды. в данном методе идёт масштабирование картинки на весь экран.


Сообщение отредактировал wmysterio - Пятница, 25 Апреля 2014, 08:17
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг