Снова Я ))) (и снова про 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 |
|
| |
|