Fayans nedir? Oyunlarda döşemeli grafikler. Taslaklarda kendi Tilemap motoru Korumalı alandan


(kiremit - kiremit) aslında bir yaratma yöntemidir büyük resimler (görüntüler) daha küçük elemanların kullanılması.

Genel olarak güzel bir şey var ve yine değil Rusça kelime - mozaik. Ne olduğunu hatırla. Bu, büyük bir resmi parça parça bir araya getirdiğiniz zamandır ve bu taytla hemen hemen aynı şeydir. Veya parayı nasıl kestiklerini ve fayans döşediklerini hatırlayın.

// Blog konularını burada karıştırmak kötü bir fikir...


Hangi çatı? Kiremit. Harika bir özellik: Bir ismi sıfata dönüştürebilirsiniz, ancak o zaman normal şekilde tercüme edilemez, ancak anlaşılması kolaydır.
Konumuza dönelim, oyunlardaki döşemeli grafikler nedir?

Bu döşemelerden oluşan bir grafiktir (Kapak). Örnek:


Bazen çok güzel oluyor


Bu sandalyeler ve masalar da fayanstır. Fayanslar duvarlar, zeminler ve diğer unsurlardır. Buradaki kapılar büyük olasılıkla fayans değil, nesnelerdir, çünkü onlarla etkileşim mümkündür.

Ayrıca, döşeme grafikleri prensipte bir şekilde piksel sanatını andırıyor, tıpkı bir mozaik gibi, bir resim de piksel piksel çiziliyor. Eleman eleman.


Daha fazla piksel sanatı burada


Ama bu resimde (bu kesinlikle bir oyun değil), grafikler döşenmez. Burada her şey ayrı ayrı çiziliyor. Döşenmiş grafiklerle ilgili ilk soruna burada geliyoruz - bazen çok monoton görünüyor.


Game maker stüdyosundaki standart kutucuk örneği


StarCraft harita düzenleyicisini bile hatırlayın:


Sonra onun hakkında yazdığım makalemi okuyun. İlk yaşlı adamda tüm bunlar oldukça merak uyandırıcı bir şekilde yapıldı ve orada, aynı türde olsa bile neredeyse her elementin rastgele üretilmesi nedeniyle monotonluğun kısmen üstesinden gelindi. Neden bahsediyorum?

Aynı ekranı alıp büyütüyoruz.


Döşemeler tekrarlanmıyor


Peki bu benim en sevdiğim ilk StarCraft ne zamandı?

Ne zaman olacağını Tanrı bilir ve onlar bu şeyi zaten bulmuşlardır. Ve şimdi bazı oyun yapımcıları aynı türdeki karoları sıralara yerleştirmeye devam ediyor.

Oyunlarda grafik konusu çok önemlidir çünkü nihai bütçeyi ve geliştirme süresini büyük ölçüde belirler.

Harita editörü gibi araçlar geliştiriyorsunuz ve sonra onu oraya koyuyorsunuz, onlar zaten her şeyi güzelce ve akıllıca ayarlıyorlar. Ne kadar çok alete sahip olurlarsa o kadar güzel olur ama bu çok iş gerektirir.

Tüm bunları sadece çizmek değil, aynı zamanda düzenlemek ve eğer yapılacaksa, öğeleri rastgele hale getirmenin bir yolunu bulmak.

Oyunun sonunda daha güzel olmasını istiyorsanız, bir ağaç için aynı anda birden fazla sprite çizmeniz gerekiyor. Ve hayır, Noel ağacı ve meşe farklı fayans ve sparitlerdir, ayrı olacaktır. Aynı anda çok sayıda Noel ağacına ve çok sayıda meşe ağacına ihtiyacınız var.

Fayanslar genellikle fayans matrisi adı verilen bir paket (set) halinde yapılır. Bu, daha küçük parçalara bölünmüş büyük bir parçadır. Bunun gibi bir şey:



Ve şimdi bu setten belirli fayanslar çıkarıldı. Bu sadece yeşil bir kare olabilir; çimen, ağaç ya da herhangi bir şey.

Buradaki her şey oldukça basit ve aynı zamanda güzel. Kar teması. Hazır bir fayans setine sahip olduğunuz için işin yarısını zaten yaptınız, sadece onları güzelce düzenlemeniz gerekiyor.

Döşemeler nesnelerden daha hafiftir, oyun hızı açısından daha iyidirler, nesneler yerine bunları kullanırsanız size daha yüksek FPS ve performans sağlarlar. Sprite içeren nesnelere yalnızca onlarla etkileşiminiz varsa ihtiyacınız olur. Diyelim ki bir alev makinesi bir ormanı yakarsa, o zaman evet, büyük olasılıkla nesnenin içinden ağaçlar yapmak zorunda kalacaksınız.

Ama neredeyse hepsi dekoratif (tamamen görsel) elemanlar fayanslardan yapılabilir.

  • Ayrıca okuyun:
Diyelim ki bunlar aynı sütunlar. Peki neden kahramanla sütunlar arasında herhangi bir etkileşime ihtiyacınız var? Sadece çarpışmaya ihtiyacın var (Bunun üstesinden gelemediğinizde).

Ve çarpışma için, katı, görünmez bir alanı bir nesne haline getirebilir ve ardından onu sütunun altına taşıyabilirsiniz. Daha sonra sütunun içinden (canlı grafik - döşeme) geçmek imkansız olacak, hareket “sağlam” bir alan tarafından engellenecek.

Şu anda hakkında bir video hazırladığım içinde, döşemelerle çalışmak için yeni işlevler ortaya çıktı, hareketli döşemeler ortaya çıktı. Ayrıca bunları kod aracılığıyla arayabilir (ve kaldırabilirsiniz). Çok ilginç bir şey. Ayrıca, artık döşemeleri toplu olarak yerleştirebilir ve harita odasını hızla döşemelerle doldurabilirsiniz.

Özellikle küçük fayanslar için oldukça kullanışlıdır.


Game Maker'da oyun oluşturmak isteyen yeni başlayanlar için prensipte döşeme kullanmaya gerek yoktur; yeni başlayanlar genellikle hepsini yapar. (tarla, ağaçlar vb.) sprite içeren sıradan nesneler ve basit oyunlar sorun olmayabilir.

Ancak bir RPG yapmaya karar verdiğinizde (veya başka türdeki bir oyun) grafik olmadığı için döşemelere ihtiyacınız olacak. Umarım karo nedir sorusunu yanıtlamışımdır ve oyunlarda karo grafiklerinin kabul edilebilir örneklerini vermişimdir.

Ve eğer ilgileniyorsanız spesifik örnekler ve GameMaker Studio 2'de her şeyin nasıl çalıştığını görebilirsiniz. video (9 dakika). Benimkine abone ol Econ Dude kanalı - sıfırdan oyun oluşturma hakkında Henüz abone olmadıysanız.

Çini nedir
Muhtemelen fayansın ne olduğuna dair bir fikriniz vardır, ancak gelin ona daha yakından bakalım. Döşeme sabit boyutlu bir resme benziyor. Üstelik diğer fayanslarla karşılaştırıldığında göze çarpan "dikişleri" olmayan tek bir görüntü elde edilecek şekilde çizilir. Fayansları düşünmenin en kolay yolu, duvarları veya yerleri kaplamak için kullanılan fayanslardır. En basit döşeme, dikey ve yatay olarak simetrik olan kare bir görüntüdür (bunu resimde görebilirsiniz). Bu resimleri bir araya getirirseniz, büyük tuvalçim. Ve eğer buna eklersen pitoresk bir resim bir değişiklik için, örneğin bir yolu gösteren bir tür döşeme daha varsa, o zaman zaten ilkel bir harita yapabilirsiniz.
Şimdi 512x512 hücrelik bir harita oluşturmak için yapmamız gereken maliyetleri hesaplayalım. Döşemenin kendisinin 32x32 piksel boyutunda olacağını, ardından bellekte 1024 bayt - 1 kilobayt kaplayacağını varsayalım. Hesaplamalardan sonra, en basit haritanın bellekte yaklaşık 262 kilobayt ve ayrıca döşemelerin kendi görüntülerini depolamak için bellek kapladığı ortaya çıktı. Ancak aynı büyüklükte bir alanı manuel olarak çizseydik, teknik ilerleme sunağına 268 megabayt (!) koymak zorunda kalırdık. Ve bu, basitlik için 256 renk modunu seçmeme rağmen. Şu anda bile her bilgisayarın bu kadar belleğe sahip olmadığı açıktır, bu nedenle haritaların karo yapısı iki boyutlu oyunların büyük çoğunluğunda ve yeterli sayıda üç boyutlu oyunlarda kullanılmaktadır.
Dikdörtgen ve kare döşemeler kuş bakışı görünümü temsil etmek için iyidir ancak izometri adı verilen başka bir projeksiyon türü de vardır. Hacim, derinlik hissi vermek gerektiğinde kullanılır. sözde 3D. Bu nedenle izometrik sistemlere bazen 2,5D adı verilir. Buradaki amaç nedir? Artık döşeme izleyiciye doğru bir açıyla döndürülmüş ve sanki daha derine gidiyormuş gibi görünecek (resme bakın). Doğası gereği iki boyutlu bir resim üçüncü bir boyut kazanır. Bu durumda karenin (fayans) boyutları şu şekilde belirlenir:
1. Uzunluk - görüntünün en sol noktasından en sağ noktasına kadar.
2. Genişlik - izleyiciye "en uzak" noktadan "en yakın" noktaya kadar.
3. Yükseklik - döşemenin “kalınlığı”.
Hacim efekti yaratmak için genişlik, uzunluğun yaklaşık yarısı kadar olmalıdır. Bu ilişkiyi deneyerek, istenen projeksiyonu seçerek "karoyu" üç boyutlu uzayda döndürüyormuşsunuz gibi görünüyor. Bu amaçlar için bir tür 3D stüdyo analogunun kullanılması faydalıdır. Orada bir döşeme oluşturun, konumunu seçin ve ardından kenarları ve elde edilen oranları ölçün.
Ama şimdi nasıl çizebilirim?
ekranda böyle bir döşeme var mı? Sonuçta, normal çizim işlevleri, görüntülenecek dikdörtgen bir alan verilmesine alışkındır ve bunu çok iyi yaparlar. Bu sorun maskeler yardımıyla çözülür. Resimde karonun konturlarının beyaz alana düştüğünü, dışarıda kalanın ise siyaha boyanarak bir dikdörtgen oluşturduğunu göreceksiniz. Bu, bir şablon prensibiyle sonuçlanır: görüntü, maskenin ve "tuvalin" üzerine ve yalnızca çerçevenin içine giren noktalara bindirilir. beyaz. Eşit standart Windows çizim işlevleri, DirectX işlevlerinden bahsetmeye bile gerek yok, bu tür şeyleri yapmak için eğitilmiştir. Aynı zamanda maske kullanımı başka efektler yaratmanıza da olanak tanır. Örneğin, yüksekliğini göz ardı ederek döşemenin yalnızca başını çizebilirsiniz. Veya tek bir resim kullanarak çimlerin farklı bölümlerini oluşturun. Tamamen deliklerden oluşan bir maske oluşturup bunu farklı türde mevcut bir karo yerine çim karoyu sergilemek için kullanırsak, bir yüzeyden diğerine yumuşak bir geçiş elde ederiz. Benzer bir teknik birçok durumda kullanılabilir ve "delikli" maskeler rastgele oluşturulabilir. O zaman hiç kimse manzaranızın önceden oluşturulmadığını tahmin etmeyecektir. Sonuç, bir tür çoklu dokulandırmadır: karşılıklı olarak şeffaf iki görüntü bir alana yerleştirildiğinde. Doğru, bu oldukça fazla bilgisayar zamanı alıyor.
En basit durumda döşeme yüksekliği sıfırdır ve hesaplanmaz. Ancak, yalnızca bu tür "tuğlaları" kullanırsak, o zaman yaratılmasını başaracağız. en iyi senaryo hoş bir temizlik. Farklı yükseklikler kullanarak duvarlar ve tepelerle daha gerçekçi bir manzara elde edeceğiz. Elbette bu tür "yapı taşlarını" ekranda görüntülemek daha zor olacaktır. Artık bir döşemenin taban çizgisi kavramına aşina olmalıyız.
Temel- burası karonun “zemin” ile temas ettiği yerdir. Resimde vurgulanmışlardır pembe. Taban çizgisi dikey çizginin herhangi bir yerine yerleştirilebilir çünkü aynı görüntü farklı boyutlardaki duvarlar için kullanılabilir. Daha sonra döşeme yerleştirme haritasında taban çizgileri görüntülenir ve döşemelerin kendisi daha yüksek bir konumdan çizilmeye başlar.

