2011년 10월 31일 월요일

ASO remake #9 - 레이저, 미사일 업그레이드

ASO에서 지상에서 움직이는 유닛이 몇종류가 있는데, 그 중 하나가 추가되었습니다.

SW 스프라이트를 이용하기 때문에, 풀컬러로 움직이는 모습을 볼수 있겠습니다.

참고로 공중 유닛은 HW 스프라이트라서 3색 정도만 표현가능합니다요...

공중유닛도 2가지가 추가되었습니다. (스프라이트 그리느라 힘들었어요. ㅎ.ㅎㅋ)



2011년 10월 24일 월요일

ASO remake #8 - SW 스프라이트

사실, ASO 리메이크를 시작하면서 SW 스프라이트를 계획했었습니다.

느리게 움직이는 지상 유닛들은 가능하면 비트맵의 깔끔한 그래픽으로 보여주고 싶었지용... ㅎ.ㅎ

 

이걸 지난 주말에서야 구현해서 테스트를 해보았는데요.

60프레임으로 진행되는 게임에서 유닛 여러개 그려넣는데 부하가 심하네요. ㅎ.ㅎ

 

근데, 원본 게임을 자세히 보니, 지상 유닛이 2프레임에 1도트 움직이고 있더군요.

홀짝 프레임에 맞춰서 유닛들은 반반 나눠 처리하면 VDP 부하를 줄일수 있었지요. ㅋ

 

움직이는 지상 유닛 없을때, CPU IDLE 구간을 보면...

 

1. 공중 유닛이 없을때: 약 40%

2. 공중 유닛이 있을때: 약 30%

정도 됩니다. 

 

이 상태에서, 지상 유닛이 5개 정도 등장하면 거의 IDLE 구간이 0%가 되네요.

겨우 ASO 가 구현될만한 수준이었습니다. 흐...

 

 

여기서 ASO에서 구현된 지상군 SW 스프라이트는 아래 처럼 처리됩니다.

 

기본적으로 배경 화면은 스크린5의 페이지 한장에 그려지고,

그려진 배경을 다시 복구(유닛으로 덧칠된 부분 복구)하기 위해 다른 페이지 하나에 깨끗한 배경 화면이 또 있습니다.

 

실제 ASO에서는 페이지1이 보여주는 화면이 되고, 페이지2가 원본 배경 화면입니다.

참고로 페이지0 에는 스프라이트 패턴이랑 STATUS 창(에너지 미터 등등)이 그려지고,

페이지3은 배경 화면용 맵 타일 그래픽이 존재합니다.

 

 

원래 SW 스프라이트는 원본 배경에 유닛 비트맵을 덮어 씌우게 되는데,

이때 원본 배경이 복구 된 후 유닛 비트맵이 그려지는 순간이 순차적으로 보이게 되면

유닛이 깜박이는 것 처럼 보이게 됩니다.

 

이걸 해결하려면,

1. 배경 전체를 더블 버퍼링.

2. 유닛이 다시 그려질 부분만 다른 페이지에 미리 그린 후, 복구될 배경과 함께 원본 배경에 덮어 그려줌.

3. VDP에서 현재 출력 스캔라인과 유닛 그려질 라인이 만나지 않도록 조절해서 처리.

하면 됩니다.

 

근데 60프레임 슈팅겜에서 전체 더블 버퍼링은 속도상 불가능하겠고요.

(ASO에서 지상 유닛은 30프레임 업데이트이긴 하지만, 이것도 힘들겠지요. ㅋ)

 

VDP의 출력 스캔라인을 비켜 가려면,

 그려질 비트맵의 수직 위치랑 현재 스캔라인 간 차이가 많이 나도록 하면 됩니다.

 V-blank 구간에서 비트맵을 그리면 가장 안전하지만, 짧은 구간에 많이 그리진 못하겠지요.

 

참고로, V-blank 구간은 아래처럼 됩니다. (ASO는 60Hz 오버스캔 240라인 모드입니다. )

 

V sync 60Hz 출력일때 

 수직 192 해상도 V-blank 구간: 262 - 192 = 70 라인

 수직 212 해상도 V-blank 구간: 262 - 212 = 50 라인

 오버스캔 모드의 V-blank 구간: 262 - 240 = 22 라인

 

V sync 50Hz 출력일때 

 수직 192 해상도 V-blank 구간: 312 - 192 = 120 라인

 수직 212 해상도 V-blank 구간: 312 - 212 = 100 라인

 오버스캔 모드의 V-blank 구간: 312 - 240 = 72 라인

 

여담이지만, 25프레임 등의 애니메이션을 구현한다면 50Hz 모드가 훨씬 여유가 있다는걸 볼수 있어요.

(더블 버퍼링을 안하는 경우에 한해서...ㅎ.ㅎㅋ)

 

 

그럼, ASO에서는 어떻게 할까요?

 

처음엔 2번의 배경과 유닛 비트맵을 미리 계산(페이지 0 활용)해서 그려보았는데,

비트맵 세번 복사 하는데 시간이 꽤 걸려서 사용이 힘들더군요.

