gohud

기다리기, 알리기, 세기

← 위젯

GoSnackbar — 스스로 자리를 잡는 메시지

화면 아래(또는 위), 안전영역과 가상 키보드 위에 앉았다가 혼자 사라진다. 이것이 없으면 "저장했습니다" 한마디를 띄우는 화면마다 레이어·배치·타이머·정리 코드를 다시 쓴다.

snack.show_text("저장했습니다", GoTheme.SUCCESS)

# 되돌릴 기회 — 0 은 첫 버튼, -1 은 시간이 다 된 것
if await snack.post({"text": "아이템을 버렸습니다", "actions": ["되돌리기"]}) == 0:
    restore_item()

메시지는 서로 덮어쓰지 않고 줄을 선다. 같은 문장이 되풀이되면 하나로 합친다 — 1초에 네 번 실패하는 서버가 4분치 알림을 쌓아 올리는 일이 없다. 버튼 없는 스낵바는 입력을 그대로 통과시키므로 아래의 게임은 계속 돈다.

무언가를 묻는 자리가 아니다. 스스로 사라지니 플레이어는 끝내 못 볼 수도 있다. 되돌릴 수 없는 확인은 GoDialogs 의 몫이다. 여기 버튼은 눌러도 되고 안 눌러도 되는 것이어야 한다 — 되돌리기, 자세히, 다시 시도.

GoNotice 는 짝을 이루는 나머지 반쪽이다. 입력도 포커스도 절대 가져가지 않고, 어디에 둘지는 그것을 가진 화면이 정한다. 그쪽은 버튼을 달 수 없고, 이쪽은 달 수 있다.

GoSpinner — 끝이 보이지 않는 기다림

서버와 이야기하는 게임에는 이 페이지의 무엇보다 이것이 먼저 필요하다 — 가만히 서 있는 화면은 멈춘 게임으로 읽힌다. 한 줄이면 방금 누른 버튼이 그 자리에서 스피너가 된다.

GoSpinner.busy(buy_button, true)
var ok := await server.purchase(item)
GoSpinner.busy(buy_button, false)

버튼은 크기를 지킨다 — 글자가 없어지는 게 아니라 투명해지므로 줄이 튀지 않는다 — 그리고 도는 동안 눌리지 않는다. 뒤쪽이 핵심이다: await 하는 사이에 결제가 두 번 나가면 안 된다. reduce_motion 이면 돌지 않고 점 세 개가 깜박인다.

잴 수 있는 진행은 GoBar 다. 스피너는 언제 끝나는지 아무것도 약속하지 않는다.

GoBadge — 안 읽은 점, NEW 딱지, 99+

GoBadge.attach(mail_button, unread_count)   # 0 이면 스스로 숨는다
GoBadge.attach(shop_button, 0, "NEW")
GoBadge.attach(friend_button, 3, "", true) # 점 하나 — "뭔가 있다"

앵커로 대상의 오른쪽 위 모서리에 매달리므로 크기가 나중에 정해지는 대상도 따라간다. 두 번 붙이면 같은 배지를 돌려준다. 개수가 플레이어의 행동을 바꾸면 숫자를, "뭔가 있다" 만 중요하면 점을 쓴다.

글자 색은 스킨이 배지를 어떤 색으로 칠했든 그 색과의 대비로 고른다 — 흰색이라고 넘겨짚지 않는다 — 그리고 접근성 이름을 함께 단다. 색깔 점 하나는 화면 낭독기에 아무 말도 하지 않기 때문이다.