Dangerous Dave에서 화면을 어떻게 이동 시켰습니까?


14

저는 어렸을 때 BASIC에서 게임을 만들었고 C ++로 만든 1988 년 Dangerous Dave 버전에서 그래픽이 어떻게 수행되는지 궁금했습니다. 특히 당시에는 가치있는 그래픽 패키지가 없었기 때문입니다. Dave가 화면의 가장자리에 도달했을 때 전체 화면 그래픽이 스위핑 동작에서 왼쪽으로 이동하는 데 사용 된 방법을 기억하십니까? Romero가 특별한 기술을 사용하여 읽은 것을 기억합니다. Dave와 같은 것을 만들고 싶었고 궁금했습니다.

  1. 그들이 Dave에 사용한 그래픽 패키지 / 방법은 무엇입니까?
  2. 전체 화면 그래픽을 원래처럼 움직이게하는 방법은 무엇입니까?

1
어린 시절부터 선물로 회상하는 게임 하나
Vishnu

탐색에 대해 이야기 스크롤 효과를 볼 수있는 행동이 게임의 영상을 참조 dosgamesarchive.com/download/dangerous-dave
팀 홀트에게

답변:


18

Dangerous Dave의 1988 버전은 Apple II 버전이었습니다. 스크롤은 모든 화면 바이트를 이동 한 다음 화면 가장자리에 새 타일을 그려서 수행했습니다. 전체 화면 이동을 위해 20 번 반복합니다. Apple II 버전은 모두 6502 어셈블리 언어로 작성되었습니다.

1990 년판 PC에서 당시의 모든 비디오 모드 (CGA, EGA, VGA)에 대해 80x86 어셈블리 언어로 그래픽 코드를 작성했습니다. Dangerous Dave PC는 내가 아는 유일한 게임으로 3 개의 비디오 모드가 모두 있으며 점프 도중에도 언제든지 전환 할 수 있습니다 (F2)!

화면을 빠르게 스크롤하려면 모두 어셈블리 언어로되어 있었고 Apple II 버전에서 사용했던 것과 유사한 기술을 사용했습니다. 비디오 메모리에서 바이트를 빠르게 이동하고 오른쪽에 타일을 그립니다. EGA에서는 EGA 모드에서 빠르게 작업을 수행하려면 메모리 이동에 래치 모드를 사용해야했기 때문에 까다로 웠습니다. Todd Replogle에게 그렇게하는 방법을 가르쳐서 Duke Nukem 1은 재미있는 게임이 될 것입니다 (느린 Duke Nukem은 시원하지 않았을 것입니다).

Dangerous Dave PC의 게임 코드는 C의 Borland C 3.0 IDE에서 작성되었습니다. 대부분의 디버깅은 Hercules 카드에 연결된 12 인치 앰버 모니터의 Turbo Debugger에서 수행되었습니다.


와! 실제로 비디오 모드에서 작업 한 사람에게서 정보를 얻는 것이 좋습니다!
Nav

@Nav ehm ... 당신은 실제로 Romero 자신과 이야기하고 있습니다 :-)
Gianluca Ghettini

@GianlucaGhettini 글쎄, 그것은 인터넷에서 사용할 수있는 Romero의 사진을 가진 사용자입니다. John Romero가 하나의 질문에 대답하기 위해 계정을 만들까요? 완전히 확신 할 수는 없습니다 :-) 매우 위험한 일이지만, Dangerous Dave를 아주 오랜 시간 보낸 후 단 하루 만에 댓글을 달았습니다.
Nav

@Nav 그의 트윗에 따르면 : twitter.com/romero/status/679769135681826817 그는 실제로 Todd Replogle에게 Duken Nukem에 대해 EGA 부드러운 스크롤링을 수행하는 방법을 알려주었습니다. 나는 그를 척하는 누군가가 그것에 대해 알고 의심합니다 .. :-)
Gianluca Ghettini


13

아 DOS 시절부터이 기술들을 기억합니다. 스크롤링을 수행하기 위해 블리 팅과 함께 비디오 RAM을 이동 시키면 스크롤이 끊어 질 수 있습니다. EGA는 비디오 메모리에서 비디오 카드의 데이터 표시를 시작한 화면 원점을 설정하는 데 사용할 수있는 수직 및 수평 픽셀 패닝 레지스터를 도입했습니다. 진행중인 메모리 복사가 없기 때문에 이것은 거의 즉각적이며 하드웨어 레지스터에 직접 액세스 할 수있는 경우 EGA 및 VGA에서 픽셀 스크롤로 매우 부드럽고 빠른 픽셀을 위해 사용될 수 있습니다. DOS의 대부분의 스크롤러는 이것을 사용했을 것이며,이 코드 부분은 아마도 하드웨어 레지스터에 직접 액세스하기 위해 어셈블리 언어로 작성되었을 것입니다. 이 방법은 더 이상 유효하지 않습니다. 이제 비슷한 효과를 얻으려면 현대 그래픽 하드웨어에서는 매 프레임마다 전체 화면을 다시 그리는 것만으로도 빨리 할 수 ​​있다고 생각합니다. 내가 생각할 수있는 다른 방법은 OpenGL 또는 DirectX를 사용하고 화면 너비의 두 배로 텍스처를 렌더링하고 이동시키는 것입니다. 어떻게 든 하드웨어 레지스터를 조작하는 것만 큼 재미없는 것 같습니다 :)


