이 글은 Today I Learn 시리즈의 64번째 기록입니다. (총 125개)

색을 안 건드리고 정보를 더하기

튜닝할 수치는 이름을 붙여 한 곳에 둔다

플레이하면서 색이 구분이 안 되는 게 계속 걸렸다. 팔레트는 이미 손봤으니 이번엔 색을 더 건드리지 않기로 했다.

아직 안 채운 칸은 원래 색을 크림색과 섞어 흐리게 깔린다. 그 비율이 원색을 20%만 남기는 값이라 색이 죽어 있었다. 절반까지 올리니 무슨 색을 부어야 하는지 읽혔다.

이런 값은 눈으로 보며 맞춰야 해서, 코드 속에 숫자로 박지 않고 이름을 붙여 한 곳에 뒀다. 이후 조정은 그 숫자만 바꾼다.

  • 눈으로 맞춰야 하는 값은 반드시 이름을 붙여 꺼내 둔다. 그래야 조정이 코드 수정이 아니라 값 바꾸기가 된다
  • 색이 안 보인다는 말에 색을 바꾸는 것 말고도 답이 있다. 무엇이 그 색을 죽이고 있는지 먼저 본다

어디까지 채웠는지가 안 보인다는 말

테스트해 준 사람에게서 나온 말이다. 부어도 어디까지 찼는지 모르겠다는 것.

듣고 보니 채운 부분과 안 채운 부분이 색 농도로만 갈리고 있었다. 경계에 얇은 어두운 선을 넣으니 그제야 지금까지 얼마나 채웠는지가 한눈에 들어왔다.

  • 만든 사람은 어디까지 찼는지 안다. 처음 보는 사람이 그걸 알 수 있는지는 물어봐야 안다
  • 진행 상황은 숫자보다 경계로 보여 주는 편이 빠르다

정보는 그것이 쓰이는 자리에 놓는다

지금 바로 모래가 앉을 칸을 원색에 가깝게 은은히 깜빡이게 했다. 그 칸들의 색이 곧 “지금 부을 수 있는 색”이다.

화면 위쪽에 색 점으로 같은 정보를 이미 주고 있었는데, 캔버스 위에서 깜빡이니 훨씬 빨리 읽혔다. 같은 정보라도 쓰는 자리에 있으면 눈이 옮겨 갈 일이 없다.

  • 정보를 어디에 놓을지는 무엇을 보여 줄지만큼 중요하다. 판단하는 자리에서 멀면 있어도 안 쓴다

에셋에 맞출 때

그림에 색을 곱해 입히면 원색이 안 나온다

엎어 둔 통이 보드의 모래색과 다른 색으로 보였다. 그림에 색을 곱해 입히는 방식이라, 원본의 크림색 질감과 음영이 그대로 곱해져 순수한 원색이 안 나온다.

열린 통은 안에 순수한 색 원반이 보여서 기준색이 살아 있는데, 엎으면 그게 사라진다. 엎은 통 뚜껑에도 같은 색 원반을 얹어 기준을 만들었다.

  • 색을 정확히 보여 줘야 하는 자리에는 계산으로 만든 색 말고 순수한 색을 하나 둔다
  • 그림에 색을 입히는 방식은 톤을 맞추는 데는 좋고 색을 알려 주는 데는 부족하다

대충 가운데가 아니라 재서 맞춘다

원반을 타일 정중앙에 정원으로 놓으니 떠 보였다. 그림을 직접 열어 보니 통 바닥면은 정중앙이 아니라 위에서 27% 지점에 있고, 정원이 아니라 가로로 넓적한 타원이었다.

그 값대로 맞추니 뚜껑에 앉았다.

  • 그림 위에 무언가를 겹칠 때는 그림을 열어 실제 위치와 모양을 잰다. 가운데일 것 같다는 짐작이 제일 자주 틀린다

선보다 면이 강한 신호다

꺼낼 수 있는 칸을 테두리 빛으로 표시했는데, 테스트해 준 사람이 약하다고 했다. 바닥 면 자체를 밝게 바꾸니 확실해졌다.

  • 강조를 올릴 때 선을 굵게 하는 것보다 면을 바꾸는 쪽이 크다. 선은 장식으로 읽히고 면은 상태로 읽힌다

출시에서 빠져야 할 것

잊어도 안 새게 두 겹으로 막는다

지나간 레벨을 다시 하는 기능은 개발용이라 출시 때 반드시 빠져야 한다. 지우는 걸 잊을 수 있으니 두 겹으로 막았다. 출시 빌드에서는 설정 화면에 아예 안 보이고, 실제 동작 경로에서도 한 번 더 막힌다.

여기서 걸린 게 있다. 설정값을 읽는 함수의 기본값이 켬이라, 명시하지 않으면 저장된 값이 없을 때 디버그가 켜진 채로 읽혔다.

  • 출시에서 빠져야 할 기능은 화면에서 숨기는 것만으로 부족하다. 동작 경로에서도 막아야 저장된 값이 안 살아난다
  • 기본값이 켬인 설정은 위험하다. 새 항목을 추가할 때마다 기본이 무엇인지 확인한다

Series: Today I Learn

