게임 안에서 바다의 하루를 정할 수 있게
메뉴 > 시간 하위 메뉴에 세 갈래를 둔다. - 실제 시각: 바깥 시계 그대로 (기본) - 빠르게: 하루를 5분으로 압축해 돌린다 - 한 시각에 멈추기: 새벽/아침/낮/저녁/밤 프리셋의 이름과 시각을 DayCycle.FIXED_PRESETS 한곳에 같이 두어, 메뉴 항목과 실제로 적용되는 시각이 어긋날 수 없게 했다. 고른 값은 window_state의 time_mode/time_hour에 저장한다. 모드를 바꿀 때 지금 보이던 시각을 먼저 잡아 둔다. mode를 먼저 바꾼 뒤 hour()를 부르면 이미 새 모드의 시계를 읽어 0시로 튀었다 -- 낮에 "빠르게"를 켜면 한밤중으로 떨어지는 버그였다. 명령줄 --hour=21은 그대로 살아 있고 FIXED 모드의 지름길이 되었다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+51
-6
@@ -38,16 +38,49 @@ const LIGHT_KEYS := [
|
||||
## 빛은 천천히 변하므로 매 프레임 다시 잴 이유가 없다.
|
||||
const REFRESH_INTERVAL := 0.5
|
||||
|
||||
## 0 이상이면 그 시각으로 고정한다. 테스트와 눈으로 확인할 때 쓴다.
|
||||
var forced_hour := -1.0:
|
||||
## 시간을 어떻게 굴릴지.
|
||||
## REAL 바깥 시계를 그대로 (기본)
|
||||
## FIXED 한 시각에 멈춰 둔다. 밤바다만 보고 싶을 때.
|
||||
## FAST 하루를 몇 분으로 압축해 돌린다. 하루가 지나가는 걸 보고 싶을 때.
|
||||
enum Mode { REAL, FIXED, FAST }
|
||||
|
||||
## 메뉴에 올리는 고정 시각들. 이름과 시각을 한곳에 둬서 메뉴와 어긋나지 않게 한다.
|
||||
const FIXED_PRESETS := [
|
||||
{"name": "새벽", "hour": 4.5},
|
||||
{"name": "아침", "hour": 8.0},
|
||||
{"name": "낮", "hour": 13.0},
|
||||
{"name": "저녁", "hour": 18.7},
|
||||
{"name": "밤", "hour": 22.0},
|
||||
]
|
||||
|
||||
## 빠르게 돌릴 때 하루가 몇 분인지.
|
||||
const FAST_DAY_MINUTES := 5.0
|
||||
|
||||
var mode := Mode.REAL:
|
||||
set(value):
|
||||
forced_hour = value
|
||||
if mode == value:
|
||||
return
|
||||
# 지금 보이던 시각을 먼저 잡아 둔다. mode를 바꾼 뒤에 hour()를 부르면
|
||||
# 이미 새 모드의 시계를 읽어 0시로 튀어 버린다.
|
||||
var carry := hour()
|
||||
mode = value
|
||||
# 빠르게로 넘어갈 때는 보던 시각에서 이어 흐르게 한다.
|
||||
# 0시로 떨어지면 한밤중으로 뚝 끊긴다.
|
||||
if mode == Mode.FAST:
|
||||
_fast_hour = carry
|
||||
refresh()
|
||||
|
||||
## 고정 모드일 때 멈춰 있을 시각.
|
||||
var fixed_hour := 13.0:
|
||||
set(value):
|
||||
fixed_hour = fposmod(value, 24.0)
|
||||
refresh()
|
||||
|
||||
var tint := Color.WHITE
|
||||
var light := 1.0
|
||||
var phase := ""
|
||||
|
||||
var _fast_hour := 0.0
|
||||
var _timer := 0.0
|
||||
|
||||
|
||||
@@ -55,11 +88,16 @@ func _ready() -> void:
|
||||
# 개발 중 특정 시각을 눈으로 확인할 때: godot --path . -- --hour=21
|
||||
for arg in OS.get_cmdline_user_args():
|
||||
if arg.begins_with("--hour="):
|
||||
forced_hour = float(arg.trim_prefix("--hour="))
|
||||
fixed_hour = float(arg.trim_prefix("--hour="))
|
||||
mode = Mode.FIXED
|
||||
refresh()
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
# 압축한 시계는 매 틀 굴려야 매끄럽게 흐른다. 화면 갱신만 뜸하게 한다.
|
||||
if mode == Mode.FAST:
|
||||
_fast_hour = fposmod(_fast_hour + delta * 24.0 / (FAST_DAY_MINUTES * 60.0), 24.0)
|
||||
|
||||
_timer += delta
|
||||
if _timer < REFRESH_INTERVAL:
|
||||
return
|
||||
@@ -69,12 +107,19 @@ func _process(delta: float) -> void:
|
||||
|
||||
## 지금 몇 시인지. 소수점까지 있는 시각(13.5 = 오후 1시 30분).
|
||||
func hour() -> float:
|
||||
if forced_hour >= 0.0:
|
||||
return fposmod(forced_hour, 24.0)
|
||||
match mode:
|
||||
Mode.FIXED: return fixed_hour
|
||||
Mode.FAST: return _fast_hour
|
||||
var t := Time.get_time_dict_from_system()
|
||||
return float(t.hour) + float(t.minute) / 60.0 + float(t.second) / 3600.0
|
||||
|
||||
|
||||
## "13:24" 처럼 보여줄 문자열.
|
||||
func clock_text() -> String:
|
||||
var h := hour()
|
||||
return "%02d:%02d" % [int(h), int(fposmod(h * 60.0, 60.0))]
|
||||
|
||||
|
||||
func refresh() -> void:
|
||||
var h := hour()
|
||||
tint = tint_at(h)
|
||||
|
||||
Reference in New Issue
Block a user