2D oyuna kamera / görüntü alanı uygulama


21

Bir 2D oyuna kamera / görüntü alanı uygulamanın en pratik yolu nedir?

Ekrana göre pozisyon yerine nesne dünya pozisyonunu saklamam gerektiğini okudum mu?

Mevcut durum:

XML dosyalarından nesneleri ve seviyeleri yüklediğim basit bir 2D oyun uyguladım. Şu anda düzey XML dosyası şuna benziyor:

<map>
   <tile obj="ground" x="0" y="555" />
   <tile obj="ground" x="16" y="555" />
   <tile obj="ground" x="32" y="555" />
   ...
</map>

Tüm nesneler, geçerli konumlarını ekranda saklayan 2-vektörlü bir "konuma" sahiptir.

Ne olmasını istiyorum:

Viewport / gameworld illüstrasyon

Resimde:

  • Kamera 800x600 veya 640x480
  • Bloklar ve spritelar 16x16 pikseldir.
  • Dünya büyüklüğü değişebilir
  • Koordinatlar muhtemelen ekrana göre değil, dünyaya göre normalleştirilmelidir?
  • Oynatıcı x, y'ye göre görüntüleme konumu ve oynatıcı kamera ölü bölgesine ulaştığında hareket eder ( bu videoya benzer ).

Sahte örnekler / makaleler soruyorum, ancak geliştirme için ne kullandığımı bilmeniz gerekiyorsa: SDL & C / C ++.


1
Üçüncü bağlantınızı buradaki yorumlara ekleyin ve sorunuza ekleyebilirim.
MichaelHouse

İşte kamera ölü bölgesi ile kastettiğim: youtube.com/watch?v=89TRXUm8jMI
bluekirai


Merhaba @Arthur Wulf White, özenle mi ilgileniyorsun? Teşekkürler.
bluekirai

Bahsettiğiniz kamera, genel 2d kameranın yalnızca görünümü dengelemek için kullanılan belirli bir sürümüdür (döndürme ve yakınlaştırma yok). İzleme davranışı, oyuncu karakteri ile kamera arasındaki mesafeyi kontrol ederek, mesafe çok büyükse kamerayı hareket ettirerek uygulanabilir.
wolfdawn

Yanıtlar:


20

Her nesnenin ekran yerine dünyaya göre konumlandırılması gerekir. Kameranızın kendi dünya koordinatlarına sahip olması gerekir, böylece dünyada göreceli bir konumda çizilebilir. Kameranızın bir nesneyi takip etmesini sağlamak da uygun olabilir, bu nedenle nesne nerede olursa olsun, kamera sadece koordinatlarını kullanır. Genellikle kameranın koordinatları sol üst köşeden konumlandırılır. Bu, kameranın resimde yaklaşık (0,24) dünya pozisyonuna sahip olacağı anlamına gelir .

Kameranın gerçekten görebildiği nesneleri çizmeye gelince, tüm nesneleri kameranın dünya koordinatlarına göre çizmelisiniz. Bir nesnenin kameraya göre ekran konumunu hesaplamak için şunları yapmanız yeterlidir:

int screenX, screenY; //screen position of the object being drawn

screenX = object.x-camera.x;
screenY = object.y-camera.y;

Açıkçası bazı nesneler aslında kamera tarafından görülemez, bu nedenle bir görünüm kaldırma sistemi uygulamak isteyebilirsiniz.


2

Tüm bunları GPU'da , nesneleri CPU'ya çizdiğiniz yeri değiştirerek değil , Dünya ve Görünüm matrislerini kullanarak yapmak en iyisidir .

Bu şekilde, kamerayı keyfi olarak değiştirebilirsiniz (hatta yakınlaştırıp uzaklaştırabilirsiniz!) Ve sadece sihirli bir şekilde çalışacaktır. Çekme süresinden tasarruf etmek için yine de culling'i görüntüleyebilirsiniz. Ve dünyayı çizme kodunuzun hiçbiri, görünümü ve dünya matrislerini doğru bir şekilde ayarladıktan sonra değişmek zorunda kalmayacak.

SDL'de, büyük olasılıkla glOrthove gibi OpenGL çağrılarını satır içi yapabilirsiniz glTranslate.

Bu konuya bakın .


Birisi düşüşü açıklayabilir mi? Bu mantıklı.
Merhaba Dünya

1
Ben aşağı oy vermedim, ama bence bu soruya cevap bile vermiyor. Soru, bir GPU'ya karşı CPU'da daha verimli mi yoksa daha kolay mı olduğu değil, bir şeyin nasıl hesaplanacağıyla ilgilidir. OP bile sahte örnekler aradığını söyledi. Hiç şüphe yok ki kamera / dünya / model matrislerinin bir kombinasyonunu kullanmak daha verimli olacaktır, bu yüzden mklingen'in en azından bir noktası vardır.
Dan Watkins

Bu cevap hiç de fena değil! OpenGL / DX geliştirmeye daha özgüdür, ancak kamera konumlarına dayanan bir çeviri matrisini hesaplayabildiğiniz ve gerçek konumlarını değiştirmeden nesneleri cam matrisiyle taşıyabileceğiniz için doğru yaklaşımdır.
nenchev
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.