İzometrik Çarpışma Tespiti


11

İki izometrik karo çarpışmasını tespit etmeye çalışırken bazı sorunlar yaşıyorum.

Döşeme üzerindeki her nokta arasındaki satırları çizmeyi ve sonra (muhtemelen yanlış formülü nedeniyle) işe yaramadı ancak hat kesişimlerini kontrol etmeyi denedim

Bugün bir süredir bunu inceledikten sonra, çok şey düşündüğümü ve daha kolay bir yol olması gerektiğine inanıyorum.

Kod aramıyorum sadece bazı örtüşme tespiti elde etmek için en iyi yolu tavsiye


4
Tam olarak ne yapmaya çalışıyorsun? Farenin bir kutunun üzerinde olup olmadığını mı yoksa iki birimin çakışıp çakışmadığını mı tespit ediyorsunuz? Daha sonra ise, "oyununuzu" "grafik"
John McDonald

Hareketli bir iso-kiremit tarafı hareketli olmayan bir kiremit çarptığında bunu yapmalıyım hareketli kiremit durur. Sorun yaşadığım tek şey çarpışma testi. Bağlı bir kutu kullanabilirdim ama çarpışmanın doğru olması gerekir.
Chris Crew

Yanıtlar:


23

Doğrudan çıkacağım ve soruda tarif ettiğiniz problemi nasıl çözeceğimizi bilmediğimi söyleyeceğim (iso-kiremit şeklindeki dikdörtgenler arasındaki çarpışma tespiti), ancak geçmişte başkalarının bunu nasıl çözdüğünü söyleyebilirim :

Diğer oyunlarda bitti yolu ayırmaktır oyun dünyasını gelen ekran dünyası . Başlarken, bunların aynı şey olduğunu hayal etmek yaygındır, ancak daha sonra tanımladığınız gibi sorunlara yol açar.

Genel fikir, oyun dünyasının tamamen bellekte, sahnelerin arkasında saklandığı, sadece sayılar, referanslar ve mantık olduğu. Oyun dünyasını izometrik olarak çiziyor olmanız önemsizdir. Oyun dünyanız izometrik veya kare kavramına sahip olmamalı veya ekran 3D olarak çiziliyor olsa bile. Tüm bunlar oyun dünyasını ekrana ( ekran dünyası olarak da bilinir ) çektiğinizde halledilir . Oyun dünyası, oyun için mantıklı olan en basit şekilde saklanmalı ve korunmalıdır, izometrik oyunlarda, genellikle iso olduğu gerçeğini tamamen görmezden gelir ve bunun yerine pozisyonları eksene hizalanmış bir ızgara kullanıyormuş gibi saklarsınız. En çok oyun iki dünya arasında koordinatları dönüştürmek için yöntemler olacak, benim çağırır ScreenToWorld(x, y)veWorldToScreen(x, y). Dönüşüm genellikle Matrix matematiği ile yapılır, ancak başka yollarla da elde edilebilir. Fareyi kullanırken ScreenToWorld'ü ve çizim yaparken WorldToScreen'i kullanacaksınız.

Oyun dünyasını ve ekran dünyasını bölmenin birçok avantajı vardır . Avantajlardan biri, çarpışma algılama ve hareketin oyun dünyasında gerçekleşmesidir ve bu nedenle eğimli bir ızgara veya çarpık koordinatlar veya ekranın nerede olduğu vb. , eksene hizalanmış dikdörtgenler ve karelerle ilgileniyor olacaksınız. Oyun dünyası güncellendikten sonra, oyun dünyasının bir temsilini ekrana, anahtar kelime: gösterim olarak çizersiniz. İlk başta karşı sezgisel görünebilir, ancak ekranınız sadece oyun dünyasında neler olduğunun bir temsilidir. Bu, özel sunucular ve terminal benzeri istemciler gibi şeyleri mümkün kılar.

