Çözünürlükten bağımsız bir sistemi nasıl yapabilirim?


10

Bunu körüyorum. Tabii ki kenarlara demir atabilirim, bu da UI çözünürlüğümü bağımsız hale getirir ... grafikler çok küçük olana kadar değişene kadar. Gerektiğinde uygun şekilde nasıl ölçeklendirebilirim? Ölçekleme sırasında grafiklerimi doğru oranda nasıl tutarım? Kararın, 16:10 gibi farklı bir orana sahip olmasından farklı olarak, bunların gerilmesini istemiyorum.

Buna doğru ve test edilmiş bir yaklaşım var mı? Video oynatıcılar bu sorun nedeniyle siyah kenarlıklar gösteriyor, bu doğru bir şekilde çözülemez mi?


1
[Bu] [1] soruya bakınız. Cevabım bazı kanlı detayları açıklıyor. [1]: gamedev.stackexchange.com/questions/34/…
Mühendis

Yanıtlar:


5

Öncelikle, rasterleştirme ile teknik olarak gerçek çözünürlük bağımsızlığı diye bir şey olmadığını unutmayın. Yeterince yüksek büyütme ile tek tek dokular görünür olmaya başlayacaktır. Bunun tek çözümü bir vektör grafik sistemi yazmaktır.

Bununla birlikte, sağlam bir raster tabanlı çözünürlük bağımsız sistem oluşturmak için birkaç adım vardır: boyutlandırma, koordinat sistemleri ve düzen.

Boyutlandırma ve konumlandırma için, gerçek uygulama çözünürlüğüne oranı koruyan bazı birimler kullanmamız gerekir. Bu durumda inç kullanalım çünkü Amerikalıyım ve elemanları DPI (inç başına nokta sayısı) ile ölçeklendirebilirsiniz. Diyelim ki uygulamanız 800x600'de çalışıyor. Varsayılan Windows DPI 96'dır, yani uygulamanın (800/96) x (600/96) inç veya 8.33x6.25 inç çözünürlüğe sahip olduğu anlamına gelir.

En azından, hem 4: 3 hem de 16: 9 en boy oranlarıyla çalışabilmeniz gerektiğinden, ekran koordinat sisteminizi nasıl ele aldığınızı biraz zorlaştırır. Yapmayı tavsiye ettiğim şey (0,0) 'ı ekran alanının ortasına (pencereler ve kontroller) koymak. Bu işe yarar, çünkü bir köşeye (0,0) koyarsanız, o zaman çözünürlük ve en boy oranına göre köşe hareket ettikçe, tüm spritelarınızı çevirir, ekranın merkezi her zaman ekranın merkezi olur cihaz. Örneğimizi 800x600 ile sürdürmek, bu, (soldan sağa) -4.165in ila 4.165in ve (yukarıdan aşağı) 3.125in ila -3.125in arasında bir koordinat sistemi ile sonuçlanır.

Şu anda, ekranın merkezine göre her zaman aynı noktada olacak öğelerden bağımsız olarak bağımsız DPI kullanıcı arayüzüne sahipsiniz - çözünürlükten bağımsız değil. Neyse ki DPI bağımsızlığının yapmanıza izin verdiği şey, DPI'ı sezgisel olarak baz alarak ölçeklendirmektir. Örneğin buluşsal yöntem olarak dikey çözünürlüğü kullanarak DPI'yi ölçeklendirebiliriz. 800x600 96 DPI ise 1024x768 için 123 DPI veya 1280x720 için 115 DPI kullanırız.

Son olarak, hem mutlak konumlandırmayı hem de göreceli konumlandırmayı işleyen bir düzen sistemi oluşturmanız gerekecektir. Bunun mükemmel örnekleri WPF ve web'dir. Denetimlerin / kutuların, diğer birçok yararlı otomatik mizanpaj seçeneğiyle birlikte bir kenara kenetlenirken üst öğenin% bir kısmını doldurduğunu belirtebilirsiniz. Tüm bunlar birlikte, birçok farklı çözünürlük ve en boy oranlarında neredeyse aynı görünebilen bir UI sistemi ile sonuçlanacaktır.

Özetlemek gerekirse, sol üst köşedeki koordinat sisteminde bir başlangıç ​​noktası olması ve DPI'yi dikey çözünürlüğe göre otomatik olarak ölçeklendirmemesi dışında neredeyse tüm bunları yaptığı için WPF'yi incelemenizi şiddetle tavsiye ederim.


-1

Genellikle ne yapmak istediğiniz oyuna bağlıdır.

Bir seçenek, en boy oranı (oran) farklıysa siyah kenarlıklara sahip olmaktır (muhtemelen en kolay, sadece dokuya dönüştürün, ardından ekranı ekrana getirin, uygun şekilde yeniden boyutlandırın).

Başka bir seçenek, farklı en boy oranları için farklı oluşturma yollarına sahip olmaktır. Geniş ekran için bir tane, 'normal' için bir tane olabilir.

Yine başka bir seçenek, işleri ayrı ayrı ölçeklendirmektir, örneğin, çözünürlüğe bağlı olarak bir UI mesaj kutusunu büyütme veya küçültme. Nereye çizeceğinizi bulmanız gerektiğinde, tam pikselleri kullanmak yerine 0,2 aşağı, 0,8 çapraz, genişlik 0,1, yükseklik 0,3 gibi şeyler yapın. Şaşırtıcı bir şekilde, iyi olabilecek şeyleri nasıl çizdiğinize bağlı olarak (yani bir UI arka planını uzatın, ancak metni değil) şeyleri esnetirsiniz.

3D açısından, görüntü alanını doğru ayarladığınız sürece, geniş ekran oynatıcıların geniş ekran olmayan kurulumlardan biraz daha fazlasını görebilmeleri gerekir. (alternatif olarak siyah kenarlıklar çizin / veya görünümü uzatın).


"sadece dokuya dönüştürün, sonra bunu ekrana göre yeniden boyutlandırın, uygun şekilde yeniden boyutlandırın" Hayır. Bu gerçekten bulanık ve garip görünen bir görüntü yaratacaktır. Ya çözünürlük çok düşükse? Her şey okunamayacak.
Tara

Okumaya devam et, bu birkaç seçenekten biri. Açıklamakta olduğunuz sorunları kesinlikle alamazsınız (basit / yanlış yapılırsa evet bulanık ve gergin olurdu, ancak)
George Duckett

Okumaya devam ettim. Ama cevabınız çok belirsiz. Ayrıca, her şeyi düşük bir çözünürlüğe dönüştüremediğiniz ve metnin mükemmel okunabilir kalmasını bekleyemeyeceğiniz için kesinlikle tarif ettiğim sorunları alırsınız.
Tara

Açıkçası sadece daha yüksek çözünürlükte render yapmak da yapaylık üretecek olsa da, hedeften daha düşük bir çözünürlük render render demiyorum. Cevabım da dışarıda olabilirdi, ancak kabul edilmiş iyi bir cevap olduğu için buna cevap vermeyeceğim. Bir şey çizmek için nerede (ve ne kadar büyük) seçmekten biraz farklı olduğu için metin oluşturmadan özellikle bahsetmiştim, ancak çok kısa ve üzerinde durulabilecek doğru.
George Duckett

Ben de hedeften daha düşük çözünürlüğe render demedim. Kullanıcı arabirimi 1: 1'i alıp tasarlandığından daha düşük bir çözünürlüğe dönüştüremezsiniz (daha düşük çözünürlükle kastettiğim budur).
Tara
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.