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 = "✓ 已过牌"
|
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 sorted_cards: Array[Card] = []
|
||||||
var type_name := _get_type_name(play.type)
|
for c in play.cards:
|
||||||
if status_label:
|
sorted_cards.append(c)
|
||||||
status_label.text = "%s 出了 %s(%d张)" % [player_name, type_name, play.cards.size()]
|
sorted_cards.sort_custom(func(a: Card, b: Card): return a.compare_to(b) < 0)
|
||||||
|
|
||||||
# 延迟刷新手牌,让玩家看到出牌效果
|
var card_w := 60.0
|
||||||
await get_tree().create_timer(0.8).timeout
|
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:
|
||||||
|
|||||||
Reference in New Issue
Block a user