พวกเขาย้ายจอใน Dangerous Dave ได้อย่างไร


14

ฉันได้สร้างเกมใน BASIC เมื่อฉันยังเป็นเด็กและฉันอยากรู้ว่ากราฟิกถูกสร้างขึ้นใน Dangerous Dave รุ่น 1988 ใน C ++ ได้อย่างไร โดยเฉพาะอย่างยิ่งเพราะพวกเขาไม่มีแพ็คเกจกราฟิกที่คุ้มค่าในสมัยนั้น จำได้ไหมว่าเมื่อเดฟมาถึงขอบของหน้าจอกราฟิกหน้าจอทั้งหมดที่ใช้ในการเลื่อนไปทางซ้ายในลักษณะการกวาด ฉันจำได้ว่าการอ่าน Romero ใช้เทคนิคพิเศษในการทำเช่นนั้น ฉันต้องการที่จะสร้างบางสิ่งบางอย่างเช่นเดฟและสงสัย

  1. กราฟิก / แพคเกจใดบ้างที่ใช้สำหรับเดฟ
  2. และวิธีการย้ายกราฟิกหน้าจอทั้งหมดเหมือนที่พวกเขาทำ?

1
เป็นเกมหนึ่งที่ฉันจำได้ว่าเป็นของขวัญจากวัยเด็กของฉัน
วิษณุ

สำหรับวิดีโอของเกมนี้ที่ใช้งานเพื่อดูเอฟเฟกต์การเลื่อน Nav กำลังพูดถึงดูที่dosgamesarchive.com/download/dangerous-dave
Tim Holt

คำตอบ:


18

Dangerous Dave เวอร์ชัน 1988 ของฉันเป็นรุ่น Apple II การเลื่อนทำได้โดยการย้ายหน้าจอทั้งหมดไปตามทางแล้ววาดไทล์ใหม่ที่ขอบของหน้าจอ - ทำซ้ำ 20 ครั้งสำหรับการเปลี่ยนแบบเต็มหน้าจอ รุ่น Apple II เขียนด้วยภาษาแอสเซมบลี 6502 ทั้งหมด

บนพีซีรุ่น 1990 ฉันเขียนโค้ดกราฟิกในภาษาแอสเซมบลี 80x86 สำหรับโหมดวิดีโอทั้งหมดในเวลานั้น: CGA, EGA, VGA Dangerous Dave PC เป็นเกมเดียวที่ฉันรู้ว่ามีโหมดวิดีโอทั้งหมด 3 โหมดและสามารถสลับได้ตลอดเวลา (F2) แม้ในช่วงกลางของการกระโดด!

ในการเลื่อนหน้าจออย่างรวดเร็วทุกอย่างเป็นภาษาแอสเซมบลีและฉันใช้เทคนิคที่คล้ายกันกับที่ฉันใช้กับเวอร์ชัน Apple II - ย้ายไบท์ในหน่วยความจำวิดีโออย่างรวดเร็วและวาดไทล์ทางด้านขวา ใน EGA มันยากกว่าเพราะจะทำอะไรอย่างรวดเร็วในโหมด EGA ต้องใช้โหมด Latch สำหรับการย้ายหน่วยความจำ ฉันจำได้ว่าการสอนทอดด์ Replogle วิธีการทำเช่นนั้น Duke Nukem 1 จะเป็นเกมที่สนุก (การ Duke ที่ช้า Nukem จะไม่เจ๋ง)

รหัสเกมของ Dangerous Dave PC ถูกเขียนเป็น C ใน Borland C 3.0 IDE การดีบักส่วนใหญ่เกิดขึ้นใน Turbo Debugger บนมอนิเตอร์อำพันขนาด 12 นิ้วที่เสียบเข้ากับการ์ด Hercules


ว้าว! ดีที่จะได้รับข้อมูลจากคนที่ทำงานจริงในโหมดวิดีโอเหล่านั้นในการชุมนุม!
Nav

@Nav ehm ... คุณกำลังพูดถึง Romero เอง :-)
Gianluca Ghettini

@GianlucaGhettini ดีมันเป็นผู้ใช้ที่มีรูปถ่ายของ Romero ที่มีอยู่บนอินเทอร์เน็ต John Romero จะสร้างบัญชีเพื่อตอบคำถามเดียวหรือไม่ ไม่แน่ใจทั้งหมด :-) มันค่อนข้างแปลกที่คุณแสดงความคิดเห็นเพียงหนึ่งวันหลังจากที่ฉันเล่น Dangerous Dave หลังจากเวลานานมาก
Nav