3
"어떻게해도 하드웨어 레지스터를 조작하는 것만 큼 재미 있지 않은 것 같습니다 :)"-True :)
Nav

4

편집 : 다음은 Dr. Dobbs의 기사에 대한 링크로 옆 스크롤에 대해 설명합니다. 이 효과에 사용 된 방법 일 수 있습니다.

http://www.drdobbs.com/184408045


이 작업이 어떻게 수행되었는지 정확하게 판단하기는 어렵지만이 게임은 매우 구체적인 하드웨어 사양 인 EGA 비디오 카드 (640x480 픽셀)가 장착 된 DOS 용으로 작성된 것입니다. 코드는 아마도 스크롤을 원활하게 수행하기 위해 비디오 메모리를 약간 낮은 수준으로 조작하고있을 것입니다.

다음은 DOS 그래픽 프로그래밍에 대해 설명하는 웹 사이트입니다.

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


이 게임은 320x240 비디오 모드를 사용합니다.
Skizz

Skizz 나도 그렇게 생각하고 있었지만 EGA 해상도 인 640x400의 게임 스크린 샷을 발견했습니다. 다른 버전의 게임이 있었고 초기 버전은 320x200이라고 생각합니다.
Tim Holt

4

Metagun (Markus aka Notch aka MineCraft guy에 의해 개발 된 게임)은 당신이 찾고있는 것과 같은 스크롤 느낌을 가지고 있습니다.

이 게임은 오픈 소스이며 Java로 작성되었습니다.

코드를 보면서 배울 수 있기를 바랍니다.


1
그리고 당신이 게임의 시간 경과를보고 싶다면 : youtube.com/watch?v=ZV-AFnCkRLY
は る と

1
-1, 비록 똑같아 보이지만 분명히 같은 방법을 전혀 사용하지 않습니다.

2
나는 이것이 John Romero가 1988 년에 사용한 정확한 방법이 아니라는 것을 알고 있습니다. 그러나 @Nav는 비슷한 것을 만들고 싶었 기 때문에 Apple II 컴퓨터에서 Applesoft BASIC을 사용하여 프로그래밍하는 것을 제외하고는하지 않았습니다. 내가 링크 한 코드는 지적한 것과 똑같은 일을 분명히합니다.
は る と

고마워 조, 그러나 Eibx는 내가 다른 방법을 찾고 있다는 것이 옳다.
Nav

2

나는 이것이 두 가지 방법으로 생각할 수 있습니다.

  1. 무차별 대입 : 그냥 장면을 그려
  2. Mode-X 및 패닝 레지스터. 화면에 스크롤 될 비트를 그리고 장면을 스크롤하도록 패닝 레지스터를 조정하십시오. 각 프레임마다 상단 표시 영역을 다시 그려야하지만 주 재생 영역을 그리는 것보다 작업이 적습니다. 하드웨어에 레지스터가있어 비디오 DAC가 지정된 스캔 라인의 주소 0에서 읽히도록 하단 영역을 다시 그릴 필요가 없습니다 (따라서 하단 영역은 비디오 램의 주소 0과 상단에 있음) 하단 영역 이후에 시작됩니다) * .

그래픽으로 진행되는 것이 많지 않기 때문에 1)로 갈 것입니다. 가장자리에 이미지를 블리 팅하고 클리핑하는 자체 생성 코드가있을 수 있습니다. 내 동료가 그 당시 작업했던 가능한 기술 중 하나는 자체 작성 스프라이트, 즉 스프라이트 데이터는 데이터가 아니라 코드였습니다. 이것은 투명성 검사가 없었고 블리트의 데이터 읽기가 효과적으로 자유로웠다는 것을 의미했습니다. (각 명령을 읽은 다음 386에서 읽은 다음 코드 읽기> 데이터 읽기> 데이터 쓰기 대신 읽기 코드였습니다. > 데이터 쓰기). 놀랍게 잘 작동했습니다. 25fps 이상에서 실행되는 여러 시차 레이어에 수많은 스프라이트가 있습니다.

그러나 우리는 여기서 Romero에 대해 이야기하고 있으며 아마도 기술에 대해 약간의 격변이있을 것입니다.

  • 실제로 첫 번째 주요 DOS 게임 에서이 작업을 수행했으며 일부 하드웨어에는 주소 재설정이 너무 빨리 스캔 라인이 발생하여 두 섹션 사이에 절반 높이의 픽셀이있는 버그가 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.