diff --git a/docs/DESIGN.md b/docs/DESIGN.md index 4abcbc2..a7ae914 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -457,3 +457,8 @@ F11이나 메뉴로 창을 화면 전체로 키운다. 그냥 창만 키우면 짧다 보니 무작위 방향이 위아래 벽에 계속 부딪혀 통통 튀는 것처럼 보였다. 그래서 종류마다 기본으로 삼는 축(물고기·게는 좌우, 해마·해파리는 위아래)을 두고 거기서 조금만 벗어나게 했고, 벽 앞에서는 튕기는 대신 미리 안쪽으로 돌아서게 했다. + +속도는 전반적으로 느리게 잡았다. 방치형이라 늘 눈에 들어와 있는 화면이고, +빠른 움직임은 몇 분만 지나도 산만해진다. 물고기가 벗어나는 각도도 6도 남짓으로 +좁혀 두었다 -- 실제로 물고기가 수직으로 오르내리는 일은 드물다. 대신 열 번에 +한 번쯤은 크게 틀어 수심을 바꾸게 해서, 모두가 제 높이에 줄지어 있지 않도록 했다. diff --git a/scenes/aquarium/tile_item.gd b/scenes/aquarium/tile_item.gd index e2de641..c870e82 100644 --- a/scenes/aquarium/tile_item.gd +++ b/scenes/aquarium/tile_item.gd @@ -113,62 +113,64 @@ func set_roam(area: Rect2, rng: RandomNumberGenerator) -> void: # rest_odds: 한 번 나아간 뒤 쉴 확률. match shape: "crab": - # 바닥을 짚고 좌우로만. 자주 멈춰 선다. - _speed = h * 0.22 + # 바닥을 짚고 좌우로만. 자주, 오래 멈춰 선다. + _speed = h * 0.10 _vertical = 0.0 - _spread = 0.06 - _cruise = Vector2(0.8, 2.0) - _rest = Vector2(0.6, 2.2) - _rest_odds = 0.75 - _turn_rate = 3.0 - _accel = 6.0 + _spread = 0.04 + _cruise = Vector2(1.2, 3.0) + _rest = Vector2(1.5, 4.5) + _rest_odds = 0.8 + _turn_rate = 1.6 + _accel = 3.0 _band = Vector2(0.62, 1.0) "seahorse": - # 꼬리를 감고 선 채로 오르내린다. 오래 멈춰 있다. - _speed = h * 0.13 + # 꼬리를 감고 선 채로 아주 천천히 오르내린다. + _speed = h * 0.07 _vertical = 1.0 - _spread = 0.5 - _cruise = Vector2(1.0, 2.6) - _rest = Vector2(1.0, 3.0) - _rest_odds = 0.7 - _turn_rate = 1.6 - _accel = 2.0 + _spread = 0.35 + _cruise = Vector2(1.5, 3.5) + _rest = Vector2(2.5, 6.0) + _rest_odds = 0.75 + _turn_rate = 1.0 + _accel = 1.5 _band = Vector2(0.15, 0.92) "shrimp": - # 거의 멈춰 있다가 짧게 튄다. - _speed = h * 0.6 + # 거의 멈춰 있다가 짧게 튄다. 튀는 순간만 빠르다. + _speed = h * 0.35 _vertical = 0.0 - _spread = 0.5 - _cruise = Vector2(0.15, 0.4) - _rest = Vector2(0.9, 2.6) + _spread = 0.15 + _cruise = Vector2(0.2, 0.5) + _rest = Vector2(2.0, 5.0) _rest_odds = 0.9 - _turn_rate = 5.0 - _accel = 12.0 + _turn_rate = 4.0 + _accel = 10.0 _band = Vector2(0.5, 1.0) "glow": # 해파리는 물살에 밀리듯 길게 흐르고 가끔 멎는다. - _speed = h * 0.14 + _speed = h * 0.07 _vertical = 1.0 - _spread = 0.7 - _cruise = Vector2(2.5, 5.0) - _rest = Vector2(0.8, 2.0) - _rest_odds = 0.4 - _turn_rate = 0.8 - _accel = 1.2 + _spread = 0.5 + _cruise = Vector2(3.5, 7.0) + _rest = Vector2(2.0, 5.0) + _rest_odds = 0.45 + _turn_rate = 0.6 + _accel = 0.9 _band = Vector2(0.05, 0.78) _: - _speed = h * 0.4 + # 물고기는 거의 좌우로만 다닌다. spread가 0.1이면 6도쯤 -- + # 헤엄치는 동안 수심이 눈에 띄게 바뀌지 않을 만큼이다. + _speed = h * 0.15 _vertical = 0.0 - _spread = 0.35 - _cruise = Vector2(1.6, 3.8) - _rest = Vector2(0.25, 1.1) - _rest_odds = 0.55 - _turn_rate = 2.2 - _accel = 2.5 + _spread = 0.1 + _cruise = Vector2(2.5, 6.0) + _rest = Vector2(1.5, 4.5) + _rest_odds = 0.65 + _turn_rate = 1.2 + _accel = 1.4 _band = Vector2(0.1, 0.95) # 돌아다니는 것이 큰 움직임을 맡으므로 제자리 흔들림은 줄인다. - _swim_range *= 0.3 + _swim_range *= 0.22 _speed *= rng.randf_range(0.82, 1.2) _heading = _axis_angle() + (PI if rng.randf() < 0.5 else 0.0) _desired = _heading @@ -201,7 +203,11 @@ func _new_heading() -> float: var same_way := forward >= 0.0 if randf() < 0.3: same_way = not same_way - return axis + (0.0 if same_way else PI) + randf_range(-_spread, _spread) + + # 가끔은 크게 틀어 수심을 바꾼다. 늘 제 높이만 오가면 줄지어 다니는 것처럼 + # 보이므로, 열 번에 한 번쯤은 비스듬히 올라가거나 내려가게 둔다. + var spread := _spread * (5.0 if randf() < 0.12 else 1.0) + return axis + (0.0 if same_way else PI) + randf_range(-spread, spread) func _roam_step(delta: float) -> void: @@ -234,6 +240,18 @@ func _roam_step(delta: float) -> void: elif position.y > band.y - my: away.y -= 1.0 if away != Vector2.ZERO: + # 좌우로 다니는 것은 위아래 벽에서도 곧장 꺾지 않는다. 가던 쪽으로 + # 나아가면서 비스듬히 벗어난다 -- 수직으로 솟구치면 물고기 같지 않다. + if _vertical < 0.5 and is_zero_approx(away.x): + away.x = signf(cos(_heading)) + if is_zero_approx(away.x): + away.x = 1.0 + away.y *= 0.45 + elif _vertical > 0.5 and is_zero_approx(away.y): + away.y = signf(sin(_heading)) + if is_zero_approx(away.y): + away.y = 1.0 + away.x *= 0.45 _desired = away.angle() _resting = false