diff --git a/src/ui/scenes/training_room.gd b/src/ui/scenes/training_room.gd index 6f2152e..45e607e 100644 --- a/src/ui/scenes/training_room.gd +++ b/src/ui/scenes/training_room.gd @@ -83,15 +83,55 @@ func _on_pass_pressed() -> void: status_label.text = "✓ 已过牌" func _on_cards_played(player_idx: int, play: HandEvaluator.EvaluatedPlay) -> void: - # 显示出的牌 - _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()] - - # 延迟刷新手牌,让玩家看到出牌效果 - await get_tree().create_timer(0.8).timeout + hand_area.disable_input() + + var sorted_cards: Array[Card] = [] + 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() func _on_player_passed(player_idx: int) -> void: