feat(ui): flight animation + commentary on card play
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user