2Dfx

Birkaç döşeme katmanını kullanarak hangi efektlerin yaratılabileceğine zaten baktık. Gerçek oyunlarda
Haritanın tamamı meşhur pasta gibi çok katmanlı: ilk katman- bu toprak, taş, çamur, su ve benzerleridir; ikinci katman- ağaçlar, kayalar, masalar ve sandalyeler gibi herhangi bir çevre; üçüncü katman- nesneler: insanlar, canavarlar, anahtarlar ve sihirli iksirler.
Yukarıdaki efektler için daha fazla katman ekleyebilirsiniz ancak en iyi performans için genellikle dört ila beş katman kullanılır. Örneğin, karakterlerin baş hizasının üzerinde olacak nesneler (örneğin evlerin çatıları) oluşturmak için şemamıza dördüncü bir katman eklenebilir. Hepiniz bu etkiyle karşılaşmışsınızdır: Kahraman bir binaya yaklaştığında çatısı aniden kaybolur ve binanın içini görebilirsiniz. Dolayısıyla, kullanıcının altında saklı olan her şeyi görebilmesi için döşeme motorunu dördüncü katmanı çizmeyi durdurmaya zorlamak çok kolaydır.
Grafiklerini palet prensibine dayandıran döşeme motorları, renk döndürme efektini aktif olarak kullanır. Suyu işlemek için belirli bir mavi gama kullanılsın. Daha sonra bu gammayı değiştirerek veya tersine karodaki endeksleri yeniden düzenleyerek akan su efektini elde edebilirsiniz. Aynı numara diğer yüzeyler için de geçerlidir. Diyelim ki bir mağarada kayayı temsil eden fayanslar var.
daha koyu yapılabilir. Ve eğer bir karakterin eline bir meşale verirseniz ve onun konumuna bağlı olarak çevreyi aydınlatırsanız, etkisi çok güzel olacaktır. Gece ve gündüzün dinamik değişiminden bahsetmiyorum bile. Palet yönetimi çok ilginç soru ayrıca çok iyi tasarlanmış ve Hiç kimsenin paletsiz yapamadığı toplam 256 çiçeklenme döneminde çalışıldı. Şimdi bile, 16 bitin altındaki renklerin uygunsuz olduğu düşünüldüğünde, spriteları depolamak için aynı paletleri temel alan kendi formatları kullanılıyor.
Bu arada, döşemeleri görüntülemek için sıradan DirectDraw prosedürlerini kullanmanız gerektiğini kim söyledi? Tabii ki, için uzun zamandır Varoluş nedeniyle birçok efekt için algoritmalar geliştirildi: dinamik aydınlatma ve hatta parçacık sistemleri. Ama hepsi çok yavaş çalışıyor. Ancak bu 1996 değil ve Voodoo Graphics nadirdir çünkü herkes onu zaten atmıştır. Bu nedenle, günlük ihtiyaçlar için bir 3D hızlandırıcının yeteneklerinden yararlanmak çok cazip olacaktır.
3B kitaplıklar, 2B prosedürlerdeki en yavaş nokta olan dokulu çokgenlerin (aynı döşemeler) çıktısının alınmasına yardımcı olabilir. Bu durumda filtreleme (diğer bir deyişle dokuların sanatsal olarak bulanıklaştırılması) apaçık bir gerçektir. Ayrıca yalnızca 3D oyunlarda mevcut olan tüm efektler kullanılabilir hale gelir: ışık, şeffaflık, gölgeler, ışık geçişleri vb. Bu konu üzerinde pratik yapılabilecek kadar ilgi çekicidir. Bu, karo tabanlı oyunların geleceği olabilir.

Harita oluşturma
Herhangi bir harita, döşemelerin katmanlarındaki konumunu ve parametrelerini belirten bir dizidir. En çok basit harita her öğenin koşullu olarak kabul edilen bir dizideki döşeme sayısını içerdiği bir MxN matrisidir. Daha önce bir 2D strateji veya RPG harita düzenleyicisi kullandıysanız (veya Photoshop'ta çalıştıysanız), bu fikri kolayca anlayacaksınız. Ne zaman yeni katmanlar eklenir, matris daha karmaşık hale gelir, sonuç bir matris kümesidir (yapısıdır) ve herhangi bir efektin eklenmesiyle, diskte bir megabayttan fazla yer kaplayan kendi harita formatınızı elde edersiniz.
Fayanslara sıralı numaralar verilmesine gerek yoktur. Tam tersine tüm sayı serinizi birkaç aralığa bölerek başlamak iyi olur. Örneğin, 0'dan 63'e kadar olan aralık, üzerinde yürüyebileceğiniz sıradan döşemeleri (zemin, döşemeler) içerir. 63'ten 127'ye kadar - aşılmaz orman çalılıkları, duvarlar ve diğer katı nesneler. Bir sonraki aralık göllerin ve bataklıkların suları ve son olarak kahraman üzerlerine "adım attığında" herhangi bir eylemi gerçekleştiren özel gruplardır: portallar, tuzaklar vb. Artık Photoshop grafikler üretirken, yeni gelenlere sayıları temel alarak numaralar veriyorsunuz. kabul edilen kurallar ve gelecekte bir alanın geçilebilirliğini veya kahraman portala girdiğinde nasıl tepki vereceğinizi belirlemeyle ilgili birçok sorundan kurtulacaksınız.
Bir harita çizerken, ilk başta izometrik karoları çizmede sorun yaşayabilirsiniz, çünkü bunlar o kadar "kavisli" ki, birini nereye çizip ikinciye devam edeceğiniz belli değil. Harita bölümlerinin ekran tarafından düzgün kaydırılması veya kırpılması programlanırken zorluklar ortaya çıkabilir. Bu arada, karo boyutlarını ikinin bazı kuvvetlerinde (16x16 veya 32x32) yapmak en iyisidir, bu, hesaplamalar sırasında hem size hem de işlemciye büyük ölçüde yardımcı olur.

Aynı durum kartın boyutu için de geçerlidir. Mümkün olduğu kadar kare olmalı ve boyutları “tuğla” bileşeninin boyutuna bölünmelidir. Bu sayede hesaplama yaparken hiçbir zaman üzerinde çalışılması mümkün olmayan kesirli değerlere sahip olmayacaksınız. Bu nedenle çoğu kart 128x128 veya 512x512 gibi boyutlara sahiptir.
Bu arada, karakterleri izometrik bir harita etrafında hareket ettirmenin de bir nedeni var. Sonuçta haritamız "derinlemesine" döndürülür ve mutlak dikey boyutu yataydan iki kat daha küçüktür. Bu nedenle yürüyen herhangi bir nesnenin buna göre “yukarı” hareket etmesi gerekir. Genel olarak burada formüllerin uygulanması gerekir, ancak en basit durumda yan tarafa iki adım için bir adım derinlik vardır. Kesin hesaplamalarla ilgileniyorsanız, aşırı durumlarda bunları internette bulmak kolay olacaktır; tavsiye isteyin. Aynı şey, tamamen düz bir arayışta bile izometride gerçekleşen herhangi bir hareket için de geçerlidir.
Neyse ki, tüm bu sorular uzun süredir az çalışılan teknolojiler olarak sınıflandırılmaktan vazgeçti ve internette izometrik 2D motorların programlanmasıyla ilgili çok sayıda ders kitabı var. gibi sitelerin makaleler bölümüne bakmanızı tavsiye ederim. www.gamedev.net Ve www.flipcode.com veya Yahoo benzeri bir arama motorunu uygun anahtar kelimelerle besleyin.

İzometriX

"Programlarla uğraşmayı" sevenler için, kompaktın üzerine özel olarak adında bir motor koyduk. İzometriX. Yukarıda söylenen her şeyi biriktirir. Geçmişte "Samopale"de incelenen çoğu 3D motor ve oyun tasarımcısının aksine, bu motor oyununuzun temeli olmayı amaçlamıyor. Öncelikle her türlü teorik sorunun nasıl çözüldüğünü pratikte görmeniz amaçlanmaktadır. Motor tamamen yazılmıştır. Görsel C++, kaynak koduna ve kendi seviye düzenleyicisine sahiptir. eğer sen
Programlamayla ilgilenmiyorsanız, hiçbir şey derlemeden test seviyesinde dolaşabilirsiniz.
İşlevler açısından IsometriX mütevazının da ötesinde görünebilir: 8 bit renkte 640x480 elbette durum böyle değil. Ancak dediğim gibi bu daha çok haritalarla çalışmayı, karakterleri hareket ettirmeyi, çarpışmaları kontrol etmeyi ve çok daha fazlasını yapmayı öğrenebileceğiniz bir örnek. Ayrıca Windows 9x/2000'de her şey yolunda çalışıyor ve büyük olasılıkla XP'de de çalışacak.

Bir ayrılık sözü olarak


Ne derse desinler iki boyutlu
Kiremit motorları bugün hala en canlı olanlardır. Hiçbir 3D oyun, detay ve çizim güzelliği açısından klasik 2D oyunlarla karşılaştırılamaz. Örneğin Fallout Tactics'i ele alalım; bu oyun belki de 2D alanındaki en ilerici başarıları kullanıyor. Ve hiç kimse bu oyunun grafiklerine kötü demeye cesaret edemez.
Ayrıca fayanslar devasa dünyalar yaratmak için idealdir. Segmentasyonu kullanarak, harita her biri dinamik olarak yüklenen birkaç parçaya bölündüğünde, olağanüstü boyutlarda haritalar oluşturabilirsiniz. Ve bu RPG oyunlarında aktif olarak kullanılıyor. Bu, geliştiricilerin hızlandırıcılar ve çoklu doku oluşturma dünyasına geçmek için acele etmemelerinin bir başka nedenidir.
Ve son olarak, döşemeli grafikleri öğrenmek herhangi bir 3D motordan çok daha kolaydır (gerçi bu benim tercihim olabilir) öznel görüş). DirectDraw'ın spritelarla çalışmasını öğrenmek, Direct3D ve hatta OpenGL'den kıyaslanamayacak kadar daha kolay ve anlaşılır. Bu nedenle doğrudan ön cepheye koşmaya çalışmayın. Belki de eski güzel 2D dünyasına da bakmalısınız. Belki biraz 2.5D...
  • Çeviri

