Commit 17e73e22 authored by Gavin An's avatar Gavin An

영웅의 공격방식 변경

parent 48b5d744
No preview for this file type
No preview for this file type
This diff is collapsed.
......@@ -21,6 +21,15 @@ const DWARF_ATTACK_DAMAGE_RATIO: float = 0.48
const DWARF_MIN_ATTACK_LOCK: float = 0.65
const DWARF_MIN_ATTACK_PLAY_SPEED: float = 1.0
const DWARF_MAX_ATTACK_PLAY_SPEED: float = 4.0
const DWARF_MANUAL_ATTACK_DISTANCE: float = 5.2
const DWARF_MANUAL_ATTACK_ANGLE_DEGREES: float = 115.0
func _ready() -> void:
# 드워프는 도끼를 크게 휘두르는 근접 영웅이므로, Attack 버튼 입력 시 넓은 전방 부채꼴을 공격합니다.
# BaseHero의 기본값을 여기에서 덮어써 영웅별 수동 공격 반경을 분리합니다.
manual_attack_distance = DWARF_MANUAL_ATTACK_DISTANCE
manual_attack_angle_degrees = DWARF_MANUAL_ATTACK_ANGLE_DEGREES
super._ready()
func _setup_unit_visuals() -> void:
# 자식 노드 중 드워프 3D 모델 노드 이름을 명시하여 인스턴스를 확보합니다.
......
......@@ -59,7 +59,7 @@ void fragment() {
}
"
[sub_resource type="PlaceholderTexture2DArray" id="PlaceholderTexture2DArray_b0gws"]
[sub_resource type="PlaceholderTexture2DArray" id="PlaceholderTexture2DArray_lkjvc"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lkjvc"]
render_priority = 0
......@@ -69,7 +69,7 @@ shader_parameter/OffsetPosition = Vector3(0, 0, 0)
shader_parameter/ZonesSize = 0.0
shader_parameter/Resolution = 0.0
shader_parameter/NumberOfZones = 0.0
shader_parameter/WaterTextures = SubResource("PlaceholderTexture2DArray_b0gws")
shader_parameter/WaterTextures = SubResource("PlaceholderTexture2DArray_lkjvc")
shader_parameter/WaterFactor = 0.0
shader_parameter/WaterInnerOffset = 0.3
shader_parameter/WaterColor = Color(0, 0, 0, 1)
......@@ -99,20 +99,20 @@ waterColorDeep = Color(0.79508156, 0.8459231, 1, 1)
waterColorShallow = Color(0.14232409, 5.7756904e-07, 0.853347, 1)
customShader = SubResource("ShaderMaterial_lkjvc")
[sub_resource type="ZoneResource" id="ZoneResource_vhovy"]
[sub_resource type="ZoneResource" id="ZoneResource_tdk5o"]
heightMapImage = ExtResource("1_6h2jq")
splatmapsImage = Array[Image]([ExtResource("2_8a6xj")])
waterImage = ExtResource("9_lkjvc")
[sub_resource type="ZonesResource" id="ZonesResource_aj3fk"]
zones = Array[ZoneResource]([SubResource("ZoneResource_vhovy")])
[sub_resource type="ZonesResource" id="ZonesResource_b0gws"]
zones = Array[ZoneResource]([SubResource("ZoneResource_tdk5o")])
[node name="DesertBackground" type="TerraBrush" unique_id=568763585]
dataPath = "res://assets/map/desert"
zonesSize = 64
textureSets = SubResource("TextureSetsResource_207lx")
waterDefinition = SubResource("WaterResource_gbjga")
terrainZones = SubResource("ZonesResource_aj3fk")
terrainZones = SubResource("ZonesResource_b0gws")
physics_interpolation_mode = 2
top_level = true
metadata/_edit_lock_ = false
......@@ -12,6 +12,7 @@ const MOVE_COMMAND_INTERVAL: float = 0.08
var _hero: Node3D = null
var _move_vector: Vector2 = Vector2.ZERO
var _keyboard_move_vector: Vector2 = Vector2.ZERO
var _is_dragging_move_stick: bool = false
var _move_command_timer: float = 0.0
......@@ -33,12 +34,28 @@ func _ready() -> void:
visible = false
set_process(false)
## 키보드 공격 입력을 처리합니다.
## A 키는 화면의 ATK 버튼과 완전히 같은 _on_attack_pressed() 경로를 사용해 입력별 동작 차이를 없앱니다.
func _unhandled_input(event: InputEvent) -> void:
if not visible or not is_instance_valid(_hero) or _is_game_over():
return
if event is InputEventKey:
var key_event: InputEventKey = event as InputEventKey
if key_event.pressed and not key_event.echo and key_event.keycode == KEY_A:
_on_attack_pressed()
get_viewport().set_input_as_handled()
func _process(delta: float) -> void:
if not is_instance_valid(_hero) or _is_game_over():
visible = false
set_process(false)
return
_update_keyboard_move_vector()
if not _is_dragging_move_stick:
_apply_keyboard_vector_to_stick()
_move_command_timer -= delta
if _move_vector.length() > JOYSTICK_DEADZONE and _move_command_timer <= 0.0:
_move_command_timer = MOVE_COMMAND_INTERVAL
......@@ -153,7 +170,10 @@ func _on_move_area_gui_input(event: InputEvent) -> void:
_is_dragging_move_stick = mouse_event.pressed
_update_move_stick(mouse_event.position if mouse_event.pressed else _move_area.size * 0.5)
if not mouse_event.pressed:
_reset_move_stick()
if _keyboard_move_vector.length() > JOYSTICK_DEADZONE:
_apply_keyboard_vector_to_stick()
else:
_reset_move_stick()
elif event is InputEventMouseMotion and _is_dragging_move_stick:
var motion_event: InputEventMouseMotion = event as InputEventMouseMotion
_update_move_stick(motion_event.position)
......@@ -169,14 +189,14 @@ func _apply_hero_move_vector() -> void:
if _hero.has_method("move_to"):
_hero.call("move_to", target_position)
## 공격 버튼을 누르면 가장 가까운 살아있는 몬스터를 찾아 영웅의 공격 대상으로 지정합니다.
## 공격 버튼을 누르면 영웅 전용 수동 공격을 실행합니다.
## 근접 영웅은 BaseHero.manual_attack()에서 전방 범위 공격을 하고, 원거리 타입은 기존 자동 타겟 공격 흐름을 사용합니다.
func _on_attack_pressed() -> void:
if not is_instance_valid(_hero):
return
var target: Node3D = _find_nearest_monster()
if target and _hero.has_method("attack_target"):
_hero.call("attack_target", target)
if _hero.has_method("manual_attack"):
_hero.call("manual_attack")
## 스킬 버튼을 누르면 BaseHero.use_skill()에 그대로 위임합니다.
func _on_skill_pressed(slot: String) -> void:
......@@ -199,6 +219,35 @@ func _reset_move_stick() -> void:
if _move_area and _move_knob:
_move_knob.position = _move_area.size * 0.5 - _move_knob.size * 0.5
## 키보드 화살표 입력을 매 프레임 읽어 조이스틱 방향 벡터로 변환합니다.
## 왼쪽/오른쪽은 x축, 위/아래는 조이스틱 y축과 동일하게 대응하며 대각선은 normalized 처리합니다.
func _update_keyboard_move_vector() -> void:
var new_vector: Vector2 = Vector2.ZERO
if Input.is_key_pressed(KEY_LEFT):
new_vector.x -= 1.0
if Input.is_key_pressed(KEY_RIGHT):
new_vector.x += 1.0
if Input.is_key_pressed(KEY_UP):
new_vector.y -= 1.0
if Input.is_key_pressed(KEY_DOWN):
new_vector.y += 1.0
_keyboard_move_vector = new_vector.normalized() if new_vector.length() > 1.0 else new_vector
## 방향키 입력을 실제 조이스틱 상태에 반영합니다.
## knob 위치와 _move_vector를 같은 함수 경로로 갱신해, 키보드와 터치 조이스틱이 완전히 같은 이동 로직을 탑니다.
func _apply_keyboard_vector_to_stick() -> void:
if not _move_area:
return
if _keyboard_move_vector.length() <= JOYSTICK_DEADZONE:
_reset_move_stick()
return
var center: Vector2 = _move_area.size * 0.5
var stick_position: Vector2 = center + _keyboard_move_vector * JOYSTICK_RADIUS
_update_move_stick(stick_position)
## 현재 필드에서 영웅과 가장 가까운 살아있는 몬스터를 찾습니다.
func _find_nearest_monster() -> Node3D:
var nearest_monster: Node3D = null
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment