“Gerçek birimler” i piksel olarak ölçeklendirmek için ortak düzen?


10

Bu diğerini takip eden bir soru .

Dünya temsilimi (şu anda 160Kmx160Km) çizim alanına (şu anda 800x600 piksel) sığdırmak için ortak / tipik / en iyi desen olup olmadığını bilmek istiyorum .

En az dört farklı yaklaşım düşünebilirim:

Saf biri (şimdiye kadar yaptığım gibi). Ben sc(vector)sadece aktarılan vektörün küçültülmüş bir kopyasını döndürecek küresel bir işlev uyguladı . Bu tabii ki işe yarıyor, ama gibi bir kod yazmak zorunda bana:

drawCircle(sc(radius), sc(position))

Sarma fonksiyonları . Her biri orijinal ara katman yazılımını saran birkaç işlev tanımlayabilirim. Örneğin myDrawCircle, önce ölçeklendirme gerektiren argümanları ölçeklendirebilir ve sonra drawCircleikincisiyle çağırabilirim . Bu benim kod belki daha okunabilir ve bakımı daha kolay hale getirecek, ama aptalca geliyor sarma fonksiyonları bir sürü yazmalıyım.

İşlev dekoratörü . Sınıfın bir örneği olan tüm parametreler için otomatik ölçeklendirme sağlayarak varolan ara katman yazılımı işlevlerini dekore edebilirim Vector3D, ancak sorun, bu işlevlerin aynı parametrelerle listveya aynı şekilde çalışması Vector2Dve dekoratörün bilmenin hiçbir yolu olmamasıdır. hangi listelerin ölçeklendirilmesi gerekir (örneğin yarıçap) ve hangilerinin değil (RGB değerleri).

Yüzey başlatma . Üzerine çizeceğim yüzeyi tanımlarken ölçeklendirme faktörünü tanımlayabilirim (böylece piksel olarak değil, metreyi parametre olarak kullanırım). Bu benim için şeffaf bir şekilde işe yarayacaktı ve benim seçim çözümüm olacaktı, ancak elbette ara katman yazılımında uygulanmalı, bu yüzden gerçek bir seçenek değil.

... her neyse: bu çok yaygın bir sorun olduğundan, bulamadığım bu sorunu zarif bir şekilde çözen yerleşik bir kalıp olup olmadığını merak ediyorum.

Not: Bu proje için python kullanıyorum ( pygame ile ), ancak - python / pygame'e özgü bir cevap çok takdir edilse de, modelin somut uygulaması yerine genel / yüksek düzeyli tanımıyla daha fazla ilgileniyorum.

Zamanınız ve uzmanlığınız için şimdiden teşekkür ederiz.

Yanıtlar:


6

Bunu yapmanın standart yolu, oluşturma sırasında dönüşümü yapmak için bir dönüşüm matrisi oluşturmaktır. 3B oluşturma için bunu yapan kameranın görüntü dönüştürme matrisidir.

Çoğu 2D API, bir görünüm dönüşümünü 2x3 matrisi veya ayrı bir ölçek, çeviri ve döndürme olarak belirtmenin bir yoluna sahiptir.

Pygame belgelerine hızlı bir bakış, bir görünüm dönüştürme matrisini kendiniz uygulamak zorunda kalacağınızı gösterir. Bu işlevselliği eklemenizi sağlamak için kendi sınıfınızı yüzey sınıfından almanıza izin veriyor mu?


Cevap çok faydalı (+1). Yüzey sınıfımı alt sınıflandırabilirim, ancak gönderinizde belirtilenlere ulaşıp ulaşamayacağımı keşfetmek için daha fazla zamana ihtiyacım var. Genel olarak oyun programlama ve grafik konusunda çok yeniyim, bu matris yaklaşımını (ya da sadece bir yüzeyi ölçeklendirmek için bir matris kullanma ile ilgili matematiği) açıklamak için bazı bağlantınız var mı? Teşekkür ederim!
mac