FreeCiv aslında tüm bunların harika bir örneğidir. Aşağıdakilerden herhangi biriyle aynı dünyayı görebilirsiniz: bir kare Kuzey / Güney Izgara, İzometrik ve hatta Hex. Çalıştırdığınız her oyun, tek oyunculu oyunlar için bile arka planda çalışan özel bir sunucuya sahiptir, bu nedenle istemci aynı zamanda sadece bir ekran bağlantı noktasıdır, başka bir şey değildir.

Uzun lafın kısası: Oyun dünyasını ve mantığı ekran dünyasından ayırmak oyun mantığını basitleştirir, oyunu <-> ekran bağlantılarını azaltır ve buna karşılık "iso" fayansları arasındaki çarpışma tespitini işlemeyi kolaylaştırır ve görselleştirmeyi kolaylaştırır.


İyi anlatılan cevap için teşekkürler ne çizilmiş mantık ve arka planda neler olduğunu ayırmak oldu ama ben her şeyi eğimli bir ızgara gibi davranıyordu.
Chris Crew

1
Geleceğin insanları için; grafikler verilerin yorumlanmasıdır. Bir oyunun dört ana parçası: mantık, veri, giriş, çıkış. Onları bir araya toplamaktan kaçının. Ayrıca, mükemmel yanıt John, +1
Aarowaim

9

John'un cevabı oldukça doğru, ama bunu farklı bir şekilde açıklamaya çalışacağım:

İzometrik çarpışma tespiti yoktur.

Çarpışma tespiti projeksiyon matrisinizin / dönüşümünüzün neye benzediğini umursamıyor. Bir şeyleri hiç render ederseniz çarpışma tespiti önemli değil (sonuçta, ekran dışındaki nesneler yine de çarpışabilir, değil mi?)

Bu daha felsefi bir sorudur: Ormanda düşen bir ağaç, orada kimse olmadığında hala yerle çarpışıyor mu?

Geleneksel bilgelik şöyle der: Evet. Nasıl baktığınız önemli değil. Olaylar görüş alanında değil, dünya uzayında çarpışır.


2
+1 Peki. "İzometrik çarpışma tespiti yok"
John McDonald

1
Teşekkürler, az önce söylediklerini söyledim. Ama biraz farklı.
MarkR

0

Her bir pikselin her bir getRGB () değerinin bitmap'ini oluşturan bir piksel dizisi ayırmayı deneyebilirsiniz. Karo kenarlıkları olarak değerleri bir if ifadesiyle karşılaştırmak, karonun temsil ettiği değerden (su, kum, çim) ayrı bir renk değeridir. Bu temel bir izometrik ızgara için. Veya haritanın kendisinin iki katmanına sahip olabilirsiniz. Bir çarpışan nesnenin her bir temsilcisinin taslağını çizen yeşil ekran gibi bir katman ve diğer katman haritanın kendisi olacaktır.

Harita katmanının her pikseli için bir bitmap dizisi oluşturmuyorsunuz, bunun yerine, bir nesne, korunan renk değerinin kenarlığını çarpıştığında / kenarıyla kesiştiğinde sahip olduğu efektleri temsil eden bir renk kümesi hesaplamak istiyorsunuz. Değerlerin, değerin azalmasını veya nesnenin hareket ettiği hızın artmasını istersiniz. Hareket eden her nesne, farklı bir yerde saklanan belleğin sadece bir kopyasıdır.

Piksel mükemmel çarpışmasına ve bitmap dizilerinin anlaşılmasına bakardım. Her dikdörtgen, bir nesnenin bir konumda veya vektörde nerede oluşturulduğuna bağlı olarak her olay tetiklenen belleğe benzer çoğaltılmış veri türlerini içeren bir sınırdır. Ekrandaki her nokta, nesnenin kendisini 3D olarak temsil ettiği yanılsaması yaratan gölgenin derinliğinin 2B düzlemde olmasıdır. Eğriltmedeki şekillerin dönüşümü, nesnenin bir açıda olduğunu hissetmesini sağlar. Kameranın görüntüyü sunduğu bir merkez noktası vardır, her şeyin bu merkez noktasından uzaklaştıkça boyut küçülüyor ya da boyutuna yaklaştıkça yaklaşıyor.

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.