feat(ui): flight animation + commentary on card play

This commit is contained in:
xiaji
2026-06-02 20:48:46 +08:00
parent 8f21f4dbab
commit 4fa4207f8c

View File

@@ -83,15 +83,55 @@ func _on_pass_pressed() -> void:
status_label.text = "✓ 已过牌" status_label.text = "✓ 已过牌"
func _on_cards_played(player_idx: int, play: HandEvaluator.EvaluatedPlay) -> void: func _on_cards_played(player_idx: int, play: HandEvaluator.EvaluatedPlay) -> void:
# 显示出的牌 hand_area.disable_input()
_show_table_cards(play.cards)
var player_name := controller.game_state.player_names[player_idx]
var type_name := _get_type_name(play.type)
if status_label:
status_label.text = "%s 出了 %s%d张)" % [player_name, type_name, play.cards.size()]
# 延迟刷新手牌,让玩家看到出牌效果 var sorted_cards: Array[Card] = []
await get_tree().create_timer(0.8).timeout for c in play.cards:
sorted_cards.append(c)
sorted_cards.sort_custom(func(a: Card, b: Card): return a.compare_to(b) < 0)
var card_w := 60.0
var total_w := card_w * sorted_cards.size()
var start_x := (1280.0 - total_w) / 2.0
var table_y := 80.0
var ghosts: Array[CardNode] = []
var targets: Array[Vector2] = []
for i in range(sorted_cards.size()):
var src_node := _find_hand_node(sorted_cards[i])
var src_pos := src_node.global_position if src_node else Vector2(start_x + i * card_w, 600.0)
var ghost := CARD_NODE_SCENE.instantiate() as CardNode
get_tree().root.add_child(ghost)
ghost.setup(sorted_cards[i])
ghost.global_position = src_pos
ghost.mouse_filter = Control.MOUSE_FILTER_IGNORE
ghosts.append(ghost)
targets.append(Vector2(start_x + i * card_w, table_y))
for i in range(ghosts.size()):
var g := ghosts[i]
var t := create_tween().set_parallel(true)
t.tween_property(g, "global_position", targets[i], FLIGHT_DURATION) \
.set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT)
t.tween_property(g, "scale", Vector2(0.7, 0.7), FLIGHT_DURATION) \
.set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN)
await get_tree().create_timer(FLIGHT_DURATION).timeout
for g in ghosts:
g.queue_free()
_show_table_cards(sorted_cards)
_show_commentary(player_idx, play)
await get_tree().create_timer(COMMENTARY_HOLD).timeout
var fade := create_tween()
fade.tween_property(commentary_label, "modulate:a", 0.0, COMMENTARY_FADE_OUT)
await get_tree().create_timer(COMMENTARY_FADE_OUT).timeout
_clear_table_cards()
_refresh_ui() _refresh_ui()
func _on_player_passed(player_idx: int) -> void: func _on_player_passed(player_idx: int) -> void: