Sorunsuz döngü halindeki bir 2D çok oyunculu seviye mi oluşturuyorsunuz?


15

Son zamanlarda, döngü düzeyinde bir tasarıma sahip olabilen bir 2D yan kaydırma çok oyunculu oyunun nasıl oluşturulacağı hakkında bir tartışma çıktı (Think of Starbound ve dünyalarının nasıl bir döngü içinde olduğunu).

En basit yolun, oyuncuları bir taraftan diğerine ışınlayabilen tetik bölgeleri olan dikdörtgen bir haritaya sahip olmak olduğunu düşündüm. Bununla birlikte, bu yaklaşımla ilgili en belirgin sorun, haritanın kenarında birden fazla oyuncunun aynı anda olması durumudur. Oyuncuları sadece birbirlerinin önüne ışınlamak istemiyorsunuz ve diğer oyuncuların ortadan kaybolmasına gerek kalmadan oyuncuları taşımak için bir yola ihtiyacınız olacak.

Bu fikri eklemek ve sorunu çözmek için aşağıdakileri buldum: oyuncuların bir "klon bölgesi" (yeşil kare) görebileceği bir tetikleme bölgesi (görüntüdeki kırmızı kare) var. Bu yeşil karede, tetikleme bölgesinin karşı tarafındaki nesneler karşılık gelen klon bölgesine kopyalanacaktır (A ve B şekilleri ile görülebilir). Bir oyuncu "klon bölgesinin" başlangıç ​​kenarına geldiğinde haritanın diğer tarafına ışınlanır.

görüntü

Bu örnekte Oyuncu 2 Oyuncu 1'i gördüklerini düşünür, ancak aslında klonunu görürler ve tam tersi de geçerlidir.

Bu, eldeki sorun için biraz aşırı ve karmaşık görünüyordu. Şimdi sorum, bu çözümün sorunu çözmek için iyi bir yaklaşım olup olmadığını bilmek mi, yoksa bu sorunu çözmenin daha basit bir yolu var mı?


Oyuncuların bir önceki alana geri gitmesine izin veriliyor mu?
XiaoChuan Yu

evet, ileri geri, bu bir tür "dünyayı dolaşmak" etkisi verir. Starbound'daki bir dünyaya benzer
KenQueso

2
Sadece dünyayı büyük bir daire yapmayı düşündünüz mü? veya seviyeyi büyük bir daire olarak ele alıp düz bir 2D aşamaya çevirmek mi?
Nzall

kamera konumunu her zaman kontrol edilen oynatıcıyla hizalayamıyor musunuz?
Ali1S232

Yanıtlar:


16

Tüm bu tetikleyicilere sahip bu sistem biraz fazla karmaşık ve hataya açık geliyor.

Modulo kullanarak oynatıcının konumunu aşağıdaki gibi bir şeyle sarabilirsiniz playerPositionX = playerPositionX % mapWidth

Sizin oyuncu ulaşır Bu şekilde 0'a geri sıfırlar.playerPosition == mapWidthplayerPosition

Bu çözüm, tüm oluşturma sistemi ile genişletilebilir.


1
pozisyonu ışınlanmayı sıfırlayan oyuncuları gören oyuncuların bu yakınlığı sorunu olmaz mı?
KenQueso

Bunu oluşturma sistemine nasıl genişletirsiniz?
Mikael Högström

Her zaman kameranın merkezinde bir oyuncu olabilir ve haritanın etrafını sarabilirsiniz. Dünya modunda medeniyette bir harita gibi. Diğer bir yaklaşım, bir oyuncunun görünür kısmını haritanın her iki tarafına da oluşturmak olabilir.
Exaila

4
@ MikaelHögström Her zamanki gibi render yapın, ancak sağ kenara yakın olan şeylerin soldan ikinci kez (yani at pos - map_width) yapılması gerekir.
Mario

1
Kodunuzda 'bu koordinatta hangi nesne var' veya 'bu nesnenin koordinatları nedir' aradığınız herhangi bir yerde, onu xcoord% mapWidth yaparsınız. Kodunuz olmadan söylemek zor, ancak bu muhtemelen doğru bir şekilde görüntülenmesini sağlayacaktır.
Tin Man

13

Standart çözüm portalları kullanmaktır . Örneğinizde, sol ve sağ uçları bağlayan bir portal hariç, yalnızca bir seviye vardır.

Bu portalda hareket eden herhangi bir şeyin koordinatları portalın diğer ucuna çevrilir, böylece bir şey portalda sola hareket ederse, seviyenin sağ tarafında yeniden görünür ve tersi de geçerlidir.

Kameranızın portalları da desteklemesi gerekir; portal kameranın içindeyse, seviyenin bazı bölümlerini portalın her iki tarafında oluşturmalıdır. Sorunsuz döşeme grafikleri için görüntü editörlerine aşina iseniz, burada da aynı şey geçerlidir.

Sıkıcı kısım mesafesi veya pathing ile uğraşan her şeyin olacaktır da destek portalları gerekir. Buna AI, görüş hattı algos, ses zayıflaması vb. Dahildir.