1. 별도 페이지에 원본 배경 복사 (복구될 영역과 유닛 이동 후의 영역만큼 18 x 18 사이즈)

2. VDP의 논리연산 COPY를 써서 배경에 유닛을 덮어씌움 (투명색은 배경이 그대로 보이겠죠?)

3. 완성된 비트맵을 실제 배경 페이지에 복사

 

최종으론, 3번 방법처럼 적절하게 VDP의 스캔라인과 그리는 부분이 겹치지 않게 처리하고 있습니다.

이 경우는 비트맵 두번만 복사하면 되서 1.5배 빠릅니다.

1. 원본 배경을 원본 페이지에 바로 복사(복구)

2. 새로운 위치에 유닛 비트맵 논리연산 COPY

 

지상 유닛은 한 프레임 처리에서 가장 마지막에 이루어집니다.

VDP의 라인인터럽트를 이용해서 스캔라인이 화면 아래쪽에 도달하면, 게임의 한프레임 처리가 시작되는데요.

이것 저것 다 끝내면, 스캔라인이 화면 중앙정도에 옵니다. 남은 CPU 시간이 반정도 남은거지요.

 

이때 지상 유닛을 처리하면서 화면에 다시 그리게 되면,

화면 아래쪽에 나타나는 경우가 아니라면, 눈으로 깜박임을 느낄수 없게 됩니다.

 

글로만 쓰니까, 잘 이해안되실수도 있겠습니다. ㅎ.ㅎ;;

 

암튼, 실제 구현해보니, 지상 유닛이 화면 하단 1/3 정도에선 깜빡이지만, 전체적으로 쓸만했습니다.

뻥 좀 보태면, 거의 원본 ASO의 유닛 움직임과 흡사합니다. ㅋ 

 

유닛의 수직 위치를 소팅해서 스캐라인과 잘 어긋나도록 그리면, 깜박이는 경계선을 더 낮출 수 있을 것 같네요.

이번 주중에 완료해서 동영상으로 보여드리겠습니다~

 

가능하면, 중간 보스도 등장 할 예정...


2011년 10월 17일 월요일

ASO remake #7 - 데모 디스크

이제 어느정도 ASO 스러운 화면이 나오게 되었습니다. ㅎ.ㅎ


MSXturboR GT (또는 램512확장된 ST)에서 실행 가능하며, blueMSX 등의 에뮬에서도 실행 가능합니다.

MSX-AUDIO 또는 MoonSound/DalSoRi 카드가 있으면 사운드를 들을 수 있습니다.


실행은 DOS2 상에서,

ASO /M 또는 ASO /A 등으로 실행하면 되겠습니다.

옵션의 /M은 MoonSound, /A는 MSX-AUDIO, /N은 NO-AUDIO 입니다.


아래의 파일을 받으시면 됩니다.

디스크 이미지 파일은 DOS2 부팅 및 ASO /M 으로 시작되도록 만들어놨습니다. blueMSX 등으로 바로 실행가능.


ASO_20111017_test_7.zip

ASO_20111017_test_7_DSK.zip


아래는 blueMSX에서 구동해본 모습입니다.




아래는 제 터보알, MoonSound 로 구동되는 영상입니다.



참고로, 옵션에 /I 를 추가하면 게임 화면 좌/우 테두리에 CPU idle time 표시기가 등장합니다. ㅋ

파란/빨간 막대가 길수록 CPU 여유가 있는 상태를 나타냅니다.


아래는 제 실기에서 동작되는 모습니다.






적 유닛 및 총알이 많아질수록 CPU가 바빠지는걸 볼수가 있어요.

아머 및 보스 처리 외에는 게임 기본적인 부분이 구현된 상태라, 크게 CPU 부하가 늘어날 것 같지는 않습니다.

버벅된다면, 어셈 노가다를 해야겠지요. ㅎ.ㅎㅋ


2011년 10월 3일 월요일

ASO remake #6 - 공중 유닛 처리

잠시 작업을 놓고 있다가, 연휴를 타서 좀 달려보았습니다~ ㅋ


이전 Test 5 에서 공중 유닛을 추가해봤습니다.

ASO 에서 맨처음 등장하게 되는 동그란 모양의 비행체인데욤.

빠르게 휘리릭~ 날아다니는 특징(?)이 있습지요. ㅎ.ㅎ;


기본적인 총알 및 기체간 충돌 처리도 넣고, 폭발 스프라이트도 대강 그려넣었습니다.


실기(터보알 GT 또는 램512 확장된 ST)에서 실행해보시려면, 파라동 게시판에서 테스트 파일을 받으시면 되겠습니다.

믈론 blueMSX에서도 실행가능합니다.

사운드는 문사운드(또는 달소리)로 출력됩니다.

사용키: 커서키, Z,X,C,스페이스, ESC, 숫자패드(기체 파워업 테스트용)


아래는 제 터보알에서 구동되는 모습입니다.

참고로 공중 유닛은 초당 60프레임으로 처리됩니다.

영상 뒷부분에는 움직임 패턴 데이터를 넣어보았습니다~ ㅎ.ㅎ




움직임 패턴(route) 에디터의 동작모습도 찍어보았습니다~