@Nav ตามทวีตของเขาที่นี่: twitter.com/romero/status/679769135681826817เขาบอก Todd Replogle ว่าทำอย่างไร EGA การเลื่อนที่ราบรื่นสำหรับ Duken Nukem ซึ่งเป็นสิ่งที่เขาระบุไว้ในคำตอบนี้ ฉันสงสัยคนที่ทำท่าจะให้เขารู้เกี่ยวกับมัน .. :-)
Gianluca Ghettini

บทความนี้ยืนยันว่าผู้ใช้ 42604 เป็น Romero gamasutra.com/blogs/DavidLightbown/20170223/289955/?hl=th
mastazi

13

ฉันจำเทคนิคเหล่านี้ได้ตั้งแต่สมัยดอส การย้ายหน่วยความจำวิดีโอไปรอบ ๆ พร้อมกับการตัดเพื่อทำการเลื่อนจะส่งผลให้การเลื่อนกระตุก EGA แนะนำการลงทะเบียนการแพนกล้องพิกเซลในแนวตั้งและแนวนอนซึ่งสามารถใช้ในการตั้งค่าจุดเริ่มต้นของหน้าจอได้ เนื่องจากไม่มีการคัดลอกหน่วยความจำเกิดขึ้นนี่เป็นเกือบจะทันทีและสามารถใช้สำหรับพิกเซลที่ราบรื่นและรวดเร็วโดยการเลื่อนพิกเซลบน EGA และ VGA หากคุณมีการเข้าถึงโดยตรงกับการลงทะเบียนฮาร์ดแวร์ ตัวเลื่อนส่วนใหญ่ใน DOS จะใช้สิ่งนี้และส่วนหนึ่งของรหัสนี้อาจถูกเขียนด้วยภาษาแอสเซมบลีเพื่อเข้าถึงรีจิสเตอร์ฮาร์ดแวร์โดยตรง แม้ว่าวิธีการเหล่านี้จะไม่สามารถใช้งานได้จริงอีกต่อไป เพื่อให้บรรลุผลที่คล้ายกันตอนนี้ ฉันคิดว่าในฮาร์ดแวร์กราฟิกที่ทันสมัยคุณอาจจะทำได้เร็วพอเพียงแค่วาดภาพทั้งหน้าจอใหม่ในแต่ละเฟรม วิธีอื่นที่ฉันนึกได้คือใช้ OpenGL หรือ DirectX และแสดงพื้นผิวให้กว้างเป็นสองเท่าของความกว้างของหน้าจอ อย่างใดมันก็ไม่สนุกเหมือนการจัดการกับการลงทะเบียนฮาร์ดแวร์ :)


3
"อย่างใดมันก็ดูไม่สนุกเท่าการจัดการกับการลงทะเบียนฮาร์ดแวร์ :)" - จริง :)
Nav

4

แก้ไข: นี่คือลิงค์ไปยังบทความจาก Dr. Dobbs ที่กล่าวถึงการเลื่อนด้านข้าง อาจเป็นวิธีที่ใช้สำหรับเอฟเฟกต์นี้

http://www.drdobbs.com/184408045


เป็นการยากที่จะตัดสินว่ามันเสร็จอย่างไร แต่พิจารณาว่าเกมนี้เขียนขึ้นสำหรับสเปคฮาร์ดแวร์ที่เฉพาะเจาะจงมาก - ดอสพร้อมการ์ดแสดงผล EGA (640x480 พิกเซล) รหัสอาจใช้การปรับแต่งในระดับที่ค่อนข้างต่ำของหน่วยความจำวิดีโอเพื่อให้การเลื่อนเกิดขึ้นอย่างราบรื่น

นี่คือเว็บไซต์ที่พูดถึงการเขียนโปรแกรมกราฟิก DOS ที่อาจให้ความรู้สึกว่ามันเป็นอย่างไร ...

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


เกมนี้จะใช้โหมดวิดีโอ 320x240
Skizz

Skizz ฉันก็คิดเช่นนั้น แต่ฉันพบภาพหน้าจอของเกมที่มีความละเอียด 640x400 - ความละเอียด EGA มีเกมเวอร์ชั่นต่าง ๆ และฉันเดาว่าเกมแรกนั้นมีขนาด 320x200
ทิมโฮลท์

