Files
whale-town-front/scenes/MainScene.gd
2026-02-07 14:11:00 +08:00

160 lines
5.3 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
extends Control
# ============================================================================
# MainScene.gd - 主场景控制器
# ============================================================================
# 这是游戏的主入口场景,负责管理所有图像显示和界面切换
# 功能包括:
# - 登录/注册界面管理
# - 主游戏界面显示
# - 用户状态管理
# - 游戏功能模块入口
# ============================================================================
# 场景节点引用
@onready var auth_scene: Control = $AuthScene
@onready var main_game_ui: Control = $MainGameUI
@onready var chat_ui: Control = %ChatUI
@onready var user_label: Label = $MainGameUI/TopBar/HBoxContainer/UserLabel
@onready var logout_button: Button = $MainGameUI/TopBar/HBoxContainer/LogoutButton
# 游戏功能按钮
@onready var explore_button: Button = $MainGameUI/MainContent/CenterContainer/VBoxContainer/GameMenuGrid/ExploreButton
@onready var inventory_button: Button = $MainGameUI/MainContent/CenterContainer/VBoxContainer/GameMenuGrid/InventoryButton
@onready var shop_button: Button = $MainGameUI/MainContent/CenterContainer/VBoxContainer/GameMenuGrid/ShopButton
@onready var friends_button: Button = $MainGameUI/MainContent/CenterContainer/VBoxContainer/GameMenuGrid/FriendsButton
# 状态标签
@onready var level_label: Label = $MainGameUI/MainContent/CenterContainer/VBoxContainer/StatusPanel/StatusContainer/StatusGrid/LevelLabel
@onready var coins_label: Label = $MainGameUI/MainContent/CenterContainer/VBoxContainer/StatusPanel/StatusContainer/StatusGrid/CoinsLabel
@onready var exp_label: Label = $MainGameUI/MainContent/CenterContainer/VBoxContainer/StatusPanel/StatusContainer/StatusGrid/ExpLabel
@onready var energy_label: Label = $MainGameUI/MainContent/CenterContainer/VBoxContainer/StatusPanel/StatusContainer/StatusGrid/EnergyLabel
# 游戏状态
enum GameState {
AUTH, # 登录/注册状态
MAIN_GAME # 主游戏状态
}
var current_state: GameState = GameState.AUTH
var current_user: String = ""
# 玩家数据
var player_level: int = 1
var player_coins: int = 100
var player_exp: int = 0
var player_max_exp: int = 100
var player_energy: int = 100
var player_max_energy: int = 100
func _ready():
# 初始化游戏状态
setup_game()
# 连接登录成功信号
auth_scene.login_success.connect(_on_login_success)
# 连接按钮信号
logout_button.pressed.connect(_on_logout_pressed)
explore_button.pressed.connect(_on_explore_pressed)
inventory_button.pressed.connect(_on_inventory_pressed)
shop_button.pressed.connect(_on_shop_pressed)
friends_button.pressed.connect(_on_friends_pressed)
func setup_game():
# 设置初始状态为登录界面
show_auth_scene()
func show_auth_scene():
current_state = GameState.AUTH
auth_scene.visible = true
main_game_ui.visible = false
func show_main_game():
current_state = GameState.MAIN_GAME
auth_scene.visible = false
main_game_ui.visible = true
user_label.text = "当前用户: " + current_user
update_player_status()
func update_player_status():
level_label.text = "等级: " + str(player_level)
coins_label.text = "金币: " + str(player_coins)
exp_label.text = "经验: " + str(player_exp) + "/" + str(player_max_exp)
energy_label.text = "体力: " + str(player_energy) + "/" + str(player_max_energy)
func _on_login_success(username: String):
# 登录成功后的处理
current_user = username
# 连接到聊天服务器(在进入游戏界面之前)
# 注意token 已在 AuthScene._on_controller_login_success 中设置
ChatManager.connect_to_chat_server()
# 连接到位置同步服务器
LocationManager.connect_to_server()
# 直接进入游戏地图不显示MainGameUI
_setup_game_environment()
func _on_logout_pressed():
# 登出处理
current_user = ""
# 断开聊天服务器连接
ChatManager.disconnect_from_chat_server()
show_auth_scene()
# 游戏功能按钮处理
func _on_explore_pressed():
show_game_message("🗺️ 探索功能开发中...")
func _on_inventory_pressed():
show_game_message("🎒 背包功能开发中...")
func _on_shop_pressed():
show_game_message("🏪 商店功能开发中...")
func _on_friends_pressed():
show_game_message("👥 好友功能开发中...")
func show_game_message(_message: String):
# TODO: 用 Toast 或游戏内提示框替代占位实现
pass
# 设置游戏环境(登录后直接加载地图)
func _setup_game_environment():
# 防止登录切场景时输入状态残留导致角色“卡移动键”
_release_movement_actions()
# 1. 隐藏UI
current_state = GameState.MAIN_GAME
auth_scene.visible = false
main_game_ui.visible = false
# 2. 隐藏聊天框需要按Enter才显示
if is_instance_valid(chat_ui) and chat_ui.has_method("hide_chat"):
chat_ui.hide_chat()
# 3. 使用 SceneManager 切换到广场地图
SceneManager.change_scene("square", false) # false = 不使用过渡效果
func _release_movement_actions() -> void:
Input.action_release("move_left")
Input.action_release("move_right")
Input.action_release("move_up")
Input.action_release("move_down")
Input.flush_buffered_events()
# 处理全局输入
func _input(event):
if event.is_action_pressed("ui_cancel"):
match current_state:
GameState.AUTH:
# 在登录界面按ESC退出游戏
get_tree().quit()
GameState.MAIN_GAME:
# 在游戏中按ESC可能显示菜单或返回登录
show_auth_scene()