Tehlikeli Dave'de ekranı nasıl hareket ettirdiler?


14

Ben çocukken BASIC'te oyunlar yaptım ve grafiklerin Danimarkalı Dave'in C ++ 'da yaptığı 1988 versiyonunda nasıl yapıldığını merak ettim; özellikle o günlerde değerli grafik paketlerine sahip olmadıkları için. Dave ekranın kenarına ulaştığında, tüm ekran grafiğinin süpürme hareketinde sola hareket ettiğini hatırlıyor musunuz? Romero'nun bunu yapmak için özel bir teknik kullandığını okuduğumu hatırlıyorum. Dave gibi bir şey yaratmak istiyordum ve merak ediyordum

  1. Dave için hangi grafik paketini / yöntemini kullandılar?
  2. ve ekran grafiğinin tamamı nasıl hareket ettirilir?

1
Çocukluğumdan bir hediye olarak hatırladığım tek oyun
Vishnu

Yanıtlar:


19

Dangerous Dave'in 1988 versiyonum Apple II versiyonuydu. Kaydırma, tüm ekran baytlarının üzerine getirilip ekranın kenarına yeni bir karo çizilerek yapıldı - tam ekran kaydırma için 20 kez tekrarlayın. Apple II sürümü 6502 montaj dilinde yazılmıştır.

PC, 1990 sürümünde, o zaman tüm video modları için 80x86 montaj dilinde grafik kodu yazdım: CGA, EGA, VGA. Tehlikeli Dave PC, 3 video modunun da içinde olduğunu ve bir atlama ortasında bile her an değiştirilebilir (F2) olduğunu bildiğim tek oyundur!

Ekranı hızlı bir şekilde kaydırmak için hepsi montaj dilinde yapıldı ve Apple II sürümünde kullandığımla benzer bir teknik kullandım - video belleğindeki baytları hızla taşıyın ve sağ tarafa bir karo çizin. EGA'da daha zorlayıcıydı çünkü EGA modunda hızlı bir şey yapmak için bellek hareketleri için Mandal Modu'nun kullanılması gerekiyordu. Todd Replogle'a bunu nasıl yapacağımı öğrettiğimi hatırlıyorum, böylece Duke Nukem 1 eğlenceli bir oyun olacaktı (yavaş bir Duke Nukem iyi olmazdı).

Tehlikeli Dave PC için oyun kodu C, Borland C 3.0 IDE'de yazılmıştır. Çoğu hata ayıklama, Hercules kartına takılı 12 "amber monitörde Turbo Debugger'da yapıldı.


Vaov! montajda bu video modlarında çalışan birinden bilgi almak için iyi!
Nav

@Nav ehm ... aslında Romero'nun kendisiyle konuşuyorsun :-)
Gianluca Ghettini

@GianlucaGhettini Şey, internette bulunan Romero'nun fotoğrafına sahip bir kullanıcı. John Romero sadece bir soruyu cevaplamak için bir hesap oluşturur mu? Tamamen emin olamıyorum :-) Çok garip, çok uzun bir süre sonra Tehlikeli Dave oynadıktan sadece bir gün sonra yorum yaptı.
Nav

@Nav, buradaki tweet'ine göre: twitter.com/romero/status/679769135681826817 aslında Todd Replogle'a Duken Nukem için EGA'nın düzgün kaydırmayı nasıl yapacağını söyledi, bu da tam olarak bu cevapta belirtti. Onu bilen biri gibi şüphe ediyorum .. :-)
Gianluca Ghettini

Bu makale user42604'ün gerçekten Romero olduğunu teyit eder gamasutra.com/blogs/DavidLightbown/20170223/289955/…
mastazi

13

Ah bu teknikleri DOS günlerimden hatırlıyorum. Kaydırma işlemini gerçekleştirmek için video RAM'ini blitting ile hareket ettirmek sarsıntılı kaydırma ile sonuçlanırdı. EGA, ekran başlangıç ​​noktasını ayarlamak için kullanılabilen dikey ve yatay piksel kaydırma kayıtlarını tanıttı (video belleğinde video kartının veri görüntülemeye başladığı yer). Bellek kopyalaması olmadığından bu neredeyse anında gerçekleşir ve donanım kayıtlarına doğrudan erişiminiz varsa EGA ve VGA'da piksel kaydırma ile çok düzgün ve hızlı piksel için kullanılabilir. DOS'taki çoğu kaydırma çubuğu bunu kullanırdı ve kodun bu kısmı muhtemelen donanım kayıtlarına doğrudan erişmek için derleme dilinde yazılırdı. Bu yöntemler artık gerçekten geçerli değil. Şimdi benzer bir etki elde etmek için, Modern grafik donanımında, muhtemelen her ekranı tüm kareleri yeniden çizerek yeterince hızlı yapabileceğinizi düşünüyorum. Aklıma gelen diğer yöntem ise OpenGL veya DirectX kullanmak ve ekranın iki katı genişlikte bir doku oluşturmak ve taşımaktır. Her nasılsa donanım kayıtlarını manipüle etmek kadar eğlenceli görünmüyor :)


