Loading...
Valleri avatar Valleri 304 Точки

Скалиране на картинки

Здравейте!
Може да сме го говорили на лекции, но мисля че ще е добре да го има и черно на бяло.
Първият ми въпрос е, как да рендер-ваме картинки в реалния им размер, тоест без дефолтното скалиране към прозореца.

И втория въпрос е малко по-сложен.
Да кажем съм си избрал карта за играта която е 4096х4096.
Прозореца, който засега ползвам е 640х480.
Бих искал да видя само сегмент от картинката си когато я рендя с размерите на екрана, НО когато отворя на голям екран или ползвам друго устройство, искам да виждам същото парче карта, тоест това че съм на голям екран не трябва да значи, че виждам повече от картата, а по-скоро, че всичко е по-голямо.

Тагове:
1
C++ Applications Development
Valleri avatar Valleri 304 Точки

На първия въпрос си отговорих. Просто трябваше да дефинирам един правоъгълник с истинските размери на картинката и да го подам като последен параметър на SDL_RenderCopy.

0
Smeshan avatar Smeshan 89 Точки

Интересно. Единственото, за което се сещам, е че ако гледаш една част от картинката на 960 х 540 прозорец и искаш да виждаш същата част на full screen примерно 1920 x 1080, то трябва да я скейлнеш 2 пъти. Така екрана ще ти е два пъти по-голям и картинката ще ти е двата пъти по-голяма и ще се вижда едно и също. Но тук съм ги нагласил да се делят точно на две. Предполагам има и други начини :)
Има SDL_RenderSetViewport() , която мисля също може да се ползва за целта.

Поздрави,

Илиян

1
23/10/2021 20:17:55
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, Валери,

Интересни въпроси си задал.
Радвам се, че си си отговорил на първия - този за мащабирането.
Ако все още имаш проблеми - изгледай все пак лекцията за Scaling and Alpha Blending.
В крайна сметка половината занятие правихме точно това - скалиране :)

Относно втория въпрос - как да постигнеш приложението ти да работи на различни устройства с различни екрани.
За да поснигнеш желания ефект и абсолютно винаги да се вижда една и съща част от картата е достатъчно просто да създадеш прозорец с желания размер.
Така, всичко което е извън този прозорец, няма да се вижда.

Можеш да ползваш и viewport, както сподели Илиян.

Друг е въпроса вече дали би искал да имаш константен прозорец (640х480) на всички устройства.
Да кажем, че един нормален монитор има FullHD - 1920x1080.
Тези цифри не са същите за един телефон.

Разгледай хедърите 
<SDL_window.h> и <SDL_render.h>
Вътре има доста интересни неща.

Например можеш да вземеш колко е максималния размер на монитора, на който работи приложението ти.

const int32_t windowIdx = SDL_GetWindowDisplayIndex(sdlWindow);
SDL_DisplayMode modeData;
SDL_GetDesktopDisplayMode(windowIdx, &modeData);
std::cout << "windowWidth: " << modeData.w << ", windowHeight: " << modeData.h;


След това трябва да изрендираш целият backbuffer на run-time texture и в последствие да скалираш този texture до размерите на прозореца.
Как става това?
Ще учим в последната лекция - Game (4/4) - Performance optimizations

Поздрави

1
Valleri avatar Valleri 304 Точки

Благодаря и на двама ви за отговорите!
Живко, мисля че ми отговаряш на по-напреднало ниво отколкото съм и Илиян е малко по-близо до отговора на въпроса ми.
Което ти описа е, как да скейлваме картинка/картата ни до размера на прозореца, нали така?
А моя въпрос е по-скоро следния - ще се опитам да го перефразирам.

Представи си че цъкаш Дота или Старкрафт на 640х480 монитор на фулскрийн, където имаш една голяма карта, но екрана ти вижда във всеки един момент само един малък правоъгълник от нея. 
Размерите на ресурса "карта" са 1960х1080 пиксела.

Ъпгрейдваш си монитора и вече имаш 1960х1080 екран. Отваряш отново на фулскрийн и вече виждаш цялата карта на екрана - това не е желания ефект. 
По-скоро играта ни пак трябва да показва същия отрязък, който видяхме на малкия монитор, но скалиран/зуумнат, и единиците и сградите ни ще изглеждат по-големи.
Тоест, трябва да има някаква логика, която следи размера на екрана и скалира картата с същите пропорции.

П.С. Съжалявам, Живко, ако си ми отговорил вече, но малко бавно зацепвам :))

1
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, Валери,

Отговорът на въпроса ти става с 1 ред - да направиш или прозореца или viewPort-а на желаните размери.
Това обаче ще е грозно, защото като го пуснеш на full screen ще имаш този прозорец 640x480 и останалото ще е черен цвят около него.

За да избягаш от този ефект трябва прозорецът винаги да ти е с големината на физическия екран.
След това вече "константната" картинка 640x480 ще я скалираш за да стане с големината на прозореца.
Така твоите widgets биха била по-големи на по-голям екран.

Поздрави

1
Valleri avatar Valleri 304 Точки

Ахаа! Веднага го разбрах, след това обяснение. Благодаря!

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.