울면서개발하기
KARTORY 개발일지

연습 코스, 카트 꾸미기, 트랙 재설계와 서버가 검증하는 오늘의 도전

· 커밋 10개

한동안 쉬었다가 하루 종일 붙잡은 날이다. 오전에는 처음 온 사람이 덜 헤매게 하는 것과 꾸미는 재미에, 오후에는 다시 하고 싶게 만드는 장치(도전장, 재대결, 오늘의 도전)에 집중했다.

한 일

처음 온 사람을 위해

  • 연습 코스: 출발 → 커브 → 드리프트 → 게이지 → 부스터 → 순간 부스터를 한 단계씩 안내한다. 처음 온 사람에게는 메뉴 첫 버튼이 연습이다
  • 카트 꾸미기: 색 9가지와 장식 3가지. 온라인 명단, 봇, 고스트에도 고른 모양이 그대로 보인다

캐릭터와 트랙

  • 캐릭터 셋을 더했다. 노란 고양이 후드의 꾹꾹이, 연보라 토끼 후드의 바니바니, 개구리 후드에 우비와 우산을 든 왕눈이. 얼굴 조각은 공용으로 빼서 같이 쓴다
  • 캐릭터마다 평소 표정을 따로 줬다(씩 웃음·윙크, (˘ω˘), 반짝 눈과 앞니 등)
  • 네 번째 트랙 노을 해변을 만들고, 가장 어려운 기술 코스로 다시 설계했다. 폭 10m, 반경 약 9m 헤어핀 다섯, 절벽 S자 시케인, 앞이 안 보이는 언덕, 최대 경사 14%
  • 기존 세 트랙도 성격을 나눠 다시 그렸다. 초원은 입문용 고속 코스(1010m), 눈꽃은 지그재그 헤어핀이 이어지는 산길 내리막(1166m), 사탕은 직각 코너가 많은 도심(753m)
  • 트랙이 바뀌어 옛 기록과 비교가 의미 없어졌으니 랭킹을 새 버전으로 비웠다. 옛 기록은 지우지 않고 옆에 남겼다

고스트, 도전장, 재대결

  • 서버가 온라인 스피드전 경로를 기록해 TOP 10 기록에 고스트를 붙인다. 랭킹에서 👻 를 누르면 그 고스트와 혼자 달린다
  • 도전장: 고스트 링크를 복사해 보내면 받은 사람의 메뉴 첫 버튼이 “그 고스트와 달리기” 가 된다
  • 온라인 결과 화면에서 “한 판 더” 를 모두 누르면 바로 다음 판이 시작된다

손맛

  • 벽·부딪힘·아이템에 맞을 때 화면 흔들림, 부스터 시작 때 카메라가 살짝 처지고 시야각이 넓어지는 연출, 가장자리 속도선
  • 운영체제의 “동작 줄이기” 설정을 켠 사람에게는 흔들림을 줄인다
  • 안드로이드에서는 부스터·충돌·카운트다운·완주 때 진동을 준다(메뉴에서 끌 수 있음)
  • 트랙별 배경음 4곡을 코드로 합성했고, 마지막 바퀴에서는 템포를 1.12배로 올린다
  • 대기실과 결과 화면에서 이모지 반응(숫자 키 1~6)을 보낼 수 있다

오늘의 도전

한국 시간 날짜마다 트랙 하나를 정해 두고, 혼자 스피드전으로 달린 기록을 순위에 올린다. 기록과 함께 그 판의 입력 전체를 서버로 보내고, 서버가 같은 물리로 다시 돌려서 나온 결과만 순위와 고스트로 인정한다.

기술 메모

결정적 물리가 검증기가 된다. 첫날부터 물리를 “같은 입력이면 같은 결과” 로 만들어 둔 덕분에, 오늘의 도전 검증은 클라이언트가 보낸 시간을 믿는 대신 입력을 처음부터 다시 재생하는 것으로 끝난다. 다만 완주 직전 입력이 끊긴 경우를 대비해 마지막 키를 몇 초 더 반복해 주는 여유를 두었다. 브라우저 엔진마다 부동소수 계산이 아주 미세하게 다를 수 있어서다.

트랙 재설계와 땅 높이. 노을 해변처럼 높낮이가 큰 트랙에서는 주변 땅이 도로 높이를 따라오지 않아 도로가 떠 보였다. 땅의 높이를 가까운 도로 높이에 맞춰 내리고 올리게 고치고, 절벽 쪽에는 비탈과 바위를 깔았다.

고스트 저장은 보수적으로. 표본이 빠진 고스트는 저장하지 않고, 너무 긴 기록도 받지 않는다. 랭킹 파일을 읽지 못했을 때는 “기록에 없는 고스트 정리” 를 하지 않게 했다. 읽기 실패를 “기록이 없다” 로 착각해 고스트를 다 지우는 일을 막기 위해서다.