Gönderen Konu: Parallax mantığı  (Okunma sayısı 32765 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 3093
  • Advanced User Simulator
    • ae unutmadan
Ynt: Parallax mantığı
« Yanıtla #30 : 06 Ocak 2015, 16:05:58 »
Küçük bir itirafta bulunmam gerekirse bitmask'la ilgili olarak ne önerdiğini ilk başta anlamamıştım. Ama kafamda oluşan fikirler, biraz deneme yanılmayla beni gördüğün sonuca ulaştırdı.

Haha, eh, aklın yolu bir dostum :) Tam olarak önerdiğim şeyi uygulamış olman benim açımdan süper olmuş. 10 puan!

Diğer soruların cevapları nightlord, wisdom ya da skate'te bulunuyor. Bakalım gören olacak mı.

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 199
Ynt: Parallax mantığı
« Yanıtla #31 : 07 Ocak 2015, 12:48:50 »
Şimdi gördüm bu başlığı, süper iş çıkarmışsın wizofwor, tebrikler kardeşim.

Şu anda çok detaylı giremeyeceğim konuya, çok az vaktim var. Ancak bir iki temel noktaya parmak basacağım.

1) Bunu bir oyun projesi için planladığını söylemişsin. Tüm postları dikkatle okuyamadım ama daha önce uyaran olmadıysa ilk uyarıyı yaparak başlayayım. Spritelar ve zamanlamalar. :) Oyunda kullanacağın spritelar scrolllerin hassas biçimde yakalamış olduğun zamanlamalarını etkileyeceklerdir. Yani sen bu ekranın üzerinde serbestçe bir ya da birkaç sprite gezdirdiğinde zamanlamaların birbirine girdiğini göreceksin. Elbette ki bahsettiğim spriteların dikey pozisyon değişimleri, yatayda pek bir sorunla karşılaşmazsın. Yani oyunda spriteların gezineceği alanları iyi planlaman lazım.

Bir de iş zamanlamaya geldiğinde spriteları ekranda kaç adet olduklarına göre değil o anki bulunduğun raster satırına kaç sprite denk geldiğine göre değerlendirmen lazım. Bu konu çok derin bir konu, çeşitli çözümler var ancak dediğim gibi öncelikle senin ne planladığın önemli.

2) Stable IRQ rutini biraz daha karmaşık bir konu. Bu çok iyi bir örnek değil aslında stackle gereksiz oynaşıyor ama yine de mantığını anlaman için güzel bir örnektir.

http://www.ffd2.com/fridge/vic/stableraster.txt

Yorumları okursan tam olarak stable zamanı nasıl yakalıyor anlayacaksın.

Stable raster yakaladıktan sonra işin biraz daha kolaylaşacak. Ama badlinelara, spritelara dikkat etmen lazım.

3) Scroll'ün nerede yapılacağı konusuna gelirsek... Basitçe kural şu. Scroll eden alan dışındaki herhangi bir yer, istersen parçalara bölerek. Ama burada da dikkat edilmesi gereken bir mevzu var. Scroll eden alanın üstünde kalan kısımda yapılan kaydırma işlemleri o framede, altında yapılanlar ise bir sonraki framede çizilir. Yani diyelim ki 8 karakter yüksekliğinde bir bloğu kaydıracağız. Alanın üstündeki alan en fazla 5 satının kaydırılması için yeteri cycle'a sahip, alt 3 satırı ise alanın altında kaydırmamız gerekiyor. Bu şekilde parçalayabilirsin, sorun yok. Ancak vereceğin scroll değerleri arasında 1 framelik bir faz farkı olması gerekiyor. Eğer aynı scroll pozisyonlarıyla kaydırmayı denersen alt üç satır 1 frame geriden gelecektir.

Bir diğer mevzu ise örneğin demin bahsettiğim 8 satırlık alanın içersinde o satırları kaydırma işlemi yapamayabilirsin ancak diğer scrollleri bu alanda yapmanda bir sakınca yok. Müzik falan da bu alanda çalabilirsin. Yeter ki toplam cycleların o alanı aşmayacağı garanti olsun.

Son olarak benim "beam kovalamaca" diye tabir ettiğim bir durum var. O da şöyle. Diyelim ki 8 satırın tamamını kaydırmak için yeterli zamanın kalmadı. Tek zaman kalan bölge yine 8 satılırlık alanın kendisi. Bu durumda şöyle bir trick kullanabiliyorsun. Diyelim ki ilk 6 satırı bölgenin dışında kaydırdın. Kalan son iki satırı burada kaydırabilirsin. Ancak dikkat! bu satırların kaydırıldığı bloğun satırların kendilerine denk gelmemesi gerekiyor. Yani mesela ilk 6 satır dışardan kaydırıldıysa, bu 6 satırlık bölgede takip eden iki satırı kaydırabilirsin.

Teorik olarak şu da mümkün. 8 satırlık bölgenin ilk 4 satırında alt 4 satırını, son dört satırında ilk 4 satırını faz farkıyla kaydır. Ama böyle bir şey için zamanlamaların fazlasıyla kusursuz olması gerekiyor. Tavsiyem bu kadar kritik zamanlamalara mecbur kalmadıkça girmemen yönünde olacaktır.

Şimdilik bu kadar. Daha sonra vaktim olduğunda daha teknik açıklamalarla yardımcı olmaya çalışacağım.

Not: Tüm karakter ekranını yukardan aşağı ve aşağıdan yukarı scroll eden iki rutin yazmayı denerseniz birini kolayca yapabildiğinizi, diğerinde bir türlü zamanlamaların yetişmediğini göreceksiniz. Burada bahsettiğim "beam kovalamaca" dediğim mevzu devreye giriyor. Her iki yönde de scroll'ü temiz biçimde yapmayı başardığınızda büyük ölçüde yukarda anlattıklarımı pratikte kullanmış oluyorsunuz.

Çevrimdışı wizofwor

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 398
Ynt: Parallax mantığı
« Yanıtla #32 : 07 Ocak 2015, 13:41:58 »
Tavsiyelerin için teşekkürler. Merak etme, buradaki örnekleri bire bir oyun içinde kullanmayı düşünmüyorum. Maksat konsepleri oturtmak. Sensei'lerden tavsiye alırken, çekirgelere ip ucu bırakmak. Başarılı da oluyor. İlk ve son kod örneklerime bakacak olursan, kod yapısı, commentler, label kullanımı vb. bayağı bir fark göreceksin.

Aslında buraya oyun görseliyle ilgili bir mockup koyaibilsem, çok daha basit bir scroll istediğimi gösterebilirdim. Ama oyunu yetiştirmeye çalıştığım partinin kuralları çok katı olduğu için oyunda kullanacağım hiç bir şey paylaşmamaya çalışmıyorum. Scrolla ilgili tek sorun hızı değişken yapmaktı. Onu da en azından kafamda çözdüm. Refmask tekniğiyle halledeceğim.

Gosub ile gidilen yerden goto ile dönen adam