4

Metagun (เกมที่พัฒนาโดย Markus aka Notch aka MineCraft guy) มีความรู้สึกในการเลื่อนแบบเดียวกับที่คุณกำลังมองหา

เกมดังกล่าวเป็นโอเพ่นซอร์สและเขียนเป็นภาษาจาวา

หวังว่าคุณจะเรียนรู้จากการดูรหัส


1
และในกรณีที่คุณต้องการเห็นเวลาที่กำหนดในการสร้างเกม: youtube.com/watch?v=ZV-AFnCkRLY
はると

1
-1 แม้ว่ามันจะดูเหมือนกัน แต่ก็ไม่ได้ใช้วิธีการเดียวกันทั้งหมดอย่างชัดเจน

2
ฉันรู้ว่านี่ไม่ใช่วิธีที่แน่นอนที่ John Romero ใช้ในปี 1988 แต่เนื่องจาก @Nav ต้องการสร้างสิ่งที่คล้ายกันฉันไม่ได้ยกเว้นเขาที่จะเขียนโปรแกรมโดยใช้ Applesoft BASIC บนคอมพิวเตอร์ Apple II รหัสที่ฉันเชื่อมโยงทำให้งานเดียวกันเสร็จอย่างชัดเจนตามที่คุณเห็น
はると

ขอบคุณ Joe แต่ Eibx นั้นถูกต้องที่ฉันกำลังมองหาวิธีอื่นเช่นกัน
Nav

2

ฉันคิดได้สองวิธีนี้ได้ทำ:

  1. กำลังดุร้าย: เพียงแค่วาดฉาก
  2. การลงทะเบียน Mode-X และการแพนกล้อง วาดบิตเพื่อเลื่อนไปยังมุมมองและปรับรีจิสเตอร์ปรากฎว่าต้องการเลื่อนฉาก คุณจะต้องวาดพื้นที่แสดงผลยอดนิยมใหม่ในแต่ละเฟรม แต่นั่นก็เป็นงานที่ต้องทำน้อยกว่าการวาดพื้นที่เล่นหลัก คุณไม่จำเป็นต้องวาดพื้นที่ด้านล่างเนื่องจากมีการลงทะเบียนในฮาร์ดแวร์ที่จะทำให้วิดีโอ DACs อ่านจากที่อยู่ 0 ที่บรรทัดสแกนที่กำหนด จะเริ่มต้นหลังจากพื้นที่ด้านล่าง) *

ฉันอาจจะไปกับ 1) เนื่องจากมีกราฟิกไม่มากเกิดขึ้นอาจมีโค้ดบางอย่างที่สร้างขึ้นเองเพื่อลบล้างและตัดภาพที่ขอบ เทคนิคหนึ่งที่เป็นไปได้ที่เพื่อนร่วมงานของฉันกำลังทำอยู่ตอนนั้นก็คือสไปรท์การเขียนด้วยตนเองนั่นคือข้อมูลสไปรท์ไม่ใช่ข้อมูลมันเป็นรหัส นี่หมายความว่าไม่มีการตรวจสอบความโปร่งใสและการอ่านข้อมูลของ blit นั้นฟรีอย่างมีประสิทธิภาพ (นี่คือ 386 ซึ่งแต่ละคำสั่งถูกอ่านแล้วถอดรหัสดังนั้นแทนที่จะอ่านรหัส -> อ่านข้อมูล -> เขียนข้อมูลมันเพิ่งอ่านโค้ด - > เขียนข้อมูล) มันทำงานได้ดีอย่างน่าอัศจรรย์ - เรามีสไปรต์ขนาดใหญ่จำนวนมากบนเลเยอร์ Parallax หลายชั้นที่ทำงานที่ 25fps +

แต่เรากำลังพูดถึงโรเมโรที่นี่และอาจจะมีความตื่นเต้นเกิดขึ้นเกี่ยวกับเทคนิค

  • จริง ๆ แล้วฉันทำสิ่งนี้ในเกม DOS เกมแรกที่สำคัญและมีข้อบกพร่องในฮาร์ดแวร์บางอย่างที่การรีเซ็ตที่อยู่เกิดสแกนไลน์เร็วเกินไปดังนั้นคุณจะมีพิกเซลครึ่งความสูงระหว่างสองส่วน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.