Bu yazıda, basit renkli döşeme kümelerinden karmaşık prosedürel dünyalar oluşturmaya yönelik ve bu döşemelerin yerleştirilmesine ilişkin kısıtlamalara dayalı iki algoritmayı açıklayacağım. Bu döşeme setlerinin dikkatli tasarımıyla, şehirli manzaralar veya karmaşık iç yapılara sahip zindanlar gibi prosedürel olarak oluşturulmuş ilginç içerikleri nasıl yaratabileceğinizi göstereceğim. Aşağıdaki video sistemin oluşturulmasını göstermektedir prosedür dünyası 43 renkli karede kodlanmış kurallara dayanmaktadır.


Aşağıdaki resim, videodaki dünyanın oluşturulduğu temel alınarak bir dizi döşemeyi (döşeme seti) göstermektedir. Dünya, onu gerçek bir ortamda hayal etmenize yardımcı olacak notlarla donatılmıştır.


Döşemeyi, döşemelerin her birinin kendi ızgara hücresinde yer aldığı sonlu bir ızgara olarak tanımlayabiliriz. Doğru dünyayı, komşu fayansların kenarlarındaki renklerin aynı olması gereken bir dünya olarak tanımlıyoruz.
Döşemenin tek bir şeyi vardır demir kural: Döşeme kenarlarının renkleri aynı olmalıdır. Tüm üst düzey yapı bu kurala göre gelişir.

Doğru döşeme şuna benzer:

Bu, suları, kıyıları, çimenleri, binaları olan şehirleri (mavi dikdörtgenler) ve karlı zirveleri olan dağları içeren bir harita sunması gereken bir döşemedir. Siyah çizgiler döşemeler arasındaki sınırları gösterir.

