![24b0d121e09c28a8699fe8b115ef0468e7adecba]()
1206๋ฒ์ 23.4ms? ๋์ฐํ๋ค
----
์์ ํ
![24b0d121e09c28a8699fe8b115ef046b646b9537]()
2932๋ฒ ํธ์ถ์ 8.6 ms
---
func _physics_process(delta):
var s_delta = TimeManager.scale_delta(delta)
var prev_pos := global_position
if velocity.length() > 0:
var collision: KinematicCollision2D = move_and_collide(velocity * s_delta)
if collision:
var collider = collision.get_collider()
if collider is Wall:
velocity = velocity.bounce(collision.get_normal()) * bounce
if is_being_pulled:
if _check_collect_path(prev_pos, global_position):
_collect()
return
else:
velocity = velocity.move_toward(Vector2.ZERO, friction * s_delta)
if velocity == Vector2.ZERO and spawn_scale >= 1.0:
set_physics_process(false)
์ด๊ฒ ๊ธฐ์กด์ฝ๋์ธ๋ฐ is_being_pulled ์ํ์๋ ๋ฌผ๋ฆฌ ์ถฉ๋์ด ํ์ํ์ง ์์ผ๋๊น ๋ก์ง์ _process๋ก ์ด์ ํ๊ณ move_and_collide ๋์
global_position += velocity * delta ์ฌ์ฉ์ผ๋ก ์์ ํ๊ธฐ๋ก ํ๊ณ _process ๋ก ๋์ด๊ฐ
func _process(delta):
# ์์ดํ
์ค๋๊ฑฐ์๋ ์ผ๋ฐ ์๊ฐ ์ฌ์ฉ
# var s_delta = TimeManager.scale_delta(delta)
if spawn_scale < 1.0:
spawn_scale = move_toward(spawn_scale, 1.0, SPAWN_SCALE_SPEED * delta)
scale = Vector2.ONE * spawn_scale
else:
if not is_being_pulled:
set_process(false)
if is_being_pulled:
if not _has_valid_target_magnet():
is_being_pulled = false
return
var target_pos = target_magnet.global_position
var distance = global_position.distance_to(target_pos)
if distance < COLLECT_RANGE or velocity.length() > FORCED_COLLECT_SPEED:
_collect()
return
if velocity.length() > 10.0:
var target_rotation = velocity.angle() + PI/2
rotation = lerp_angle(rotation, target_rotation, 2 * delta)
var direction = (target_pos - global_position).normalized()
pull_speed += PULL_STRENTGTH * delta
# ๊ธฐ๋ณธ ์๋๋ ๊ณ์ ์ฆ๊ฐ
var base_speed = pow(pull_speed, 2) * 0.01
# ๊ฐ๊น์ธ ๋๋ง ์ถ๊ฐ ๋ถ์คํธ (150px ์ดํ์ผ ๋)
var distance_boost = 1.0
if distance < 50.0:
distance_boost += (50.0 - distance) / 50.0
var target_velocity = direction * base_speed * distance_boost
var speed_factor = min(velocity.length() / 1000.0, 1.0)
var distance_factor = 1.0 - min(distance / 200.0, 1.0)
var dynamic_turn_speed = TURN_SPEED + (speed_factor * 0.3) + (distance_factor * 0.2)
velocity = velocity.lerp(target_velocity, dynamic_turn_speed)
์ผ๋จ ๋ชจ๋ ๊ฑฐ๋ฆฌ ๊ด๋ จ ์ฐ์ฐ์ squared ๊ธฐ๋ฐ์ผ๋ก ๋ณ๊ฒฝ ์ด๋ฌ๋ฉด ์ ๊ณฑ๊ทผ ๊ณ์ฐ์ด ๋น ์ ธ์ ์ฑ๋ฅ์ ์ผ๋ก ์ข์๋ณด์
var distance_sq := global_position.distance_squared_to(target_pos)
if distance_sq < COLLECT_RANGE_SQ or velocity.length_squared() > FORCED_COLLECT_SPEED_SQ:
_collect()
return
๊ทธ๋ค์ _process ์์ ํ๊ธฐ ์ ์ _check_collect_path๋ฅผ ํ์ธํด๋ณด์
ํด๋น ํจ์๋ drop์ ์๋๊ฐ ๋นจ๋ผ ํ๋ํ์ง ๋ชปํ๊ณ ์ค๋ฒ์ ํ์๊ฒฝ์ฐ๋ฅผ ๋ง์์ฃผ๋ ํจ์์ด๋ค
func _check_collect_path(start_pos: Vector2, end_pos: Vector2) -> bool:
if is_collected or not _has_valid_target_magnet():
return false
var target_pos := target_magnet.global_position
var collect_range_sq := COLLECT_RANGE * COLLECT_RANGE
if start_pos.distance_squared_to(target_pos) <= collect_range_sq:
return true
if end_pos.distance_squared_to(target_pos) <= collect_range_sq:
return true
var segment := end_pos - start_pos
var segment_len_sq := segment.length_squared()
if segment_len_sq <= 0.0001:
return false
var t := clampf((target_pos - start_pos).dot(segment) / segment_len_sq, 0.0, 1.0)
var closest_point := start_pos + segment * t
return closest_point.distance_squared_to(target_pos) <= collect_range_sq
๋งค๋ฒ target_magnet ์ ๋ค๊ณ ์ค๋๋ฐ _process๋ก ์ด๋ํ์ผ๋ ์ด๋ฏธ ๋ค๊ณ ์๋ ๊ฐ์ ์ธ ์ ์์๊ฒ ๊ฐ๋ค
collect_range_sq๋ ์์๋ก ๋นผ๊ณ ํ๋ฉด
func _is_collect_path_crossed(
start_pos: Vector2,
end_pos: Vector2,
target_pos: Vector2,
start_distance_sq: float,
end_distance_sq: float
) -> bool:
if start_distance_sq <= COLLECT_RANGE_SQ:
return true
if end_distance_sq <= COLLECT_RANGE_SQ:
return true
var segment := end_pos - start_pos
var segment_len_sq := segment.length_squared()
if segment_len_sq <= 0.0001:
return false
var t := clampf((target_pos - start_pos).dot(segment) / segment_len_sq, 0.0, 1.0)
var closest_point := start_pos + segment * t
return closest_point.distance_squared_to(target_pos) <= COLLECT_RANGE_SQ
์ด์ ๋๋ก ๊ฐ๋ฅํ ๊ฒ ๊ฐ๋ค
์ฌ์ฉํ๋ ๊ฐ ๊ณ์ฐ์ ์ ๋ถ ์ธ๋ถ์์ ํ๊ณ ๋ด๋ถ๋ ํ์ธ๋ง ํ๋์ ๋
๊ทธ๋์ ์ต์ข
์ฝ๋
func _physics_process(delta):
if is_being_pulled:
set_physics_process(false)
return # ๋๋ ค๊ฐ๋ ์ค์๋ ๋ฌผ๋ฆฌ ์ด๋ ์ฒ๋ฆฌ ์ํจ, _process์์ ์ฒ๋ฆฌ
var s_delta = TimeManager.scale_delta(delta)
if velocity != Vector2.ZERO:
var collision: KinematicCollision2D = move_and_collide(velocity * s_delta)
if collision:
var collider = collision.get_collider()
if collider is Wall:
velocity = velocity.bounce(collision.get_normal()) * bounce
velocity = velocity.move_toward(Vector2.ZERO, friction * s_delta)
if velocity == Vector2.ZERO and spawn_scale >= 1.0:
set_physics_process(false)
func _process(delta):
# ์์ดํ
์ค๋๊ฑฐ์๋ ์ผ๋ฐ ์๊ฐ ์ฌ์ฉ
if spawn_scale < 1.0:
spawn_scale = move_toward(spawn_scale, 1.0, SPAWN_SCALE_SPEED * delta)
scale = Vector2.ONE * spawn_scale
else:
if not is_being_pulled:
set_process(false)
if is_being_pulled:
if not _has_valid_target_magnet():
is_being_pulled = false
return
var start_pos := global_position
var target_pos := target_magnet.global_position
var to_target := target_pos - start_pos
var distance_sq := to_target.length_squared()
var velocity_len_sq := velocity.length_squared()
if distance_sq < COLLECT_RANGE_SQ or velocity_len_sq > FORCED_COLLECT_SPEED_SQ:
_collect()
return
if velocity_len_sq > 100.0:
var target_rotation = velocity.angle() + PI / 2
rotation = lerp_angle(rotation, target_rotation, 2 * delta)
var distance := sqrt(distance_sq)
var direction := to_target / distance
pull_speed += PULL_STRENTGTH * delta
# ๊ธฐ๋ณธ ์๋๋ ๊ณ์ ์ฆ๊ฐ
var base_speed = pull_speed * pull_speed * 0.01
# ๊ฐ๊น์ธ ๋๋ง ์ถ๊ฐ ๋ถ์คํธ (150px ์ดํ์ผ ๋)
var distance_boost = 1.0
if distance < 50.0:
distance_boost += (50.0 - distance) / 50.0
var target_velocity = direction * base_speed * distance_boost
var speed_factor = min(sqrt(velocity_len_sq) / 1000.0, 1.0)
var distance_factor = 1.0 - min(distance / 200.0, 1.0)
var dynamic_turn_speed = TURN_SPEED + (speed_factor * 0.3) + (distance_factor * 0.2)
velocity = velocity.lerp(target_velocity, dynamic_turn_speed)
global_position += velocity * delta
var end_distance_sq := global_position.distance_squared_to(target_pos)
if _is_collect_path_crossed(start_pos, global_position, target_pos, distance_sq, end_distance_sq):
_collect()
return
![24b0d121e09c28a8699fe8b115ef046b646b9537]()
16gb m1 mac ์์ ์ด์ ๋๋ก ๋์๊ฐ๋ฉด ์ผ๋ฐ pc ์์๋ ์ง์ฐ์ด ์ฒด๊ฐ๋์ง ์์๊ฑฐ๋ผ ์๊ฐํจ
์ค๋์ ์ต์ ํ๋ ์ฌ๊ธฐ์ ๋
GOSU