1
2D olduğundan ve @ rotasyon dahil olmadığından @mac temel olarak fonksiyonları sarmayı söylüyor ve bu sarmalayıcılarda basit ölçek bölmenizi kullanabilirsiniz. Normalde tam bir matrisin kullanılmasının nedeni, çoğu API'nin görünümü kontrol eden bir matrise sahip olmasıdır, ancak pygame'in bunu bir katman yukarı yapmanız gerekmediği anlaşılmaktadır.
Patrick Hughes

2

Bu çok yaygın bir sorun olduğundan, bulamadığım bu sorunu zarif bir şekilde çözen yerleşik bir kalıp olup olmadığını merak ediyorum.

Genellikle insanlar 2D oyunlarda çalışma zamanı ölçeklendirme yapmaya çalışmazlar. Bunun ortak bir sorun olduğu konusunda hemfikir değilim. İnsanlar bir mini harita veya başka bir sabit yeniden ölçekleme isterse, bu amaçla genellikle yeni bir dizi grafik yapılır. Bir 2D oyunda 2 farklı zum seviyesinde koşmak için herhangi bir rutine ihtiyacınız olması nadirdir.

3D API kullanıyorsanız, bu işlevselliği ücretsiz olarak alabilirsiniz - sadece kamera / görünüm parametrelerini değiştirin.

PyGame çok eski bir API ve maalesef sadece 2D için gerçekten uygun. Farklı zum seviyeleri için yeterli ölçeklendirme sistemleri çalışabilseniz bile, performans yeterince iyi olmayacak ve görünüşün kabul edilemez derecede kötü olması muhtemeldir.

Çok yakınlaştırmak ve uzaklaştırmak istiyorsanız, en kısa zamanda modern bir 3D API'ya geçmenizi tavsiye ederim. Pyglet tavsiye ederim ama diğerleri de olması muhtemeldir.


Cevabınız için teşekkür ederim (+1). pygletsGeçmişte bir 3D simülasyon için zaten kullandım . Elbette bundan daha yeteneklidir pygame, ancak 2D desteği içerdekinden oldukça düşük seviyededir pygame. Mevcut dokümantasyon / örnekler daha az detaylıdır, bu da oyun geliştirmeye yeni başladığım için benim için daha sersem ve en yaygın olarak gerçekleştirilen işlemlerin temelini anlamam gerekiyor. :) Pygame "yaş" gelince: haklısın. Bir modernizasyon Ancak sürüyor! :)
mac

Gelince: "2 farklı zum düzeyinde çalıştırmak için herhangi bir rutin ihtiyacınız nadirdir" ... Ben bir pencere boyutunu / tam ekran oyun çözünürlüğünü değiştirirken kullanılacak olacağını düşündüm. Yorumunuzdan bunun olmadığını anladım: onun yerine "ortak" ne olduğuna dair herhangi bir işaretçi?
mac

Pyglet'in pygame'den daha düşük olduğu yerlerde hangi 2D işlemleri yapıyorsunuz? Her ikisi de 1 satır kodlu bir hareketli grafik çizmenize izin verir. Bir 2D oyunun pencere boyutunu değiştirdiğinizde, piksel / dünya birimi oranı neredeyse her zaman sabit kalır. Böylece daha fazla sprite çekiyorsunuz: onları farklı çizmiyorsunuz.
Kylotan

Şeylerin düşük seviyeli tarafında: İki kütüphanenin hiçbirinde gerçekten uzman değilim, ancak pigilerde kutunun dışında, pygame tarafından sunulan davranışları ( pygame.sprite.LayeredUpdatesörneğin olduğu gibi) kopyalayamadım . Değişmeyen orana gelince: Ne demek istediğini anladım. Açıkladığınız davranış çoğaltmak istediğim davranış değil, ama ne demek istediğinizi anladım, açıklama için teşekkürler! :)
mac

pyglet'in OrderedGroup nesneleri var - siz veya başka biri ilgileniyorsanız dokümanlar burada: pyglet.org/doc/programming_guide/displaying_images.html#sprites
Kylotan 26:07
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.