Flip’s Little Adventure Part 1: 배경 2018.4.28 UPnL OB Celicath
Mise를 만들어야 하지만 떠오르는 아이디어 목록 관리를 위해 진행하는 것 중 하나 https://docs.google.com
Today Flip’s Little Adventure
Today Flip’s Little Adventure [Part 1: 배경]
Flip’s Little Adventure 게임 설명 Flip이라는 펭귄이 적들을 때려 잡는 게임 시연
배경 지루한 것은 helix로… 계산기 프로그래밍의 역사 이 프로젝트를 하게 된 배경 오래 전에 만든 게임의 리메이크 http://helix.upnl.org/group/10 참고 이 프로젝트를 하게 된 배경 http://helix.upnl.org/95 참고 오래 전에 만든 게임의 리메이크 https://github.com/Celicath/FLA
오늘 할 이야기 개발 환경 스펙, 코딩, 스타일 그림 그리는 방법 계획
개발환경
계산기 스펙 fx-CG50 CPU (32-bit, 116 MHz) RAM (60KB user-accessible) ROM (16MB user-accessible) 384x216 Pixel LCD (https://www.cemetech.net)
스펙 비교 GBA CPU (32-bit, 16.8 MHz) RAM (32KB user-accessible) ROM (없음) 240x160 Pixel LCD (wikipedia)
스펙 비교 GBA보단 좋다. 하지만 컴퓨터나 스마트폰과 비교했을 때 아주 나쁜 스펙 이런 곳에서 개발하는 것도 재미가 있음
개발환경(1) - 개요 C++로 개발(일부 기능은 지원 안됨) 글자 출력하는 API는 있음 뭐가 안되는지 아직 파악 안됨 글자 출력하는 API는 있음 그림은 기본적으로 SetPixel로만 가능
개발환경(2) – Heap? Heap에 버그가 있으니, Stack을 쓰라고 함. new로 할당 하면 계산기를 껐다 켜면 보존이 안 되는 듯?
개발환경(3) – Draw 글자는 그릴 수 있다. 그림은 SetPixel로만. http://prizm.cemetech.net 에 API 정리 일부 설명이 틀린 것도 있으니 주의. 그림은 SetPixel로만.
개발환경(4) – Non-blocking DMA 제공되는 API를 써서 그리면 느리다! 그리는 동안 다른 작업을 할 수 있음. ???? 뭔지 모르겠지만 그냥 써보자. int VRAM_ADDR = (int)GetVRAMAddress(); Bdisp_WriteDDRegister3_bit7(1); Bdisp_DefineDMARange(6, 389, y1, y2); Bdisp_DDRegisterSelect(LCD_GRAM); *(volatile unsigned*)MSTPCR0 &= ~(1 << 21);//Clear bit 21 *DMA0_CHCR_0 &= ~1;//Disable DMA on channel 0 *DMA0_DMAOR = 0;//Disable all DMA *DMA0_SAR_0 = (VRAM_ADDR + (y1 * 384 * 2)) & 0x1FFFFFFF;//Source address is VRAM *DMA0_DAR_0 = LCD_BASE & 0x1FFFFFFF;//Destination is LCD *DMA0_TCR_0 = ((y2 - y1 + 1) * 384) / 16;//Transfer count bytes/32 *DMA0_CHCR_0 = 0x00101400; *DMA0_DMAOR |= 1;//Enable DMA on all channels *DMA0_DMAOR &= ~6;//Clear flags *DMA0_CHCR_0 |= 1;//Enable channel0 DMA 수많은 버그의 근원
개발환경(5) – 에뮬레이터 매번 컴파일해서 계산기로 옮기는게 힘듦 에뮬레이터를 사용하자. 물론 공식은 없으니 비공식으로 만든 것 github.com/tswilliamson/prizm-winsim Fork하고 필요한 기능을 추가하여 사용 여기에도 버그가 다수…
코드 스타일 C# coroutine처럼 개발하자. C++에는 coroutine이 없지만… yield return new WaitForFixedUpdate(); 다음 FixedUpdate까지 대기 C++에는 coroutine이 없지만… gc.update()라는 함수를 만들고 호출 타이머를 통해 적절히 대기하고 그려준다. 프레임스킵도 일어날 수 있음. (구형모델)
그림 그리기
그림 그리기 기본적인 점프 공격 등은 캐릭터의 좌표를 직접 이동한다. 하지만 화려한 효과들은 새로 구현해야 한다. 이미 많이 해봐서 쉬움 하지만 화려한 효과들은 새로 구현해야 한다.
그림그리기 - 스펠 파이어볼 – 원 7개를 그림.
그림그리기 – 스펠(2) 얼음창 얼음창 모양이 날아가도록 구현함 점점 가속해야 함 3차식으로 해야 함 그래도 이상함
그림그리기 – 스펠(3) Art Attack – 만들어야 한다…
계획
계획 단계별로 완성한다. 어딘가에 공개한다. 내가 즐길 정도로 기본 기능 완성 컨텐츠 추가 – 스펠 종류, 난이도 https://www.cemetech.net 계산기 프로그래밍 전문 사이트가 있음
Q&A Thank you