bull and bear flashing red when take damage
This commit is contained in:
+1
-2
@@ -35,7 +35,7 @@ script = ExtResource("2_camera_iso")
|
|||||||
[node name="bull" parent="." unique_id=1386495166 instance=ExtResource("4_e80uo")]
|
[node name="bull" parent="." unique_id=1386495166 instance=ExtResource("4_e80uo")]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.655, 0.23)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.655, 0.23)
|
||||||
|
|
||||||
[node name="Skeleton3D" parent="bull/Armature" parent_id_path=PackedInt32Array(1386495166, 1883464126) index="0" unique_id=72207798]
|
[node name="Skeleton3D" parent="bull/Armature" parent_id_path=PackedInt32Array(1386495166, 1942410469) index="0" unique_id=550138996]
|
||||||
bones/0/position = Vector3(0, 0, 0.009963839)
|
bones/0/position = Vector3(0, 0, 0.009963839)
|
||||||
bones/0/rotation = Quaternion(-0.733504, -0.0036974847, 0.0013620416, -0.67967373)
|
bones/0/rotation = Quaternion(-0.733504, -0.0036974847, 0.0013620416, -0.67967373)
|
||||||
bones/0/scale = Vector3(1, 0.99999994, 0.99999994)
|
bones/0/scale = Vector3(1, 0.99999994, 0.99999994)
|
||||||
@@ -56,7 +56,6 @@ bones/19/rotation = Quaternion(0.07793758, -0.2513099, 0.94914854, 0.1728764)
|
|||||||
bones/20/rotation = Quaternion(-0.3791731, -0.08821739, 0.07153107, 0.91832936)
|
bones/20/rotation = Quaternion(-0.3791731, -0.08821739, 0.07153107, 0.91832936)
|
||||||
bones/22/position = Vector3(-0.0045358227, -0.0021376943, -0.004238624)
|
bones/22/position = Vector3(-0.0045358227, -0.0021376943, -0.004238624)
|
||||||
bones/22/rotation = Quaternion(0.20629132, 0.46411392, 0.84344316, 0.17506008)
|
bones/22/rotation = Quaternion(0.20629132, 0.46411392, 0.84344316, 0.17506008)
|
||||||
bones/22/scale = Vector3(1.0000001, 1.0000001, 1.0000001)
|
|
||||||
bones/23/rotation = Quaternion(-0.7287124, 0.31838557, 0.209407, 0.5689971)
|
bones/23/rotation = Quaternion(-0.7287124, 0.31838557, 0.209407, 0.5689971)
|
||||||
bones/23/scale = Vector3(1.0000001, 1.0000002, 1.0000002)
|
bones/23/scale = Vector3(1.0000001, 1.0000002, 1.0000002)
|
||||||
bones/24/rotation = Quaternion(0.71033937, -0.13944183, -0.049755, 0.6881123)
|
bones/24/rotation = Quaternion(0.71033937, -0.13944183, -0.049755, 0.6881123)
|
||||||
|
|||||||
@@ -59,6 +59,10 @@ var _anim_smash: StringName = &"" # SMASH_HIT — overhead smash
|
|||||||
var _anim_leap: StringName = &"" # JUMP_SMASH — leap slam
|
var _anim_leap: StringName = &"" # JUMP_SMASH — leap slam
|
||||||
var _anim_death: StringName = &"" # DEATH — death
|
var _anim_death: StringName = &"" # DEATH — death
|
||||||
|
|
||||||
|
#take hit flashing
|
||||||
|
var _hit_flash_active := false
|
||||||
|
var _hit_flash_tween: Tween
|
||||||
|
|
||||||
const _ACCEL_FACTOR: float = 9.0
|
const _ACCEL_FACTOR: float = 9.0
|
||||||
# Hard deceleration for planted states (wind-up / recovery / neutral settle) so the bear
|
# Hard deceleration for planted states (wind-up / recovery / neutral settle) so the bear
|
||||||
# never coasts across the ground with a stationary pose playing (no foot-sliding).
|
# never coasts across the ground with a stationary pose playing (no foot-sliding).
|
||||||
@@ -117,6 +121,45 @@ func _ready() -> void:
|
|||||||
_setup_claws()
|
_setup_claws()
|
||||||
_enter_neutral()
|
_enter_neutral()
|
||||||
|
|
||||||
|
#take hit flashing
|
||||||
|
func _hit_flash() -> void:
|
||||||
|
if _mesh == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
if _hit_flash_tween:
|
||||||
|
_hit_flash_tween.kill()
|
||||||
|
|
||||||
|
_hit_flash_active = true
|
||||||
|
|
||||||
|
# Make the bear red
|
||||||
|
for child in _mesh.find_children("*", "MeshInstance3D", true, false):
|
||||||
|
var mesh := child as MeshInstance3D
|
||||||
|
if mesh:
|
||||||
|
mesh.material_overlay = _make_hit_overlay()
|
||||||
|
|
||||||
|
# Flash for 0.1 sec, then remove
|
||||||
|
_hit_flash_tween = create_tween()
|
||||||
|
_hit_flash_tween.tween_interval(0.10)
|
||||||
|
_hit_flash_tween.tween_callback(_clear_hit_flash)
|
||||||
|
|
||||||
|
func _make_hit_overlay() -> StandardMaterial3D:
|
||||||
|
var mat := StandardMaterial3D.new()
|
||||||
|
mat.albedo_color = Color(1.0, 0.05, 0.05, 1.0)
|
||||||
|
mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
|
||||||
|
return mat
|
||||||
|
|
||||||
|
func _clear_hit_flash() -> void:
|
||||||
|
if _mesh == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
for child in _mesh.find_children("*", "MeshInstance3D", true, false):
|
||||||
|
var mesh := child as MeshInstance3D
|
||||||
|
if mesh:
|
||||||
|
mesh.material_overlay = null
|
||||||
|
|
||||||
|
_hit_flash_active = false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Bind a claw-slash emitter to each paw bone (hand_l / hand_r) via a BoneAttachment3D, so
|
# Bind a claw-slash emitter to each paw bone (hand_l / hand_r) via a BoneAttachment3D, so
|
||||||
# a burst fired on a swipe hit erupts from that paw wherever the animation has it.
|
# a burst fired on a swipe hit erupts from that paw wherever the animation has it.
|
||||||
@@ -698,6 +741,7 @@ func _take_hit(hit_dir: Vector3, strength: float) -> void:
|
|||||||
if _state == State.DEAD:
|
if _state == State.DEAD:
|
||||||
return
|
return
|
||||||
_hp -= 1
|
_hp -= 1
|
||||||
|
_hit_flash()
|
||||||
health_changed.emit(_hp, int(DP.f("bear_max_hp")))
|
health_changed.emit(_hp, int(DP.f("bear_max_hp")))
|
||||||
hit_dir.y = 0.0
|
hit_dir.y = 0.0
|
||||||
hit_dir = hit_dir.normalized()
|
hit_dir = hit_dir.normalized()
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ var _charge_dust_ramp: Gradient = null
|
|||||||
|
|
||||||
const RigidSkin = preload("res://rigid_skin.gd")
|
const RigidSkin = preload("res://rigid_skin.gd")
|
||||||
|
|
||||||
|
var _hit_flash_tween: Tween
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
add_to_group(&"player")
|
add_to_group(&"player")
|
||||||
@@ -1090,6 +1092,7 @@ func take_sword_hit(cause: String = "", hit_pos: Vector3 = Vector3.ZERO) -> void
|
|||||||
if _dead or _hit_iframes > 0.0:
|
if _dead or _hit_iframes > 0.0:
|
||||||
return
|
return
|
||||||
_hp -= 1
|
_hp -= 1
|
||||||
|
_hit_flash()
|
||||||
_hit_iframes = DP.f("bull_hit_iframes")
|
_hit_iframes = DP.f("bull_hit_iframes")
|
||||||
health_changed.emit(_hp, _max_hp)
|
health_changed.emit(_hp, _max_hp)
|
||||||
hit_taken.emit(cause)
|
hit_taken.emit(cause)
|
||||||
@@ -1150,3 +1153,36 @@ func _spawn_blood(hit_pos: Vector3) -> void:
|
|||||||
p.global_position = hit_pos
|
p.global_position = hit_pos
|
||||||
p.restart()
|
p.restart()
|
||||||
_free_after(p, 1.5)
|
_free_after(p, 1.5)
|
||||||
|
|
||||||
|
|
||||||
|
#hit flashing
|
||||||
|
func _hit_flash() -> void:
|
||||||
|
var meshes := find_children("*", "MeshInstance3D", true, false)
|
||||||
|
|
||||||
|
for node in meshes:
|
||||||
|
var mesh := node as MeshInstance3D
|
||||||
|
if mesh:
|
||||||
|
mesh.material_overlay = _make_hit_overlay()
|
||||||
|
|
||||||
|
if _hit_flash_tween:
|
||||||
|
_hit_flash_tween.kill()
|
||||||
|
|
||||||
|
_hit_flash_tween = create_tween()
|
||||||
|
_hit_flash_tween.tween_interval(0.08)
|
||||||
|
_hit_flash_tween.tween_callback(_clear_hit_flash)
|
||||||
|
|
||||||
|
|
||||||
|
func _make_hit_overlay() -> StandardMaterial3D:
|
||||||
|
var mat := StandardMaterial3D.new()
|
||||||
|
mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
|
||||||
|
mat.albedo_color = Color(1.0, 0.03, 0.03, 1.0)
|
||||||
|
return mat
|
||||||
|
|
||||||
|
|
||||||
|
func _clear_hit_flash() -> void:
|
||||||
|
var meshes := find_children("*", "MeshInstance3D", true, false)
|
||||||
|
|
||||||
|
for node in meshes:
|
||||||
|
var mesh := node as MeshInstance3D
|
||||||
|
if mesh:
|
||||||
|
mesh.material_overlay = null
|
||||||
|
|||||||
Reference in New Issue
Block a user