Мащабиращи спрайтове (не текстури) за целевия размер/устройство на прозореца за изглед в MonoGame

Когато трябва да покажете поредица от визуални компоненти (спрайтове) в контекста на игра, като всеки от тях взема буквална височина и ширина, които трябва да бъдат относителни към височината и ширината на Viewport (не непременно съотношение на страните) на целевото устройство:

  • Има ли клас за мащабиране, който да помогне да се измисли съотношение на мащабиране по динамичен начин въз основа на текущия размер на прозореца за изглед на устройството?
  • Ще трябва ли да превъртя собствен алгоритъм за съотношение на мащабиране?
  • Някакви проблеми с различни платформи, за които трябва да знам?

Това не е въпрос, свързан със зареждането на активи, базирани на целево устройство, нито е въпрос как да се извърши мащабирането на спрайта (което е описано тук: http://msdn.microsoft).com/en-us/library/bb194913.aspx), по-скоро въпрос как да определяне на мащаба на спрайтовете въз основа на размера на порта за изглед.


person holsee    schedule 08.02.2013    source източник
comment
Мащаб на какви спрайтове, с какъв размер, в сравнение с какво в колко голям прозорец за изглед? Един пример би бил чудесен.   -  person user1306322    schedule 08.02.2013


Отговори (2)


Винаги можете да създадете своя собствена реализация на мащабиране.

Например размерите на целевия прозорец по подразбиране са:

const int defaultWidth = 1280, defaultHeight = 720;

А текущите ви размери на екрана са 800×600, което ви дава (нека използваме Vector2 вместо две плаващи числа):

int currentWidth  = GraphicsDevice.Viewport.Width,
    currentHeight = GraphicsDevice.Viewport.Height;

Vector2 scale = new Vector2(currentWidth  / defaultWidth,
                            currentHeight / defaultHeight);

Това ви дава {0.625; 0.83333}. Вече можете да използвате това в удобно SpriteBatch.Draw() претоварване който приема Vector2 променлива за мащабиране:

public void Draw (
     Texture2D texture,
     Vector2 position,
     Nullable<Rectangle> sourceRectangle,
     Color color,
     float rotation,
     Vector2 origin,
     Vector2 scale,
     SpriteEffects effects,
     float layerDepth
)

Като алтернатива можете да начертаете всичките си неща в RenderTarget2D и да копирате полученото изображение от там в разтегната текстура на главния екран, но това пак ще изисква горното претоварване SpriteBatch.Draw(), въпреки че може да ви спести време, ако имате много извиквания за рисуване .

person user1306322    schedule 08.02.2013
comment
Това със сигурност е правилният отговор, но за моите нужди той не отговаря на това, че мащабирането се обърка с откриването на жестове с докосване (не е споменато във въпроса). Отговорът ми разреши проблемите ми по много прост начин, но разбирам, че може да не е най-чистото решение занапред. Ето защо маркирах това като правилен отговор. - person holsee; 09.02.2013
comment
Здрасти, използвах тези кодове, можеш ли да ми кажеш как мога да мащабирам въвеждането с докосване след това.... - person uncle_scrooge; 01.10.2015
comment
@uncle_scrooge, ако искате отговор на различен въпрос, трябва или да намерите такъв въпрос, или да го зададете, а не да публикувате коментар. - person user1306322; 01.10.2015
comment
това не е различен въпрос...напълно е свързан с това.входящите данни след мащабиране няма да работят...знаете това... - person uncle_scrooge; 01.10.2015
comment
както и да е, вероятно сте направили нещо за вашето сензорно въвеждане...между другото, аз вече създадох въпрос относно това преди два дни....Моля, отговорете, ако искате..по-долу е връзката.. - person uncle_scrooge; 01.10.2015
comment
Изобщо не използвам сензорно въвеждане. Моето XNA кодиране беше ограничено само до компютър, така че не, не знам и не мога да ви помогна с въвеждане чрез докосване. Вашият въпрос може или не може да е свързан, но не е същия въпрос. В противен случай ще намерите отговор тук. - person user1306322; 01.10.2015

Друг вариант за генериране на скалата би бил да се използва:

var scaleMatrix = Matrix.CreateScale(
           (float)GraphicsDevice.Viewport.Width / View.Width,
           (float)GraphicsDevice.Viewport.Width / View.Width, 1f);

http://msdn.microsoft.com/en-gb/library/bb195692.aspx.

Но това не отговаряше на нуждите ми, тъй като след това трябваше да превъртя собствената си трансформация, за да картографирам местоположението на въвеждане с докосване към „трансформираните“ спрайтове (които отговарят на въвеждането с докосване от потребителя, като знаят собствената си позиция и размер).

В крайна сметка използвах процентен подход.

По принцип имам височината и ширината на прозореца за изглед...

GraphicsDevice.Viewport.Width  
GraphicsDevice.Viewport.Height

... след това изчислих височината и ширината на моите спрайтове (забележка: "както беше споменато по въпроса, те вземат буквална височина и ширина") въз основа на техния относителен размер към екрана, използвайки проценти.

//I want the buttons height and width to be 20% of the viewport 
var x, y = GraphicsDevice.Viewport.Width * 0.2f; //20% of screen width
var btnsize = new Vector(x,y);
var button = new GameButton(btnsize);

След това, след като имам размера на бутона, мога да изчисля позицията на екрана, за да изобразя бутона въз основа на размера на бутона и наличния размер на прозореца за изглед, срещу работа в относителна позиция въз основа на проценти.

person holsee    schedule 09.02.2013