1 C++ 자료형(Data Type) 2 MD5 vs pHash 3 C++에서 함수의 선언과 정의 4 Tkinter padx, pady 5 메모리와 포인터 변수 6 Call by Value, Call by Reference, Call by Pointer 비교 7 const 8 Gemfile — Jekyll 프로젝트의 의존성 파일 9 kramdown-parser-gfm — Jekyll의 GFM 파서 10 파서(Parser) 11 AHU vs OHU 12 I might try it vs I'll try it 뉘앙스 차이 13 SESSION_EXPIRE_AT_BROWSER_CLOSE=True 14 configuration key 15 Git stash vs discard 16 subprocess.Popen으로 Windows 탐색기에 명령어를 전달 17 Post 잔디 분석하기 18 Google Sheets Sync 최적화 19 DSL (Domain Specific Language)과 GPL (General Purpose Language) 20 마크다운 표 그리는 방법 21 쿼리 파라미터(Query Parameter). 기존 QR코드 재활용 22 Django 보안 취약점 점검 및 수정 23 OOP Object-Oriented Programming 객체 지향 프로그래밍 24 Fernet 대칭 암호화 25 Jekyll 코드블록 안의 Liquid 태그 26 insertOnConflictUpdate vs DoUpdate(target) 27 세션 필터 28 아코디언(Accordiaon) UI를 펼친상태로 만들기 29 input의 step 30 Word Cloud 31 Google Sheets를 데이터 버스로(with AppSheet) 32 Django 모델 텍스트 필드 자동 수집 패턴 33 localStorage로 섹션 토글 상태 유지 34 순차 ID 생성(`select_for_update()` + `max()` 조합) 35 역참조 검색과 distinct() 36 xlsx 다운로드와 로딩 오버레이 충돌 37 Android 파일 공유 MIME 타입 38 AssetManifest — Flutter 빌드 타임 asset 목록 런타임 조회 39 UTF-8 BOM과 PowerShell 파일 쓰기 40 소리꽃 KeyBloom TIL 1 41 소리꽃 KeyBloom TIL 2 42 소리꽃 KeyBloom TIL 3 43 메트로놈 Simple Metronome TIL 1 44 소리꽃 KeyBloom TIL 4 45 메트로놈 Simple Metronome TIL 2 46 소리꽃 KeyBloom TIL 5 47 메트로놈 Simple Metronome TIL 3 48 정적 블로그 SEO 정비와 Pagefind 검색 도입 49 메트로놈 Simple Metronome TIL 4 50 안드로이드 AudioTrack 연속 재생, 실측 피커 정렬, 카메라 토치 플래시 51 메트로놈 Simple Metronome TIL 5 52 모래게임 Sandrop TIL 1 53 메트로놈 Simple Metronome TIL 6 54 모래게임 Sandrop TIL 2 55 모래게임 Sandrop TIL 3 56 메트로놈 Simple Metronome TIL 7 57 모래게임 Sandrop TIL 4 58 모래게임 Sandrop TIL 5 59 모래게임 Sandrop TIL 6 60 소리꽃 KeyBloom TIL 6 61 모래게임 Sandrop TIL 7 62 모래게임 Sandrop TIL 8 63 소리꽃 KeyBloom TIL 7 64 모래게임 Sandrop TIL 9 읽는 중 65 소리꽃 KeyBloom TIL 8 66 모래게임 Sandrop TIL 10 67 소리꽃 KeyBloom TIL 9 68 소리꽃 KeyBloom TIL 10 69 소리꽃 KeyBloom TIL 11 70 소리꽃 KeyBloom TIL 12 71 소리꽃 KeyBloom TIL 13 72 온실 GreenHouse TIL 1 73 소리꽃 KeyBloom TIL 14 74 온실 GreenHouse TIL 2 75 소리꽃 KeyBloom TIL 15 76 소리꽃 KeyBloom TIL 16 77 소리꽃 KeyBloom TIL 17 78 소리꽃 KeyBloom TIL 18 79 소리꽃 KeyBloom TIL 19 80 소리꽃 KeyBloom TIL 20 81 로그스톤 상표 셀프 출원 TIL 1 82 소리꽃 KeyBloom TIL 21 83 소리꽃 KeyBloom TIL 22 84 소리꽃 KeyBloom TIL 23 85 소리꽃 KeyBloom TIL 24 86 MiniMacro TIL 1 87 Astro가 무엇인지, 왜 옮기는지 88 MiniMacro TIL 2 89 메트로놈 Simple Metronome TIL 8 90 메트로놈 Simple Metronome TIL 9 91 블로그 Astro 이관 TIL 92 오픈데이 Openday TIL 1 93 오픈데이 Openday TIL 2 94 Unreal Engine MCP TIL 1 95 콘티온 Conti On TIL 11 96 오픈데이 Openday TIL 3 97 오픈데이 Openday TIL 4 98 오픈데이 Openday TIL 5 99 ScorePlayer TIL 1 100 BuildingHub TIL 1 101 ScorePlayer TIL 2 102 BuildingHub TIL 2 103 ScorePlayer TIL 3 104 Unreal Engine MCP TIL 2 105 궁 미로 PalaceMaze TIL 1 106 메트로놈 Simple Metronome TIL 10 107 메트로놈 Simple Metronome TIL 11 108 오픈데이 Openday TIL 6 109 BuildingHub TIL 3 110 Obsidian vault에서 코드만 빼기 — directory junction 111 ScorePlayer TIL 4 112 오픈데이 Openday TIL 7 113 URL은 바뀔 수 있는 것에 묶지 않는다 114 도구는 기능이 아니라 내 일에 맞는지로 고른다 115 돌이키기 힘든 변경은 작게 먼저 확인한다 116 궁 미로 PalaceMaze TIL 3 117 궁 미로 PalaceMaze TIL 2 118 소리꽃 KeyBloom TIL 29 119 오픈데이 Openday TIL 8 120 BuildingHub TIL 4 121 ScorePlayer TIL 5 122 BuildingHub TIL 5 123 MiniMacro TIL 3 124 소리꽃 KeyBloom TIL 30 125 궁 미로 PalaceMaze TIL 4