fix: add null guards for status_label, hand_area, and label throughout UI

This commit is contained in:
xiaji
2026-05-29 21:39:06 +08:00
parent 08f0a9f4f8
commit c6e806a155
3 changed files with 37 additions and 34 deletions

View File

@@ -11,28 +11,28 @@ var is_selected: bool = false
@onready var label: Label = $Label @onready var label: Label = $Label
func setup(card: Card) -> void: func setup(card: Card) -> void:
card_data = card card_data = card
update_display() update_display()
func update_display() -> void: func update_display() -> void:
if card_data == null: if card_data == null:
return return
var suits := ["S", "H", "C", "D", "SJ", "BJ"] var suits := ["S", "H", "C", "D", "SJ", "BJ"]
var ranks := ["", "", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "SJ", "BJ"] var ranks := ["", "", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "SJ", "BJ"]
var suit := card_data.suit() var suit := card_data.suit()
var rank := card_data.rank() var rank := card_data.rank()
if rank < ranks.size() and suit < suits.size(): if rank < ranks.size() and suit < suits.size() and label:
label.text = "%s %s" % [suits[suit], ranks[rank]] label.text = "%s %s" % [suits[suit], ranks[rank]]
modulate = Color.WHITE if not is_selected else Color(1.2, 1.2, 0.8) modulate = Color.WHITE if not is_selected else Color(1.2, 1.2, 0.8)
func set_selected(sel: bool) -> void: func set_selected(sel: bool) -> void:
is_selected = sel is_selected = sel
update_display() update_display()
func _on_gui_input(event: InputEvent) -> void: func _on_gui_input(event: InputEvent) -> void:
if event is InputEventMouseButton: if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT and event.pressed: if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
if event.double_click: if event.double_click:
card_double_clicked.emit(self) card_double_clicked.emit(self)
else: else:
card_clicked.emit(self) card_clicked.emit(self)

View File

@@ -1,13 +1,13 @@
extends Control extends Control
func _ready() -> void: func _ready() -> void:
var start_btn := $VBoxContainer/StartButton as Button var start_btn := $VBoxContainer/StartButton as Button
var quit_btn := $VBoxContainer/QuitButton as Button var quit_btn := $VBoxContainer/QuitButton as Button
start_btn.pressed.connect(_on_start_pressed) start_btn.pressed.connect(_on_start_pressed)
quit_btn.pressed.connect(_on_quit_pressed) quit_btn.pressed.connect(_on_quit_pressed)
func _on_start_pressed() -> void: func _on_start_pressed() -> void:
get_tree().change_scene_to_file("res://src/ui/scenes/training_room.tscn") get_tree().change_scene_to_file("res://src/ui/scenes/training_room.tscn")
func _on_quit_pressed() -> void: func _on_quit_pressed() -> void:
get_tree().quit() get_tree().quit()

View File

@@ -26,18 +26,20 @@ func start_training() -> void:
func _on_turn_ready(player_idx: int, is_human: bool) -> void: func _on_turn_ready(player_idx: int, is_human: bool) -> void:
if is_human: if is_human:
hand_area.enable_input() hand_area.enable_input()
status_label.text = "你的回合" if status_label: status_label.text = "你的回合"
else: else:
hand_area.disable_input() hand_area.disable_input()
status_label.text = "%s 思考中..." % controller.game_state.player_names[player_idx] if status_label and controller and controller.game_state:
status_label.text = "%s 思考中..." % controller.game_state.player_names[player_idx]
func _on_play_pressed() -> void: func _on_play_pressed() -> void:
if not hand_area: return
var selected := hand_area.selected_cards var selected := hand_area.selected_cards
if selected.is_empty(): if selected.is_empty():
return return
var result := controller.handle_human_play(selected) var result := controller.handle_human_play(selected)
if not result.ok: if not result.ok:
status_label.text = "无效出牌" if status_label: status_label.text = "无效出牌"
return return
hand_area.clear_selection() hand_area.clear_selection()
_refresh_ui() _refresh_ui()
@@ -45,27 +47,28 @@ func _on_play_pressed() -> void:
func _on_pass_pressed() -> void: func _on_pass_pressed() -> void:
var result := controller.handle_human_pass() var result := controller.handle_human_pass()
if not result.ok: if not result.ok:
status_label.text = "不能过牌" if status_label: status_label.text = "不能过牌"
return return
_refresh_ui() _refresh_ui()
func _on_hint_pressed() -> void: func _on_hint_pressed() -> void:
var hint := controller.get_hint() var hint := controller.get_hint()
if hint == null or hint.type == -1: if hint == null or hint.type == -1:
status_label.text = "建议:过牌" if status_label: status_label.text = "建议:过牌"
return return
if not hand_area: return
hand_area.clear_selection() hand_area.clear_selection()
for card in hint.cards: for card in hint.cards:
for cn in hand_area.card_nodes: for cn in hand_area.card_nodes:
if cn.card_data != null and cn.card_data.card_id == card.card_id: if cn.card_data != null and cn.card_data.card_id == card.card_id:
cn.set_selected(true) cn.set_selected(true)
hand_area.selected_cards.append(card) hand_area.selected_cards.append(card)
status_label.text = "建议牌型: %s (rank=%d)" % [hint.type, hint.primary_rank] if status_label: status_label.text = "建议牌型: %s (rank=%d)" % [hint.type, hint.primary_rank]
func _on_game_ended(winner_team: int, reason: String) -> void: func _on_game_ended(winner_team: int, reason: String) -> void:
status_label.text = "游戏结束! 队伍 %d 获胜" % winner_team if status_label: status_label.text = "游戏结束! 队伍 %d 获胜" % winner_team
hand_area.disable_input() if hand_area: hand_area.disable_input()
func _refresh_ui() -> void: func _refresh_ui() -> void:
if controller and controller.game_state: if controller and controller.game_state and hand_area:
hand_area.update_hand(controller.game_state.get_hand(0)) hand_area.update_hand(controller.game_state.get_hand(0))