创建新工程
This commit is contained in:
295
scripts/DialogueTestManager.gd
Normal file
295
scripts/DialogueTestManager.gd
Normal file
@@ -0,0 +1,295 @@
|
||||
extends Node
|
||||
class_name DialogueTestManager
|
||||
## 对话系统测试管理器
|
||||
## 用于测试对话功能,生成测试NPC和模拟对话
|
||||
|
||||
# 测试NPC数据
|
||||
var test_npcs: Array[Dictionary] = []
|
||||
var spawned_npcs: Dictionary = {}
|
||||
|
||||
# 引用
|
||||
var world_manager: WorldManager
|
||||
var dialogue_system: DialogueSystem
|
||||
|
||||
# 测试配置
|
||||
const TEST_NPC_COUNT = 3
|
||||
const NPC_SPAWN_RADIUS = 200.0
|
||||
|
||||
func _ready():
|
||||
"""初始化测试管理器"""
|
||||
print("DialogueTestManager initialized")
|
||||
|
||||
## 设置引用
|
||||
func setup_references(world_mgr: WorldManager, dialogue_sys: DialogueSystem):
|
||||
"""
|
||||
设置必要的引用
|
||||
@param world_mgr: 世界管理器
|
||||
@param dialogue_sys: 对话系统
|
||||
"""
|
||||
world_manager = world_mgr
|
||||
dialogue_system = dialogue_sys
|
||||
|
||||
# 连接对话系统信号
|
||||
if dialogue_system:
|
||||
dialogue_system.dialogue_started.connect(_on_dialogue_started)
|
||||
dialogue_system.dialogue_ended.connect(_on_dialogue_ended)
|
||||
dialogue_system.message_received.connect(_on_message_received)
|
||||
|
||||
## 生成测试NPC
|
||||
func spawn_test_npcs(player_position: Vector2 = Vector2(640, 360)):
|
||||
"""
|
||||
在玩家周围生成测试NPC
|
||||
@param player_position: 玩家位置
|
||||
"""
|
||||
if not world_manager:
|
||||
print("WorldManager not set, cannot spawn NPCs")
|
||||
return
|
||||
|
||||
# 清除已存在的测试NPC
|
||||
clear_test_npcs()
|
||||
|
||||
# 生成测试NPC数据
|
||||
_generate_test_npc_data()
|
||||
|
||||
# 在玩家周围生成NPC
|
||||
for i in range(test_npcs.size()):
|
||||
var npc_data = test_npcs[i]
|
||||
|
||||
# 计算NPC位置(围绕玩家分布)
|
||||
var angle = (2.0 * PI * i) / test_npcs.size()
|
||||
var offset = Vector2(cos(angle), sin(angle)) * NPC_SPAWN_RADIUS
|
||||
var npc_position = player_position + offset
|
||||
|
||||
# 更新NPC位置
|
||||
npc_data[CharacterData.FIELD_POSITION] = {
|
||||
"x": npc_position.x,
|
||||
"y": npc_position.y
|
||||
}
|
||||
|
||||
# 生成NPC
|
||||
var npc_character = world_manager.spawn_character(npc_data, false)
|
||||
if npc_character:
|
||||
spawned_npcs[npc_data[CharacterData.FIELD_ID]] = npc_character
|
||||
print("Test NPC spawned: ", npc_data[CharacterData.FIELD_NAME], " at ", npc_position)
|
||||
|
||||
## 生成测试NPC数据
|
||||
func _generate_test_npc_data():
|
||||
"""生成测试NPC的数据"""
|
||||
test_npcs.clear()
|
||||
|
||||
var npc_names = [
|
||||
"测试小助手",
|
||||
"友好的机器人",
|
||||
"聊天达人",
|
||||
"表情包大师",
|
||||
"知识渊博者"
|
||||
]
|
||||
|
||||
var npc_responses = [
|
||||
["你好!我是测试小助手,很高兴见到你!", "有什么可以帮助你的吗?", "今天天气真不错呢!"],
|
||||
["哔哔!我是友好的机器人!", "正在运行对话测试程序...", "系统状态:一切正常!"],
|
||||
["嗨!想聊什么呢?", "我最喜欢和大家聊天了!", "你知道吗,聊天是最好的交流方式!"],
|
||||
["😊 表情包来了!", "😂 哈哈哈,太有趣了!", "🎉 让我们用表情包交流吧!"],
|
||||
["你知道吗?对话系统很复杂呢!", "我了解很多有趣的知识!", "想听听关于AI的故事吗?"]
|
||||
]
|
||||
|
||||
for i in range(min(TEST_NPC_COUNT, npc_names.size())):
|
||||
var npc_id = "test_npc_" + str(i + 1)
|
||||
var npc_data = CharacterData.create(npc_names[i], "system", Vector2.ZERO)
|
||||
npc_data[CharacterData.FIELD_ID] = npc_id
|
||||
|
||||
# 添加测试专用数据
|
||||
npc_data["test_responses"] = npc_responses[i]
|
||||
npc_data["response_index"] = 0
|
||||
|
||||
test_npcs.append(npc_data)
|
||||
|
||||
## 清除测试NPC
|
||||
func clear_test_npcs():
|
||||
"""清除所有测试NPC"""
|
||||
for npc_id in spawned_npcs.keys():
|
||||
if world_manager:
|
||||
world_manager.remove_character(npc_id)
|
||||
|
||||
spawned_npcs.clear()
|
||||
print("Test NPCs cleared")
|
||||
|
||||
## 开始与NPC对话
|
||||
func start_dialogue_with_npc(npc_id: String):
|
||||
"""
|
||||
开始与指定NPC对话
|
||||
@param npc_id: NPC ID
|
||||
"""
|
||||
if not dialogue_system:
|
||||
print("DialogueSystem not set")
|
||||
return
|
||||
|
||||
if not spawned_npcs.has(npc_id):
|
||||
print("NPC not found: ", npc_id)
|
||||
return
|
||||
|
||||
dialogue_system.start_dialogue(npc_id)
|
||||
|
||||
# 发送NPC的欢迎消息
|
||||
_send_npc_response(npc_id, true)
|
||||
|
||||
## 发送NPC响应
|
||||
func _send_npc_response(npc_id: String, is_greeting: bool = false):
|
||||
"""
|
||||
发送NPC的自动响应
|
||||
@param npc_id: NPC ID
|
||||
@param is_greeting: 是否为问候语
|
||||
"""
|
||||
# 找到对应的NPC数据
|
||||
var npc_data: Dictionary
|
||||
for data in test_npcs:
|
||||
if data[CharacterData.FIELD_ID] == npc_id:
|
||||
npc_data = data
|
||||
break
|
||||
|
||||
if npc_data.is_empty():
|
||||
return
|
||||
|
||||
var responses = npc_data.get("test_responses", [])
|
||||
if responses.is_empty():
|
||||
return
|
||||
|
||||
var response_index = npc_data.get("response_index", 0)
|
||||
var message = responses[response_index]
|
||||
|
||||
# 更新响应索引
|
||||
npc_data["response_index"] = (response_index + 1) % responses.size()
|
||||
|
||||
# 延迟发送响应(模拟真实对话)
|
||||
await get_tree().create_timer(randf_range(0.5, 1.5)).timeout
|
||||
|
||||
if dialogue_system:
|
||||
dialogue_system.receive_message(npc_id, message)
|
||||
dialogue_system.show_bubble(npc_id, message, 3.0)
|
||||
|
||||
## 获取附近的NPC
|
||||
func get_nearby_npcs(position: Vector2, radius: float = 100.0) -> Array[Dictionary]:
|
||||
"""
|
||||
获取附近的测试NPC
|
||||
@param position: 中心位置
|
||||
@param radius: 搜索半径
|
||||
@return: 附近NPC的信息数组
|
||||
"""
|
||||
var nearby_npcs: Array[Dictionary] = []
|
||||
|
||||
for npc_id in spawned_npcs.keys():
|
||||
var npc_character = spawned_npcs[npc_id]
|
||||
if npc_character and npc_character.global_position.distance_to(position) <= radius:
|
||||
# 找到NPC数据
|
||||
for data in test_npcs:
|
||||
if data[CharacterData.FIELD_ID] == npc_id:
|
||||
nearby_npcs.append({
|
||||
"id": npc_id,
|
||||
"name": data[CharacterData.FIELD_NAME],
|
||||
"position": npc_character.global_position,
|
||||
"distance": npc_character.global_position.distance_to(position)
|
||||
})
|
||||
break
|
||||
|
||||
# 按距离排序
|
||||
nearby_npcs.sort_custom(func(a, b): return a.distance < b.distance)
|
||||
|
||||
return nearby_npcs
|
||||
|
||||
## 测试表情符号功能
|
||||
func test_emoji_system():
|
||||
"""测试表情符号系统"""
|
||||
print("=== 测试表情符号系统 ===")
|
||||
|
||||
var test_messages = [
|
||||
":smile: 你好!",
|
||||
"今天心情很好 :happy:",
|
||||
":laugh: 哈哈哈",
|
||||
"加油! :thumbsup:",
|
||||
":heart: 爱你哦"
|
||||
]
|
||||
|
||||
for message in test_messages:
|
||||
var converted = EmojiManager.convert_text_to_emoji(message)
|
||||
print("原文: ", message)
|
||||
print("转换后: ", converted)
|
||||
print("---")
|
||||
|
||||
## 测试群组对话功能
|
||||
func test_group_dialogue():
|
||||
"""测试群组对话功能"""
|
||||
print("=== 测试群组对话功能 ===")
|
||||
|
||||
if not dialogue_system:
|
||||
print("DialogueSystem not available")
|
||||
return
|
||||
|
||||
# 创建测试群组
|
||||
var group_id = dialogue_system.create_group_dialogue("测试群组")
|
||||
if group_id.is_empty():
|
||||
print("Failed to create group")
|
||||
return
|
||||
|
||||
print("Created group: ", group_id)
|
||||
|
||||
# 发送测试消息
|
||||
var test_messages = [
|
||||
"大家好!",
|
||||
"这是群组对话测试",
|
||||
":wave: 欢迎大家!"
|
||||
]
|
||||
|
||||
for message in test_messages:
|
||||
var success = dialogue_system.send_group_message(group_id, message)
|
||||
print("Group message sent: ", message, " (success: ", success, ")")
|
||||
|
||||
## 显示测试帮助
|
||||
func show_test_help():
|
||||
"""显示测试帮助信息"""
|
||||
print("=== 对话系统测试帮助 ===")
|
||||
print("1. 使用 spawn_test_npcs() 生成测试NPC")
|
||||
print("2. 使用 start_dialogue_with_npc(npc_id) 开始对话")
|
||||
print("3. 使用 get_nearby_npcs(position) 查找附近NPC")
|
||||
print("4. 使用 test_emoji_system() 测试表情符号")
|
||||
print("5. 使用 test_group_dialogue() 测试群组对话")
|
||||
print("6. 使用 clear_test_npcs() 清除测试NPC")
|
||||
print("========================")
|
||||
|
||||
## 信号处理
|
||||
func _on_dialogue_started(character_id: String):
|
||||
"""对话开始时的处理"""
|
||||
print("Dialogue started with: ", character_id)
|
||||
|
||||
func _on_dialogue_ended():
|
||||
"""对话结束时的处理"""
|
||||
print("Dialogue ended")
|
||||
|
||||
func _on_message_received(sender: String, message: String):
|
||||
"""收到消息时的处理"""
|
||||
print("Message from ", sender, ": ", message)
|
||||
|
||||
# 如果是玩家发送的消息,让NPC自动回复
|
||||
if sender == "player" and dialogue_system and dialogue_system.is_dialogue_active():
|
||||
var target_id = dialogue_system.get_current_target()
|
||||
if spawned_npcs.has(target_id):
|
||||
_send_npc_response(target_id)
|
||||
|
||||
## 快速测试函数
|
||||
func quick_test():
|
||||
"""快速测试所有功能"""
|
||||
print("=== 开始快速测试 ===")
|
||||
|
||||
# 生成NPC
|
||||
spawn_test_npcs()
|
||||
|
||||
# 等待一秒
|
||||
await get_tree().create_timer(1.0).timeout
|
||||
|
||||
# 测试表情符号
|
||||
test_emoji_system()
|
||||
|
||||
# 测试群组对话
|
||||
test_group_dialogue()
|
||||
|
||||
print("=== 快速测试完成 ===")
|
||||
show_test_help()
|
||||
Reference in New Issue
Block a user