Portallar ile ilgili güzel bir şey, çok güçlü olmasıdır. Yapı motoru, "gerçek" bir 3d motor olmamasına rağmen, çok katlı seviyeleri simüle etmek için kullandı. Bazı modern motorlar Öklit dışı alanlar yaratmak için portalları da kullanır; Portal ve Antichamber, 3D'de dikkate değer örneklerdir.


2
Portal oyununun yorumunu dinlerseniz, portalların çalışma şeklinin bir kısmı delikten görünenleri klonlayarak uygulanır. (ancak render yapmak yerine fizik nedenleriyle)
Mooing Duck

6

Ekranda görüntülediklerinizin ve hafızadakilerin tamamen farklı iki şey olduğunu unutmayın. Dünya hakkındaki verilerle doldurmanız gereken bir pencereniz olduğunu düşünün. Pencereyi soldan sağa dolduruyorsunuz. Dünyayı doldurmak için verilerinizi ayrıştırırken, dünyanın sonuna ulaşırsanız, verilerinizin başına geri dönün. Bir modulo işlemi kullanmak idealdir. Bunu her şey için yapmanız gerektiğini unutmayın . Mermiler, ışınlar, oyuncular, fizik; dünya sınırlarını geçerken hepsinin pozisyonlarının sarılması gerekir.

Her oyuncu veri paylaşır, ancak kendi veri perspektifine sahiptir. Pencereleri dünyanın neresinde durduklarına bağlı olarak farklı şekilde doldurulur.

Bu, klon oluşturmaya veya kimseye ışınlanmaya gerek olmadığı anlamına gelir. Esasen sen edilir sadece birbirinizin ekranlarına karakterleri hale getirerek, klonlar yaratarak.


3

Oluşturmanın dünyayla olan bağlantısını kesin ve klonlama veya ışınlanma yapaylıklarına başvurmadan sarma ve doğru oluşturma yapabilirsiniz.

Öncelikle, dünyada sizden, sabit bir boyut dünyaya sahip 0üzere Width. Bir nesne 0'ın altına düştüğünde onu sonuna kadar sararsınız ve bir nesne her bittiğinde Widthonu başlangıca sarar. Bu, dünyanızdaki tüm mantıksal nesnelerin daima aralık dahilinde olduğu anlamına gelir 0...Width.

İkincisi, render için pozisyonda modulo yapacaksınız. Yani ekranın sol tarafı "Base" ve sağ tarafı "Base + Size". Böylece dünyanızda bu aralıktaki herhangi bir şeyi ararsınız. Aslında onu tekrar eşleyen modulo aralığını arayacaksınız 0...Width.

Arama sırasında hüner, nesnenin konumunu Basesol tarafa göre döndürmektir . Bu, ekranın yerel koordinatlarına dönüştürülür, böylece oluşturucunun kendisi modulo hakkında endişelenmek zorunda kalmaz, sadece arama yapar.

Her oluşturucu yalnızca bir konumdaki nesneyi ele aldığından hiçbir şeyi kopyalamanız gerekmez.

Dünyanız bölümler halinde üretiliyorsa veya 3B yapılar kullanıyorsa, bölümlendirmeniz gerekir. Bu nedenle, tek bir blok değildir, ancak bu oluşturmayı karşılamak için hareket ettirilebilir. En az 2'de çok fazla bloğa ihtiyacınız yok.


1

Tek makul yaklaşım, sarılmış dünyanızı oyun ve kullanıcı için tamamen şeffaf bir alt yapı yapısına uygulamak olacaktır. Bazı Düşük Seviyede, gerçek koordinatlarınızı temel harita kaynağınıza saran mapCoordinate () işlevine sahipsiniz ...

Eğer gerçek Dünya sadece 10 birim genişliğinde ise, oyuncu ve oyun bunu bilemez. Oyuncu için dünya sonsuzdur - ve oyun 15. pozisyonda ne olduğunu sorarsa - altta yatan fonksiyon bu talebi çevirir, modulo10 ve öğeyi 5. pozisyonda paketleyecektir.

Tüm oyun mantığı ve diğer her şey için, tıpkı her şeyin kopyalarının olduğu sonsuz büyük bir dünyaya sahip olmanız gibidir.


1

Aynı değil, ama bir oyun reçelinde benzer bir şey uyguladım. Oyun, oyuncuların küçük bir dairesel seviyede hareket etmesini sağladı, oyuncu pi 'x' pozisyonuna geldiğinde sarıldı. Oluşturma kolaydı çünkü her şeyi işledik ve sonra olanları izlemek için ofset kamerayı döndürdük. Yukarıda önerildiği gibi benzer bir şey uygulayabilirsiniz:

  • Çizim yaparken, kamera konumunu ve görüş mesafesini dikkate alarak kamera konumunu kontrol edin ve neyin çizilmesi gerektiğini belirleyin.
  • Kameranın haritanın 'kenarını' geçtiği durumlarda, genellikle sadece seviyenin genişliğini konumlarına ekleyerek veya çıkararak, bu kenardan çekmek için dünyanın diğer tarafından uygun miktarda içerik seçin.
  • Oyun mantığının bu dikişten haberdar olması ve diğer cevaplarda belirtildiği gibi ayarlanması gerekir. Dikkat edilmesi gereken özel durumlar, bir nesnenin bir tarafta olduğu ancak diğer taraftaki bir nesneyle çarpıştığı çarpışmalardır.
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.