Bunun, dünyaları tanımlamanın ve yaratmanın ilginç bir yolu olduğunu düşünüyorum çünkü prosedürel oluşturma algoritmaları sıklıkla yukarıdan aşağıya bir yaklaşım benimser. Örneğin, L sistemleri bir nesnenin özyinelemeli bir tanımını kullanır; burada yüksek düzeydeki büyük ayrıntılar, düşük düzeydeki ayrıntılara göre daha önce belirlenir. Bu yaklaşımda yanlış bir şey yok, ancak yalnızca basit düşük seviyeli ilişkileri kodlayabilen döşeme kümeleri oluşturmanın ilginç olduğunu düşünüyorum (ör. deniz suyu ve çimler kıyı şeridiyle ayrılmalı, binalar yalnızca 90 derecelik açılarla dışbükey köşelere sahip olmalı ve yüksek seviyeli desenlerin (örneğin kare binalar) ortaya çıkmasına dikkat edilmelidir.

Döşeme, NP-tam bir kısıtlama tatmin problemidir

Kısıt tatmin problemlerine (CSP) aşina olan bir okuyucu için, sonlu bir dünyanın döşenmesinin bir CSP olduğu zaten açıktır. VLO'da birçok değişkenimiz, her değişkenin alabileceği birçok değer (kendi alanı adı verilir) ve birçok kısıtlamamız vardır. Bizim durumumuzda değişkenler haritadaki koordinatlardır, her değişkenin kapsamı bir döşeme kümesidir ve kısıtlamalar, döşemelerin kenarlarının komşularının kenarlarıyla eşleşmesi gerektiğidir.

Sezgisel olarak, döşeme kümeleri keyfi, kapsamlı bağımlılıkları kodlayabildiğinden, önemsiz olmayan döşemeyi düzgün bir şekilde oluşturma görevi zordur. Döşeme kümesini bir bütün olarak ele aldığımızda, biçimsel açıdan bakıldığında bu bir NP-tam kısıtlama tatmin problemidir. Saf döşeme algoritması, döşeme alanının kapsamlı bir aramasından oluşur ve üstel zamanda çalışır. Yaratabileceğimize dair bir umut var ilginç dünyalar buluşsal yöntemlerle hızlandırılabilen, arama yoluyla çözülen döşeme kümelerine dayalıdır. Diğer bir seçenek de yaklaşık olarak doğru olan ancak az sayıda yanlış konum içeren döşemeler oluşturmaktır. Bazı ilginç döşeme kümeleriyle iyi çalışan iki algoritma buldum ve bunları aşağıda açıklayacağım.

Yöntem 1: Geriye Doğru Dallara Sahip Açgözlü Düzen

Rastgele yerler seçip oraya uygun fayanslar yerleştiriyoruz. Takılırsak bazılarını silip tekrar deneriz.

Haritanın tamamını ÇÖZÜLMEMİŞ olarak başlat

Haritada ÇÖZÜLMEMİŞ kutucuklar varken
haritaya uygun bir döşeme yerleştirilebiliyorsa
T<- коллекция всех возможных расположений подходящих тайлов
ben<- случайная выборка из t, взвешенная по вероятностям тайлов
haritada l'i yerleştir
aksi takdirde
rastgele bir ÇÖZÜLMEMİŞ kutucuk seçin ve ÇÖZÜLMEMİŞ durumunu tüm komşularına atayın


Bir döşeme setinden bir döşeme oluşturmaya yönelik ilk girişimim, tüm ızgarayı çözülmemiş bir duruma getirmekti ve ardından tekrar tekrar rastgele bir döşemeyi uygun bir konuma yerleştirirdim veya uygun konum yoksa yanına küçük bir alan atadım. çözülmemiş döşemeyi "çözülmemiş" duruma getirdi ve açgözlülükle döşemeleri düzenlemeye devam etti. "Açgözlü Düzen", böyle bir yerleştirmenin halihazırda yerleştirilmiş döşemeleri değiştirmeden tamamlanamayacak kısmi döşeme oluşturup oluşturmadığına bakılmaksızın, kenarları önceden yerleştirilmiş döşemelerle eşleştiği sürece bir döşemeyi düzenlemeye yönelik bir stratejidir. Bu durum ortaya çıktığında ve artık fayansları düzenleyemediğimizde, önceden yerleştirilmiş fayanslardan bazılarını kaldırmamız gerekir. Ancak hangilerini kaldırmanın en iyisi olduğunu bilmiyoruz çünkü sorunu çözebilirsek, muhtemelen ilk etapta döşemeleri doğru şekilde yerleştirme sorununu da çözebiliriz. Algoritmaya belirli bir alan için uygun bir döşeme bulma konusunda bir şans daha vermek için, çözülmemiş noktanın etrafındaki tüm döşemeleri "çözülmemiş" duruma ayarlıyoruz ve açgözlü yerleştirme stratejisine devam ediyoruz. Er ya da geç doğru döşemenin bulunacağını umuyoruz, ancak bunun garantisi yok. Algoritma, doğru döşeme bulunana kadar çalışacaktır ve bu sonsuz zaman alabilir. Bir döşeme kümesinin çözülemez olduğunu tespit etme yeteneği yoktur.

Algoritmanın işini tamamlayacağının garantisi yoktur. Herhangi bir rengi paylaşmayan iki döşemeden oluşan basit bir döşeme seti, algoritmanın sonsuz bir döngüye girmesine neden olacaktır. Daha da basit bir durum, üstte ve altta farklı renklere sahip bir döşeme olabilir. Döşeme kümelerinin uygun döşemeler oluşturmada başarısız olduğunu tespit etmenin bir yolunu bulmak mantıklı olacaktır. Sonsuz bir düzlemi döşeyebilen bir döşeme setinin kesinlikle doğru olduğunu söyleyebiliriz. Bazı durumlarda bir döşeme kümesinin sonsuz bir düzlemi döşeyebileceği veya döşeyemeyeceği kolayca kanıtlanabilir, ancak genel olarak bu sorun çözülemez. Bu nedenle tasarımcının görevi doğru döşemeyi oluşturabilecek bir döşeme seti oluşturmaktır.

Bu algoritma, yazının başındaki videodan zindan döşemesi için iyi çözümler bulamıyor. Daha basit döşeme kümeleriyle iyi çalışır. Parçalar arasında birçok olası geçiş türü ve farklı kodlanmış kurallar (örneğin, yolların binaların yanında başlaması ve bitmesi gerektiği) içeren daha karmaşık döşeme kümelerini nasıl çözeceğimizi öğrenmek istiyoruz.

İleriye bakabilen ve döşeme düzenlemeleri oluşturabilen, aynı zamanda bu düzenlemelerin gelecekteki döşeme yerleşimlerine ne şekilde açık olduğunun bir şekilde farkında olan bir algoritmaya ihtiyacımız var. Bu, karmaşık döşeme kümelerini etkili bir şekilde çözmemize olanak tanıyacak.

Kısıtlamaların karşılanması açısından

Bu algoritma geriye doğru aramaya benzer. Her adımda bir değişken atamaya çalışıyoruz. Eğer yapamıyorsak, değişkenin ve ona kısıtlamalarla eklenen tüm değişkenlerin atamasını kaldırırız. Buna "geri atlama" denir ve doğru atamaları yapmaya devam edene kadar her seferinde bir değişkenin atamasını kaldırdığımız geri izlemeden farklıdır. Geriye dönerken genellikle değişkenlerin atamasını ters sırayla kaldırırız, ancak geri dönerken söz konusu problemin yapısına göre değişkenlerin atamasını kaldırırız. Herhangi bir döşemeyi belirli bir noktaya yerleştiremezsek, komşu döşemelerin yerini değiştirmek zorunda kalmamız mantıklıdır çünkü bunların yerleşimi çözülemez bir durum yaratmıştır. Bunun yerine geriye gitmek, mekansal olarak birbirinden uzak olan ancak yakın zamanda atanan değişkenlerin atamasını kaldırmamıza yol açabilir.

Bu aramada herhangi bir yerel bütünlük tekniği kullanılmaz. Yani bir arama adımı sonrasında dahi çözülemez bir duruma yol açacak döşeme yerleştirmelerine kalkışmıyoruz. Bir konumun, geçerli noktadan birkaç kare uzaktaki olası konumlar üzerindeki etkisini takip ederek aramayı hızlandırmak mümkündür. Bunun, aramanın işini geri almak için çok fazla zaman harcamak zorunda kalmasını önleyeceği umulmaktadır. Algoritmamızın yaptığı da tam olarak budur.

Yöntem 2: Yerel bilgilerin en fazla kısıtlamaya ve dağıtıma sahip olduğu konum

Her noktadaki karoların olasılık dağılımını koruyoruz, lokasyona karar verirken bu dağılımlarda yerel olmayan değişiklikler yapıyoruz. Asla geri dönmeyeceğiz.
Daha sonra, test ettiğim tüm döşemeler için tamamlanması garanti edilen ve görsel olarak daha hoş sonuçlar üreten bir algoritmayı anlatacağım. Ek olarak, çok daha karmaşık döşeme setleri için neredeyse doğru döşemeler oluşturabilir. Buradaki ödünleşim, bu algoritmanın çıktının her zaman doğru döşeme olacağını garanti etmemesidir. Optimizasyonlar bölümü, bu algoritmanın daha büyük döşeme kümeleri ve haritalarla bile daha hızlı çalışmasına olanak tanıyan optimizasyonları açıklar.

Doğru döşemeyi oluşturmanın zorluğu büyük ölçüde iki döşeme türü arasında hareket etmek için gereken geçiş sayısına bağlıdır. Basit bir döşeme seti yalnızca kum, su ve çimen içerebilir. Çim ve su birbirine dokunamıyorsa aralarında kuma geçiş olması gerekir. Bu, daha önce sunulan algoritmayla kolayca çözülebilecek basit bir örnektir. Daha karmaşık bir durumda, birden fazla yerleşik döşeme türü düzeyi mevcut olabilir. Örneğin derin su, su, kum, çimen, yüksek ova, dağ ve karlı zirve olabilir. Tüm bu karo türlerinin haritada görünmesi için, bu türlerin belirttiğim sıra dışında birbirine temas edemeyeceğini varsayarsak, yedi geçiş olması gerekir. Belirli döşeme türlerinin yakınında başlaması ve bitmesi gereken yollar gibi döşemeler arasında doğal olarak kapsamlı bağımlılıklar oluşturan döşemeler oluşturularak ek karmaşıklık eklenebilir.

Sezgisel olarak, bu göreve yönelik bir algoritma "ileriye bakabilmeli" ve seçilen konumun sonuçları olabilecek en az birkaç geçişi dikkate alabilmelidir. Bunu uygulamak için, döşeme haritasını her noktadaki döşemelerin olasılık dağılımı olarak düşünebilirsiniz. Algoritma bir döşemeyi konumlandırdığında, o döşemenin etrafındaki olasılık dağılımlarını, konumuna yanıt olarak, mevcut düzenlemeyle uyumlu olması muhtemel komşu döşemelerin olasılıklarını artıracak şekilde günceller.

Örneğin, haritada bir su karosu varsa yanındaki karolarda da su bulunmalıdır. Yanlarındaki kiremitler de su içerebilir, ancak orijinal su kiremitinin yanına bir kenar yerleştirilirse çimen gibi başka olasılıklar da vardır. Konumlandırılmış bir döşemeden ne kadar uzaklaşırsak, o kadar fazla döşeme türü mümkün hale gelir. Bu gözlemden yararlanmak için, orijinal döşemenin yanındaki her döşemenin konumuna ulaşabileceğimiz yolların sayısını sayabiliriz. Bazı durumlarda yalnızca tek bir geçiş dizisi, belirli bir mesafe içinde bir döşemeden diğerine geçişe yol açabilir. Diğer durumlarda birçok farklı geçiş dizisi olabilir. Bir döşemeyi yerleştirdikten sonra yerleştirdiğimiz döşemeden komşu döşemelere geçiş yapabileceğimiz yol sayısını sayarak döşemelerin komşu noktalardaki olasılık dağılımlarını belirleyebiliriz. Bu algoritma tarafından gerçekleştirilen "ileriye bakış", bu tür sayıdaki geçişleri izlemek ve bunları, yerleştirilmek üzere yeni döşemelerin seçilebileceği olasılık dağılımları olarak ele almaktır.


Algoritma, her adımda, her biri döşemeler arasında olasılık dağılımına sahip olan tüm çözülmemiş döşeme konumlarını inceler ve döşeme üzerinde "birleşmek" için bir konum seçer. Haritadan minimum entropiye sahip dağılımı seçer. Düşük entropiye sahip çok terimli dağılımlar, olasılıkların birkaç modda yoğunlaşmasına neden olur, dolayısıyla bu ilk modların yakınsaması, halihazırda bazı kısıtlamalara sahip olan döşeme konumlarının etkisine neden olur. Bu nedenle algoritma ilk önce çözdüğümüz karelerin yanına kareleri yerleştiriyor.

Bu, bu görev için uygulayabildiğim en etkili algoritmadır. Başka bir avantajı daha var: yürütüldüğünde güzel görselleştirmeler yaratıyor. Belki de bir tür geri izleme yöntemi sunarak bu algoritmayı geliştirmenin bir yolu vardır. Ortaya çıkan bitmiş döşemede yanlış bir nokta varsa, komşu döşemelerin konumlarının geri alınması ve sonuçta ortaya çıkan dağılımlardan bunların noktalarında yeniden örnekleme yapılması, kişinin o bitmiş döşeme için bir düzeltme bulmasına olanak tanıyabilir. Elbette doğru döşeme bulunana kadar aramaya devam etmek isterseniz, belirtilen garantili yürütme süresini aşacaksınız.

Optimizasyonlar

Bu yöntemin en önemli işlemi konumlanan karo etrafındaki olasılıkların güncellenmesidir. Bir yaklaşım, bir döşemenin her konumlandırılışında, konumlandırılmış bir döşemeden "dışarıya" olası geçişleri saymak olacaktır. Bu çok yavaş olacaktır çünkü yeni olasılıkların yayılacağı her harita noktası için birçok geçiş çiftinin dikkate alınması gerekecektir. Açık bir optimizasyon, haritanın tamamına yayılmamak olacaktır. Daha ilginç bir optimizasyon, her döşeme düzenlemesinin etrafındaki noktalar üzerindeki etkisini önbelleğe almak olacaktır; böylece her döşeme düzenlemesi, düzenlemenin yakındaki olasılıklarda ne tür değişiklikler yaptığını kontrol etmek için bir arama yapar ve ardından bu değişikliği aşağıdakilerle uygular: bazı basit işlemler. Aşağıda bu optimizasyon yöntemini uygulamamı anlatacağım.

Tamamen boş bir haritaya yerleştirilmiş bir kutucuk düşünün. Bu düzenleme komşu karoların olasılıklarını güncelleyecektir. Bu güncellenmiş dağıtımları, önceki döşeme konumları tarafından verilen önceki dağıtıma sahip olarak görebiliriz. Birden fazla döşeme yerleştirilirse bu önceki tahsis paylaşılacaktır. Önceki eklem göz önüne alındığında bu sonsal olasılığı, geçmişteki her konum için dağılımların çarpımı olarak tahmin ediyorum.


Bunu uygulamak için boş bir haritaya bir karo yerleştirildiğinde haritadaki komşu noktaların dağılımlarında önemli değişiklikler yapacağını hayal edeceğim. Bu güncellemeleri arayacağım küre karo, yani boş bir haritaya yerleştirildiğinde etrafına yansıtılan karonun etki alanı. İki kare yan yana yerleştirildiğinde küreleri etkileşime giriyor ve her iki yerleşimden de etkilenen nihai dağılımlar oluşturuyor. Pek çok döşemenin belirli bir çözülmemiş konumun yakınında bulunabileceği göz önüne alındığında, çok sayıda etkileşimli kısıtlama olacaktır; bu noktada farklı döşemelerin ortaya çıkma olasılığını belirlemek için sayıma dayalı bir karar vermek çok yavaş bir süreç olacaktır. Bunun yerine, haritada halihazırda konumlanmış olan, önceden hesaplanmış karo küreleri arasındaki basit bir etkileşim modelini düşünsek ne olur?
Bir döşemeyi yerleştirirken, her bir öğenin olasılık haritasını, o döşemenin her harita noktasındaki küre dağılımını, o harita noktasında önceden depolanan dağılımla çarparak güncellerim. Bunun bir dağıtım haritasıyla neler yapabileceğine dair bir örneğe bakmak yararlı olabilir. Diyelim ki haritada belirli bir nokta şu anda çim veya su seçme olasılığı eşit olan bir dağılıma sahip ve bu noktanın yanına bir su karosu yerleştiriyoruz. Bir su kiremit küresinin yanında su olma olasılığı yüksek, çim kiremit olma olasılığı ise düşük olacaktır. Bu dağılımları element eleman çarptığımızda ortaya çıkan su olasılığı iki yüksek olasılığın çarpımı olduğu için yüksek olacaktır, ancak çim olasılığı haritada saklanan yüksek olasılığın ürünü olduğu için düşük olacaktır. kürede saklanan düşük olasılık.
Bu strateji, her döşeme konumunun olasılık haritası üzerinde sahip olması gereken etkiyi verimli bir şekilde tahmin etmemizi sağlar.

Kısıtlamaların karşılanması açısından

Kısıt tatmini problemlerini verimli bir şekilde çözmek için, belirli bir değişkene atandığında imkansız hale gelen diğer değişkenlere yapılan atamaları takip etmek genellikle akıllıca olacaktır. Bu prensibe yerel uyumluluk koşullarının getirilmesi denir. Bir çeşit yerel uyumluluğun getirilmesi, bir değişkene değer atanmasını önlerken, geri dönmenin gerekli olduğu durumlarda bitişik bir değişkene uyumsuz bir değer atar. Bu tür dönüşümler CCD literatüründe kısıtlama yayılma yöntemleri alanına aittir. Algoritmamızda her karo yerleştirdiğimizde bilgiyi haritanın küçük bir alanına yayıyoruz. Dağıtılan bilgiler size yakınlarda hangi karelerin görünüp görünemeyeceğini söyler. Örneğin bir dağ karosu yerleştirirsek, ondan iki karo uzakta açık deniz karosu olamayacağını biliyoruz, yani haritanın her noktasında bulunan karodan iki karo uzakta bir deniz karosu olma olasılığı sıfırdır. . Bu bilgiler yukarıda bahsettiğimiz alanlara kaydedilir. Küreler, uygulamak istediğimiz yerel uyumluluğu kodlar.

Komşu kutucuklara olası atamaların sayısını azaltarak, algoritmanın her düzenlemeden sonra işlemesi gereken arama alanını önemli ölçüde azaltıyoruz. Bu küçük mahallede uyumsuz döşemelerin oluşma ihtimalinin sıfır olduğunu biliyoruz. Bu, bu noktalardaki değişkenlerin kapsamlarından bu değerlerin çıkarılmasına benzer. Yani, konumlandırılmış bir döşemenin etrafındaki alandaki her bir komşu nokta çiftinin, kendi tanımlama alanında, halen komşuların tanım alanında bulunan bazı döşemelerle uyumlu olan belirli bir döşemeye sahiptir. İki değişken bir kısıtlamayla bir CR problemine bağlandığında ve alanları yalnızca kısıtlamayı karşılayan değerleri içerdiğinde, bu durumda bunların yay uyumluluğuna sahip olduğu söylenir, bu da bu yöntemin aslında yay uyumluluğunu sağlamak için etkili bir strateji olduğu anlamına gelir.

Bir PCA'da, belirli bir kısmi atamadaki "en kısıtlı" değişken, tanım alanında kalan mümkün olan en az değere sahip olan değişkendir. Harita üzerinde minimum entropi dağılımına sahip bir noktaya bir döşeme yerleştirme ilkesi, aramayı kullanarak bir SDC'yi çözerken değişkenleri sıralamak için standart bir buluşsal yöntem olan SDC'deki en kısıtlı değişkene bir değer atamaya benzer.

Döşeme seçim olasılıklarını değiştirerek döşeme manipülasyonu

Şu ana kadar sadece doğru döşemelerin nasıl oluşturulacağından bahsettim ama döşemeler doğruluğun yanı sıra başka özellikler de gerektirebilir. Örneğin, bir döşeme türünün diğerine belirli bir oranını isteyebiliriz veya döşeme doğru olsa bile tüm döşemelerin aynı türde olmadığından emin olmak isteyebiliriz. Bu sorunu çözmek için, tanımladığım algoritmaların her ikisi de, her döşemeyle ilişkili temel olasılığı girdi olarak alıyor. Bu olasılık ne kadar yüksek olursa, bu döşemenin bitmiş döşemede bulunma olasılığı da o kadar artar. Her iki algoritma da döşeme koleksiyonlarından rastgele seçimler yapar ve ben de temeldeki döşeme olasılıklarına göre bu rastgele seçime ağırlık ekleyeceğim.

Bu prensibin bir örneği aşağıda gösterilmektedir. Katı bir su karosunun görünme olasılığını değiştirerek, haritada görünen su kütlelerinin boyutunu ve sıklığını kontrol edebilirim.

Kendi döşeme setlerinizi yaratın

Kısaca:
  • github depomu klonla
  • İşleme'yi yükle
  • havuzun data/ klasöründe Tiles.png'yi değiştirin
  • wangTiles.pde'yi açmak için işlemeyi kullanın ve oynat düğmesine tıklayın
Github'da yayınlanan kodu kullanarak (değiştirebilirsiniz, ancak bunu yapmak sizin sorumluluğunuzdadır - çoğunu lisede yazdım), görüntü düzenleyiciyi kullanarak kendi döşeme setlerinizi oluşturabilir ve döşeme çözücünün nasıl dünyalar yarattığını izleyebilirsiniz. onlara . Depoyu klonlayın ve dungeon.png görüntüsünü düzenleyin, ardından WangTiles.pde'yi çalıştırmak ve oluşturulan harita animasyonunu görmek için İşleme'yi kullanın. Aşağıda bu döşeme çözücünün ihtiyaç duyduğu “dili” anlatacağım.

Döşeme Seti Spesifikasyonu


Fayanslar 4x4 ızgara şeklinde düzenlenmiştir. Sol üstteki 3x3 bölgedeki her hücre renkli bir döşeme içerir ve geri kalan 7 piksel, döşemenin meta verilerini içerir. Döşemenin merkezinin altındaki piksel, döşemeyi yorumlamak ve döşeme kümesinden hariç tutmak için kırmızıya boyanabilir. Çözücüler onu asla haritaya koymayacaklar. Döşemenin sağ tarafındaki üst piksel, dört döşeme döndürmesinin tümünü döşeme setine eklemek için siyaha boyanabilir. Dört yönde mevcut olan bir açı gibi bir şey eklemek istiyorsanız bu kullanışlı bir özelliktir. Son olarak işaretlemenin en önemli kısmı döşemenin sol alt kısmındaki pikseldir. Haritada görünen bir döşemenin temel olasılığını kontrol eder. Piksel ne kadar koyu olursa, döşemenin görünme olasılığı o kadar artar.

İlgili çalışmalar

Tıpkı bizim baktığımız fayanslar gibi kenarları renkli olan ve kenarlarının yanına yerleştirildiği fayanslarla uyumlu olması gereken fayans setleri olan Van Fayansları pek çok kişi araştırdı.

"Bulanık Yay Tutarlılığı ile En Kısıtlı Yerleştirme" çözümleyicisi, Twitter kullanıcısının Dalga Fonksiyonu Çöküşü projesine benzer

Çini nedir
Muhtemelen fayansın ne olduğuna dair bir fikriniz vardır, ancak gelin ona daha yakından bakalım. Döşeme sabit boyutlu bir resme benziyor. Üstelik diğer fayanslarla karşılaştırıldığında göze çarpan "dikişleri" olmayan tek bir görüntü elde edilecek şekilde çizilir. Fayansları düşünmenin en kolay yolu, duvarları veya yerleri kaplamak için kullanılan fayanslardır. En basit döşeme, dikey ve yatay olarak simetrik olan kare bir görüntüdür (bunu resimde görebilirsiniz). Bu resimleri bir araya getirirseniz geniş bir çim tuvali elde edersiniz. Ve çeşitlilik için bu pitoresk resme başka bir döşeme türü eklerseniz, örneğin bir yolu tasvir ederseniz, o zaman zaten ilkel bir harita oluşturabilirsiniz.
Şimdi 512x512 hücrelik bir harita oluşturmak için yapmamız gereken maliyetleri hesaplayalım. Döşemenin kendisinin 32x32 piksel boyutunda olacağını, ardından bellekte 1024 bayt - 1 kilobayt kaplayacağını varsayalım. Hesaplamalardan sonra, en basit haritanın bellekte yaklaşık 262 kilobayt ve ayrıca döşemelerin kendi görüntülerini depolamak için bellek kapladığı ortaya çıktı. Ancak aynı büyüklükte bir alanı manuel olarak çizseydik, teknik ilerleme sunağına 268 megabayt (!) koymak zorunda kalırdık. Ve bu, basitlik için 256 renk modunu seçmeme rağmen. Şu anda bile her bilgisayarın bu kadar belleğe sahip olmadığı açıktır, bu nedenle haritaların karo yapısı iki boyutlu oyunların büyük çoğunluğunda ve yeterli sayıda üç boyutlu oyunlarda kullanılmaktadır. Basit bir dikdörtgen kiremit.
Dikdörtgen ve kare döşemeler kuş bakışı görünümü temsil etmek için iyidir ancak izometri adı verilen başka bir projeksiyon türü de vardır. Hacim, derinlik hissi vermek gerektiğinde kullanılır. sözde 3D. Bu nedenle izometrik sistemlere bazen 2,5D adı verilir. Buradaki amaç nedir? Artık döşeme izleyiciye doğru bir açıyla döndürülmüş ve sanki daha derine gidiyormuş gibi görünecek (resme bakın). Doğası gereği iki boyutlu bir resim üçüncü bir boyut kazanır. Bu durumda karenin (fayans) boyutları şu şekilde belirlenir:
1. Uzunluk - görüntünün en sol noktasından en sağ noktasına kadar.
2. Genişlik - izleyiciye "en uzak" noktadan "en yakın" noktaya kadar.
3. Yükseklik - döşemenin “kalınlığı”.
Hacim efekti yaratmak için genişlik, uzunluğun yaklaşık yarısı kadar olmalıdır. Bu ilişkiyi deneyerek, istenen projeksiyonu seçerek "karoyu" üç boyutlu uzayda döndürüyormuşsunuz gibi görünüyor. Bu amaçlar için bir tür 3D stüdyo analogunun kullanılması faydalıdır. Orada bir döşeme oluşturun, konumunu seçin ve ardından kenarları ve elde edilen oranları ölçün.
Ama şimdi nasıl çizebilirim? Basit bir izometrik döşeme. ekranda böyle bir döşeme var mı? Sonuçta, normal çizim işlevleri, görüntülenecek dikdörtgen bir alan verilmesine alışkındır ve bunu çok iyi yaparlar. Bu sorun maskeler yardımıyla çözülür. Resimde karonun konturlarının beyaz alana düştüğünü, dışarıda kalanın ise siyaha boyanarak bir dikdörtgen oluşturduğunu göreceksiniz. Bir şablonun prensibi elde edilir: görüntü maskenin ve "kanvasın" üzerine bindirilir ve yalnızca beyaz renkte düşen noktalar geçer. DirectX işlevlerinin yanı sıra, standart Windows çizim işlevleri bile bu tür şeyleri yapmak üzere eğitilmiştir. Aynı zamanda maske kullanımı başka efektler yaratmanıza da olanak tanır. Örneğin, yüksekliğini göz ardı ederek döşemenin yalnızca başını çizebilirsiniz. Veya tek bir resim kullanarak çimlerin farklı bölümlerini oluşturun. Tamamen deliklerden oluşan bir maske oluşturup bunu farklı türde mevcut bir karo yerine çim karoyu sergilemek için kullanırsak, bir yüzeyden diğerine yumuşak bir geçiş elde ederiz. Benzer bir teknik birçok durumda kullanılabilir ve "delikli" maskeler rastgele oluşturulabilir. O zaman hiç kimse manzaranızın önceden oluşturulmadığını tahmin etmeyecektir. Sonuç, bir tür çoklu dokulandırmadır: karşılıklı olarak şeffaf iki görüntü bir alana yerleştirildiğinde. Doğru, bu oldukça fazla bilgisayar zamanı alıyor.
En basit durumda döşeme yüksekliği sıfırdır ve hesaplanmaz. Ancak, yalnızca bu tür "tuğlaları" kullanırsak, en iyi ihtimalle hoş bir açıklığa kavuşuruz. Farklı yükseklikler kullanarak duvarlar ve tepelerle daha gerçekçi bir manzara elde edeceğiz. Elbette bu tür "yapı taşlarını" ekranda görüntülemek daha zor olacaktır. Artık bir döşemenin taban çizgisi kavramına aşina olmalıyız.
Temel- burası karonun “zemin” ile temas ettiği yerdir. Resimde pembe renkle vurgulanmıştır. Taban çizgisi dikey çizginin herhangi bir yerine yerleştirilebilir çünkü aynı görüntü farklı boyutlardaki duvarlar için kullanılabilir. Daha sonra döşeme yerleştirme haritasında taban çizgileri görüntülenir ve döşemelerin kendisi daha yüksek bir konumdan çizilmeye başlar.

2Dfx

Birkaç döşeme katmanını kullanarak hangi efektlerin yaratılabileceğine zaten baktık. Gerçek oyunlarda Fayans boyutları bu şekilde hesaplanır. Haritanın tamamı meşhur pasta gibi çok katmanlı: ilk katman- bu toprak, taş, çamur, su ve benzerleridir; ikinci katman- ağaçlar, kayalar, masalar ve sandalyeler gibi herhangi bir çevre; üçüncü katman- nesneler: insanlar, canavarlar, anahtarlar ve sihirli iksirler.
Yukarıdaki efektler için daha fazla katman ekleyebilirsiniz ancak en iyi performans için genellikle dört ila beş katman kullanılır. Örneğin, karakterlerin baş hizasının üzerinde olacak nesneler (örneğin evlerin çatıları) oluşturmak için şemamıza dördüncü bir katman eklenebilir. Hepiniz bu etkiyle karşılaşmışsınızdır: Kahraman bir binaya yaklaştığında çatısı aniden kaybolur ve binanın içini görebilirsiniz. Dolayısıyla, kullanıcının altında saklı olan her şeyi görebilmesi için döşeme motorunu dördüncü katmanı çizmeyi durdurmaya zorlamak çok kolaydır.
Grafiklerini palet prensibine dayandıran döşeme motorları, renk döndürme efektini aktif olarak kullanır. Suyu işlemek için belirli bir mavi gama kullanılsın. Daha sonra bu gammayı değiştirerek veya tersine karodaki endeksleri yeniden düzenleyerek akan su efektini elde edebilirsiniz. Aynı numara diğer yüzeyler için de geçerlidir. Diyelim ki bir mağarada kayayı temsil eden fayanslar var. Çini ve maskesi. Ekranda çizim yaparken
sadece beyazın içine düşen kısım görünüyor
maske alanı. daha koyu yapılabilir. Ve eğer bir karakterin eline bir meşale verirseniz ve onun konumuna bağlı olarak çevreyi aydınlatırsanız, etkisi çok güzel olacaktır. Gece ve gündüzün dinamik değişiminden bahsetmiyorum bile. Palet yönetimi çok ilginç bir konudur, ayrıca kimsenin paletler olmadan yapamayacağı toplam 256 çiçeklenme döneminde çok iyi geliştirilmiş ve incelenmiştir. Şimdi bile, 16 bitin altındaki renklerin uygunsuz olduğu düşünüldüğünde, spriteları depolamak için aynı paletleri temel alan kendi formatları kullanılıyor.
Bu arada, döşemeleri görüntülemek için sıradan DirectDraw prosedürlerini kullanmanız gerektiğini kim söyledi? Tabii ki, uzun bir süre boyunca birçok etki için algoritmalar geliştirildi: dinamik aydınlatma ve hatta parçacık sistemleri. Ama hepsi çok yavaş çalışıyor. Ancak bu 1996 değil ve Voodoo Graphics nadirdir çünkü herkes onu zaten atmıştır. Bu nedenle, günlük ihtiyaçlar için bir 3D hızlandırıcının yeteneklerinden yararlanmak çok cazip olacaktır.
3B kitaplıklar, 2B prosedürlerdeki en yavaş nokta olan dokulu çokgenlerin (aynı döşemeler) çıktısının alınmasına yardımcı olabilir. Bu durumda filtreleme (diğer bir deyişle dokuların sanatsal olarak bulanıklaştırılması) apaçık bir gerçektir. Ayrıca yalnızca 3D oyunlarda mevcut olan tüm efektler kullanılabilir hale gelir: ışık, şeffaflık, gölgeler, ışık geçişleri vb. Bu konu üzerinde pratik yapılabilecek kadar ilgi çekicidir. Bu, karo tabanlı oyunların geleceği olabilir.

Harita oluşturma
Herhangi bir harita, döşemelerin katmanlarındaki konumunu ve parametrelerini belirten bir dizidir. En basit harita, her öğenin geleneksel olarak kabul edilen bir dizideki döşeme sayısını içerdiği bir MxN matrisidir. Daha önce bir 2D strateji veya RPG harita düzenleyicisi kullandıysanız (veya Photoshop'ta çalıştıysanız), bu fikri kolayca anlayacaksınız. Ne zaman Aynı fayansların yüksekliği farklı olabilir,
Temel yöntem kullanıldığında. yeni katmanlar eklenir, matris daha karmaşık hale gelir, sonuç bir matris kümesidir (yapısıdır) ve herhangi bir efektin eklenmesiyle, diskte bir megabayttan fazla yer kaplayan kendi harita formatınızı elde edersiniz.
Fayanslara sıralı numaralar verilmesine gerek yoktur. Tam tersine tüm sayı serinizi birkaç aralığa bölerek başlamak iyi olur. Örneğin, 0'dan 63'e kadar olan aralık, üzerinde yürüyebileceğiniz sıradan döşemeleri (zemin, döşemeler) içerir. 63'ten 127'ye kadar - aşılmaz orman çalılıkları, duvarlar ve diğer katı nesneler. Bir sonraki aralık göllerin ve bataklıkların suları ve son olarak kahraman üzerlerine "adım attığında" herhangi bir eylemi gerçekleştiren özel gruplardır: portallar, tuzaklar vb. Artık Photoshop grafik ürettiği için, yeni gelenlere kabul edilen kurallara göre numaralar veriyorsunuz ve gelecekte bir alanın geçilebilirliğini veya kahraman portala girdiğinde nasıl tepki vereceğinizi belirlemeyle ilgili birçok sorundan kurtulmuş oluyorsunuz.
Bir harita çizerken, ilk başta izometrik karoları çizmede sorun yaşayabilirsiniz, çünkü bunlar o kadar "kavisli" ki, birini nereye çizip ikinciye devam edeceğiniz belli değil. Harita bölümlerinin ekran tarafından düzgün kaydırılması veya kırpılması programlanırken zorluklar ortaya çıkabilir. Bu arada, karo boyutlarını ikinin bazı kuvvetlerinde (16x16 veya 32x32) yapmak en iyisidir, bu, hesaplamalar sırasında hem size hem de işlemciye büyük ölçüde yardımcı olur. Aynı durum kartın boyutu için de geçerlidir. Mümkün olduğu kadar kare olmalı ve boyutları “tuğla” bileşeninin boyutuna bölünmelidir. Bu sayede hesaplama yaparken hiçbir zaman üzerinde çalışılması mümkün olmayan kesirli değerlere sahip olmayacaksınız. Bu nedenle çoğu kartın 128x128 veya 512x512 gibi boyutları vardır.
Bu arada, karakterleri izometrik bir harita etrafında hareket ettirmenin de bir nedeni var. Sonuçta haritamız "derinlemesine" döndürülür ve mutlak dikey boyutu yataydan iki kat daha küçüktür. Bu nedenle yürüyen herhangi bir nesnenin buna göre “yukarı” hareket etmesi gerekir. Genel olarak burada formüllerin uygulanması gerekir, ancak en basit durumda yan tarafa iki adım için bir adım derinlik vardır. Kesin hesaplamalarla ilgileniyorsanız, aşırı durumlarda bunları internette bulmak kolay olacaktır; tavsiye isteyin. Aynı şey, tamamen düz bir arayışta bile izometride gerçekleşen herhangi bir hareket için de geçerlidir.
Neyse ki, tüm bu sorular uzun süredir az çalışılan teknolojiler olarak sınıflandırılmaktan vazgeçti ve internette izometrik 2D motorların programlanmasıyla ilgili çok sayıda ders kitabı var. gibi sitelerin makaleler bölümüne bakmanızı tavsiye ederim. www.gamedev.net Ve www.flipcode.com veya Yahoo benzeri bir arama motorunu uygun anahtar kelimelerle besleyin.

İzometriX

"Programlarla uğraşmayı" sevenler için, kompaktın üzerine özel olarak adında bir motor koyduk. İzometriX. Yukarıda söylenen her şeyi biriktirir. Geçmişte "Samopale"de incelenen çoğu 3D motor ve oyun tasarımcısının aksine, bu motor oyununuzun temeli olmayı amaçlamıyor. Öncelikle her türlü teorik sorunun nasıl çözüldüğünü pratikte görmeniz amaçlanmaktadır. Motor tamamen yazılmıştır. Görsel C++, kaynak koduna ve kendi seviye düzenleyicisine sahiptir. Programlamayla ilgilenmiyorsanız, hiçbir şey derlemeden test seviyesinde dolaşabilirsiniz.
İşlevler açısından IsometriX mütevazının da ötesinde görünebilir: 8 bit renkte 640x480 elbette durum böyle değil. Ancak dediğim gibi bu daha çok haritalarla çalışmayı, karakterleri hareket ettirmeyi, çarpışmaları kontrol etmeyi ve çok daha fazlasını yapmayı öğrenebileceğiniz bir örnek. Ayrıca Windows 9x/2000'de her şey yolunda çalışıyor ve büyük olasılıkla XP'de de çalışacak.

Bir ayrılık sözü olarak
Ne derse desinler iki boyutlu Kiremit motorları bugün hala en canlı olanlardır. Hiçbir 3D oyun, detay ve çizim güzelliği açısından klasik 2D oyunlarla karşılaştırılamaz. Örneğin Fallout Tactics'i ele alalım; bu oyun belki de 2D alanındaki en ilerici başarıları kullanıyor. Ve hiç kimse bu oyunun grafiklerine kötü demeye cesaret edemez.
Ayrıca fayanslar devasa dünyalar yaratmak için idealdir. Segmentasyonu kullanarak, harita her biri dinamik olarak yüklenen birkaç parçaya bölündüğünde, olağanüstü boyutlarda haritalar oluşturabilirsiniz. Ve bu RPG oyunlarında aktif olarak kullanılıyor. Bu, geliştiricilerin hızlandırıcılar ve çoklu doku oluşturma dünyasına geçmek için acele etmemelerinin bir başka nedenidir.
Ve son olarak, döşeme grafiklerini öğrenmek herhangi bir 3D motordan çok daha kolaydır (her ne kadar bu benim öznel görüşüm olsa da). DirectDraw'ın spritelarla çalışmasını öğrenmek, Direct3D ve hatta OpenGL'den kıyaslanamayacak kadar daha kolay ve anlaşılır. Bu nedenle doğrudan ön cepheye koşmaya çalışmayın. Belki de eski güzel 2D dünyasına da bakmalısınız. Belki biraz 2.5D...

Bu yazıda size hemen hemen her türdeki oyunlar için nasıl seviye oluşturulacağını ve bunların geliştirilmesini nasıl kolaylaştıracağınızı öğreteceğim. Projelerinizde kullanabileceğiniz bir karo harita motoru oluşturacağız. Haxe ve OpenFL kullanacağız ancak oluşturma süreci birçok dil için benzerdir.

Makalede ne anlatılacağı hakkında biraz

  • Döşeme tabanlı oyun nedir?
  • Kendi "karelerinizi" oluşturun veya arayın
  • Seviyeyi gösterecek kod yazma
  • Seviyeleri düzenleme

Döşeme tabanlı oyun nedir?

Tabii ki, döşeme grafiklerinin tanımını Wikipedia'da bulabilirsiniz, ancak bunun ne olduğunu anlamak için sadece birkaç şeyi anlamanız gerekir.
  • Döşeme - büyük resimler oluştururken yapboz parçası görevi gören, genellikle dikdörtgen şekilli küçük bir resim
  • Harita - birlikte gruplandırılmış bir grup döşeme
  • Döşeme tabanlı, oyunlarda seviye oluşturma yöntemini ifade eder. Kod, döşemeleri önceden tanımlanmış konumlara yerleştirir
Yazımızda fayanslar dikdörtgen şeklinde olacak. Döşeme grafiklerini kullanarak elde edebileceğiniz bazı harika özellikler var. En güzel yanı ise her seviye için devasa görseller çizmeye gerek olmaması. 50 seviyeli bir oyun için elli adet 1280x768 piksel görüntü ile yüz parçadan oluşan bir görüntü büyük bir fark yaratır. Diğer bir faydası da döşeme grafiklerini kullanarak öğeleri yerleştirmenin fark edilir derecede kolaylaşmasıdır.

Parçalar oluşturun veya arayın

Bir motor inşa etmek için ihtiyacınız olan ilk şey bir dizi döşemedir. İki seçeneğiniz var: hazır fayans kullanın veya kendinizinkini yapın. Hazır görselleri kullanmaya karar verirseniz, bunları İnternet'in her yerinde kolaylıkla bulabilirsiniz. Dezavantajı ise bu grafiklerin oyununuz için özel olarak yapılmamış olmasıdır. Öte yandan, yalnızca deneme yapıyorsanız bu seçenek oldukça uygundur.

Fayans bulmanın sorun olmayacağını düşünüyorum, bu yüzden bu konu üzerinde detaylı durmayacağım.

Döşeme oluşturma
Resimlerinizi oluşturmanızı kolaylaştıracak birçok harika araç var. Birçok geliştirici bu araçları çalışmaları için kullanır.

Bunlar piksel sanatı oluşturmak için en popüler araçlardır. Daha güçlü bir şeye ihtiyacınız varsa GIMP idealdir.

Bir program seçtikten sonra kendi döşemelerinizi denemeye başlayabilirsiniz. Bu makale size kendi döşeme grafik motorunuzu nasıl oluşturacağınızı göstereceğinden, döşemelerin kendisi hakkında ayrıntılara girmeyeceğim.

Kod yazma

İhtiyacımız olan her şeye sahip olduğumuzda doğrudan programlamanın kendisine dalabiliriz.
Ekranda bir döşeme görüntüle
Ekranda tek bir döşeme görüntüleyen en basit görevle başlayalım. Tüm resimlerinizin aynı boyutta olduğundan ve farklı dosyalara kaydedildiğinden emin olun (sprite'ları tek bir dosyada saklamaktan daha sonra bahsedeceğiz).

Tüm kutucuklarınız projenizin varlıklar klasörüne girdikten sonra basit bir Tile sınıfı yazabilirsiniz. İşte Haxe ile ilgili bir örnek
flash.display.Sprite'ı içe aktar; flash.display.Bitmap'i içe aktar; openfl.Assets'i içe aktarın; class Tile, Sprite'ı genişletir ( özel var image:Bitmap; public function new() ( super(); image = new Bitmap(Assets.getBitmapData("assets/grassLeftBlock.png")); addChild(image); ) )
Şimdi tek yaptığımız döşemeyi ekrana yerleştirmek. Sınıfın yaptığı tek şey, varlıklar klasöründen bir görüntüyü içe aktarmak ve onu bir alt nesne olarak eklemektir. Bu sınıfın neye benzeyeceği büyük ölçüde kullandığınız programlama diline bağlıdır.

Artık Tile sınıfımız olduğuna göre, Tile'ın bir örneğini oluşturup onu ana sınıfımıza eklememiz gerekiyor.
flash.display.Sprite'ı içe aktar; flash.events.Event'i içe aktar; flash.Lib'i içe aktar; class Main Sprite'ı genişletir ( public function new() ( super(); var kiremit = new Tile(); addChild(tile); ) public static function main() ( Lib.current.addChild(new Main()); ) )
Ana sınıf, yapıcı çağrıldığında yeni bir Tile nesnesi oluşturur ve onu görüntüleme listesine ekler.

Oyun başladığında main() işlevi çağrılacak ve sahneye Main türünde yeni bir nesne eklenecektir. Lütfen yeni döşemenizin ekranın sol üst köşesinde görüneceğini unutmayın.

Tüm Döşemeleri Görüntülemek için Dizileri Kullanma
Bir sonraki adım, tüm döşemeleri görüntülemek için bir yöntem bulmaktır. En basit yöntem, bir diziyi her biri bir döşemeye karşılık gelen sayılarla doldurmaktır. Daha sonra dizinin tüm öğelerini yinelersiniz ve bunları görüntülersiniz.

Bir seçeneğimiz var: normal bir dizi veya bir matris kullanın. Matrislere aşina değilseniz, bunun daha fazla dizi içeren bir dizi olduğunu bilin. Çoğu programlama dili bunu nameOfArray[x][y] olarak temsil eder.

Ekranda koordinat olarak X ve Y'yi kullanıyoruz. Belki bu X ve Y'yi döşemelerimizi sergilemek için kullanabiliriz? Öyleyse matrise bir göz atalım
özel var exampleArr = [ , , , ,
Bu dizideki sıfır öğesinin beş sayıdan oluşan bir dizi olduğuna dikkat edin. Bu, önce y, sonra x öğesini alacağınız anlamına gelir. Eğer elementi almaya çalışırsanız altıncı karoya erişim kazanacaksınız.

Matrislerin nasıl çalıştığını anlamıyorsanız endişelenmeyin. Bu yazıda görevimizi kolaylaştırmak için normal bir dizi kullanacağım.
özel var exampleArr = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0 ];
Yukarıdaki örnek, normal bir dizi kullanmanın çok daha basit olduğunu göstermektedir. Basit bir formül kullanarak koordinatları hesaplayarak belirli bir öğeyi görüntüleyebiliriz.

Şimdi dizimizi oluşturan kodu yazalım. 1 ile dolduralım. Bir rakamı ilk kutucuğumuzun kimliği anlamına gelecektir.

Diziyi saklamak için Ana sınıfın içinde bir değişken oluşturmamız gerekir.
özel var haritası:Dizi ;
Bu biraz tuhaf görünebilir o yüzden açıklayacağım.
Değişken adı harita ve türü Array'dir. dizinin sayılar içerdiği anlamına gelir.
Şimdi haritamızı başlatmak için sınıf yapıcımıza bazı kodlar ekleyelim
harita = yeni Dizi ();
Bu kod parçası, kısa süre içinde dolduracağımız boş bir dizi oluşturur. Ama önce matematikte bize yardımcı olacak birkaç değişkeni tanımlayalım.
genel statik var TILE_WIDTH = 60; genel statik var TILE_HEIGHT = 60; genel statik var SCREEN_WIDTH = 600; genel statik var SCREEN_HEIGHT = 360;
Bu değişkenler, programımızın herhangi bir yerinden onlara erişmemizi sağlamak için genel statiktir. Bu sayılara göre dizide kaç hücre depolanacağına karar vereceğimizi fark etmişsinizdir.
var w = Std.int(SCREEN_WIDTH / TILE_WIDTH); var h = Std.int(SCREEN_HEIGHT / TILE_HEIGHT); for (i in 0...w * h) ( harita[i] = 1 )
Burada dediğim gibi değeri w değişkeni için 10, h değişkeni için 6 olarak ayarlıyoruz. Daha sonra, 10*6 sayıları sığdırmak için dizide döngü yapmalıyız.

Artık basit bir haritamız var ama döşemeleri doğru şekilde düzenlememiz gerekiyor, değil mi? Bunu yapmak için Tile sınıfına geri dönelim ve bunu yapmamızı sağlayan bir fonksiyon oluşturalım.
genel işlev setLoc(x:Int, y:Int) ( image.x = x * Main.TILE_WIDTH; image.y = y * Main.TILE_HEIGHT; )
setLoc() fonksiyonunu çağırdığımızda x ve y koordinatlarını geçiyoruz. Fonksiyon bu değerleri alır ve bunları TILE_WIDTH ve TILE_HEIGHT ile çarparak piksel koordinatlarına dönüştürür.

Yapılacak tek şey, harita üzerinde döşeme oluşturma ve konumlandırma sürecini Ana sınıfta tanımlamaktır.
for (i in 0...map.length) ( var kiremit = yeni Tile(); var x = i % w; var y = Math.floor(i / w);tile.setLoc(x, y); addChild (kiremit)
Evet! Her şey doğru. Ekran fayanslarla doludur. Yukarıda neler olduğunu anlayalım

Formül
Yukarıda bahsettiğim formülü tartışalım.

x'i i'nin w'ye bölümünden kalanı vererek hesaplıyoruz. Bu, her satırın başında x'i 0'a döndürmek için yapılır.

Y için i/w'den kat()'ı alıyoruz.

Son olarak seviye kaydırma konusunda da biraz bahsetmek istiyorum. Genellikle ekrana tamamen sığacak bir seviye oluşturamazsınız. Haritalarınız ekrandan fark edilir derecede büyük olacağından haritanın kullanıcının göremeyeceği kısmını çizmenize gerek kalmayacaktır. Bu aynı matematik kullanılarak düzeltilebilir. Ekranda hangi döşemelerin görüneceğini ve hangilerinin görünmeyeceğini saymanız gerekir.

Örneğin: Ekran 500x500, döşemeler 100x100 ve dünyanız 1000x1000. Döşemeyi çizmeden önce basit bir kontrol yapmanız gerekir.

Tek yapmamız gereken farklı türde fayanslar oluşturmak ve güzel bir şey sergilemek.

Farklı fayans türleri
Tamam, artık aynı unsurlarla dolu bir haritamız var. Birden fazla eleman tipine sahip olmak güzel olurdu, bu da Tile sınıfındaki yapıcımızı değiştirmemiz gerektiği anlamına geliyor
public function new(id:Int) ( super(); switch(id) ( durum 1: image = new Bitmap(Assets.getBitmapData("assets/grassLeftBlock.png")); durum 2: image = new Bitmap(Assets. getBitmapData("assets/grassCenterBlock.png")); durum 3: resim = new Bitmap(Assets.getBitmapData("assets/grassRightBlock.png")); resim = new Bitmap(Assets.getBitmapData("assets/goldBlock) ) .png")); durum 5: resim = new Bitmap(Assets.getBitmapData("assets/globe.png")); durum 6: resim = new Bitmap(Assets.getBitmapData("assets/mushroom.png")) ; ) addChild(resim);
Artık altı farklı fayans çeşidimiz var. Hangi görüntünün görüntüleneceğini seçmek için bir anahtar yapısına ihtiyacım var. Yapıcının artık döşeme türünü belirten bir sayıyı parametre olarak aldığını fark etmiş olabilirsiniz.

Ana sınıfın yapıcısına dönelim ve döngümüzü düzenleyelim
for (i in 0...harita.uzunluk) ( var kiremit = yeni Döşeme(harita[i]); var x = i % w; var y = Math.floor(i / w);tile.setLoc(x, y); addChild(tile);
Tek değişiklik artık blok tipini yapıcıya aktarmamızdır. Programı bu değişiklik olmadan çalıştırmayı denediyseniz, yürütme bir hatayla sonuçlanacaktır.

Artık her şey yerli yerinde ama haritayı rastgele bloklarla doldurmak yerine bir tasarım bulmamız gerekiyor. İlk olarak, diziyi birlerle dolduran Ana yapıcıdaki döngüyü kaldırın. Daha sonra haritanızı manuel olarak oluşturun
harita = [ 0, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 6 , 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3];
Eğer diziyi benim yaptığım gibi formatlarsanız seviyenin yaklaşık görünümünü kolaylıkla görebilirsiniz. Ancak hiç kimse diziyi tek bir satıra doldurmanızı yasaklamaz.

Programı başlattığınızda çeşitli hatalar göreceksiniz. Sorun, haritamızın, görüntüsü olmayan bir boş blok türü içermesi ve sınıfımızın bununla ne yapacağını bilmemesidir. Bu yanlış anlaşılmayı düzeltelim
if (resim != null) addChild(resim);
Bu kısa kontrol bizi sinir bozucu boş gösterici hatasından kurtaracaktır. Son değişiklik setLoc() fonksiyonunu etkileyecektir. Başlatılmamış x ve y değişkenlerini kullanmaya çalışıyoruz
public function setLoc(x:Int, y:Int) ( if (image != null) ( image.x = x * Main.TILE_WIDTH; image.y = y * Main.TILE_HEIGHT; ) )
Bu iki basit koşul sayesinde artık oyuna başlayabilir ve basit bir seviye görebilirsiniz. Kimliği 0 olan döşemeleri boş alan olarak algılıyoruz. Biraz arka plan ekleyin. daha çekici görünmesini sağlamak için.

Çözüm

Az önce masal tabanlı bir motor yarattınız. Artık döşeme grafiklerinin ne olduğunu ve nasıl kullanılacağını biliyorsunuz. Seviyeleri nasıl oluşturacağınızı ve düzenleyeceğinizi öğrendiniz. Ancak bununla yetinmeyin, motorumuzda hâlâ geliştirilebilecek çok şey var.
Editörün Seçimi
Yeni ürün üretmeye yönelik harcamalar 20 numaralı hesapta bakiye oluşturulurken gösterilir. Ayrıca...

Kurumsal emlak vergisinin hesaplanması ve ödenmesine ilişkin kurallar Vergi Kanunu'nun 30. Bölümünde belirlenir. Bu kurallar çerçevesinde, Rusya Federasyonu'nun kurucu kuruluşunun yetkilileri...

1C Muhasebe 8.3'teki nakliye vergisi, düzenleyici düzenlemenin gerçekleştiği yıl sonunda otomatik olarak hesaplanır ve tahakkuk ettirilir (Şekil 1).

Bu makalede, 1C uzmanları "1C: Maaşlar ve Personel Yönetimi 8" baskısında 3 tür ikramiye hesaplaması - tür kodları kurulumundan bahsediyor...
1999 yılında Avrupa ülkelerinde tek bir eğitim alanı oluşturma süreci başladı. Yükseköğretim kurumları haline geldi...
Rusya Federasyonu Eğitim Bakanlığı her yıl üniversitelere kabul koşullarını gözden geçirir, yeni gereksinimler geliştirir ve üniversitelere kabul koşullarını sonlandırır.
TUSUR, Tomsk üniversitelerinin en küçüğü olmasına rağmen hiçbir zaman ağabeylerinin gölgesinde kalmamıştır. Atılım sırasında oluşturuldu...
RUSYA FEDERASYONU EĞİTİM VE BİLİM BAKANLIĞI Federal devlet bütçe yüksek eğitim kurumu...
(13 Ekim 1883, Mogilev, – 15 Mart 1938, Moskova). Bir lise öğretmeninin ailesinden. 1901 yılında Vilna'daki spor salonundan altın madalyayla mezun oldu.