헤엄치는 속도를 낮추고 물고기를 좌우로만
방치형이라 화면이 늘 눈에 들어와 있고, 빠른 움직임은 몇 분만 지나도 산만하다. - 속도를 종류별로 절반 이하로 (물고기 0.40 -> 0.15, 게 0.22 -> 0.10 등) - 멈추는 시간을 늘리고(물고기 0.25~1.1초 -> 1.5~4.5초) 확률도 0.55 -> 0.65 - 물고기가 축에서 벗어나는 각도를 20도 -> 6도로. 수직으로 오르내리지 않는다 - 대신 12% 확률로 크게 틀어 수심을 바꾸게 해서 한 높이에 줄서지 않도록 - 위아래 벽에서 곧장 꺾지 않고 가던 쪽으로 비스듬히 벗어나게 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user