3
"Bir şekilde donanım kayıtlarını manipüle etmek kadar eğlenceli görünmüyor :)" - Doğru :)
Nav

4

Düzenleme: İşte Dr. Dobbs yan kaydırma tartışan bir makale bağlantısı. Bu etki için kullanılan yöntem olabilir.

http://www.drdobbs.com/184408045


Bunun nasıl yapıldığını tam olarak değerlendirmek zordur, ancak bu oyunun çok özel bir donanım belirtimi için yazıldığını düşünün - EGA ekran kartı (640x480 piksel) ile DOS. Kod muhtemelen kaydırma sorunsuz yapmak için video belleği oldukça düşük seviye manipülasyonlar yapıyor.

İşte size nasıl bir fikir verebilecek DOS grafiklerini programlama hakkında konuşan bir web sitesi ...

http://www.phatcode.net/res/224/files/html/index.html


Bu oyun 320x240 video modunu kullanıyor olacaktır.
Skizz

Skizz de bunu düşünüyordum, ancak oyunun 640x400 olan bir EGA çözünürlüğü olan bazı ekran görüntülerini buldum. Oyunun farklı versiyonları vardı ve sanırım ilk olanlar 320x200 idi.
Tim Holt

4

Metagun (Markus aka Notch aka MineCraft guy tarafından geliştirilen oyun) aynı kaydırma hissine sahiptir.

Oyun Açık Kaynak ve Java ile yazılmış.

Umarım koda bakarak öğrenirsiniz.


1
Ve onun oyunu yaparken bir zaman atlaması görmek istiyorsanız: youtube.com/watch?v=ZV-AFnCkRLY
は る と

1
-1, aynı görünse de, aynı yöntemi hiç kullanmıyor.

2
Bunun John Romero'nun 1988'de kullandığı kesin yöntem olmadığının farkındayım. Ancak @Nav benzer bir şey oluşturmak istediğinden, Apple II bilgisayarında Applesoft BASIC kullanarak programlamak için ondan başka bir şey yapmadım. Bağlantı verdiğim kod, belirttiğinizle aynı işi yapıyor.
と る と

Teşekkürler Joe, ama Eibx de alternatif yollar aradığım konusunda haklı.
Nav

2

Bunun iki şekilde yapıldığını düşünebilirim:

  1. Kaba kuvvet: sadece sahneyi çiz
  2. Mode-X ve kaydırma kayıtları. Görünüme kaydırılacak biti çizin ve sahneyi kaydırmak için kaydırma kayıtlarını ayarlayın. Her karenin üst görüntüleme alanını yeniden çizmeniz gerekir, ancak bu ana oynatma alanını çizmekten daha az iştir. Donanımda, video DAC'lerinin belirli bir tarama satırındaki 0 ​​adresinden okunmasına neden olacak bir kayıt olduğu için alt alanı yeniden çizmeniz gerekmez (bu nedenle alt alan video ram ve üst kısmında 0 adresinde olacaktır) alt alandan sonra başlar) * .

Muhtemelen 1 ile giderdim) grafiksel fazla bir şey olmadığı için, kenarlarda görüntüleri kırpmak ve kırpmak için kendi kendine oluşturulmuş bir kod olabilir. Bir meslektaşımın o zamanlar üzerinde çalıştığı olası bir teknik, kendi kendine yazılan spritelardı, yani sprite verileri veri değildi, koddu. Bu, şeffaflık kontrolleri olmadığı ve blitin okunan verilerinin etkili bir şekilde serbest olduğu anlamına geliyordu (bu, her komutun okunduğu ve daha sonra kodun okunması yerine kod çözülmüş bir 386'daydı). > veri yazma). Şaşırtıcı derecede iyi çalıştı - 25fps + 'da çalışan çoklu paralaks katmanlarında çok sayıda büyük sprite var.

Ama burada Romero'dan bahsediyoruz ve teknikler hakkında muhtemelen biraz abartı var.

  • Bunu ilk büyük DOS oyunumda yaptım ve bazı donanımlarda adres sıfırlamanın çok erken bir tarama çizgisi olduğu bir hata var, böylece iki bölüm arasında yarım yükseklikte bir pikseliniz olacak.
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.