extends Node2D class_name DatawhaleOfficeWithLogo ## Datawhale 办公室场景(使用真实 Logo 版本) ## 将 logo 文件放在 assets/ui/datawhale_logo.png 后使用此版本 # 场景配置 const SCENE_WIDTH = 2000 const SCENE_HEIGHT = 1500 # Datawhale 品牌色 const COLOR_PRIMARY = Color(0.118, 0.565, 1.0) # 蓝色 #1E90FF const COLOR_SECONDARY = Color(0.0, 0.4, 0.8) # 深蓝 #0066CC const COLOR_ACCENT = Color(0.0, 0.749, 1.0) # 亮蓝 #00BFFF const COLOR_FLOOR = Color(0.9, 0.9, 0.9) # 浅灰色地板 const COLOR_WALL = Color(0.4, 0.4, 0.4) # 深灰色墙壁 const COLOR_FURNITURE = Color(0.545, 0.271, 0.075) # 棕色家具 # Logo 资源路径 const LOGO_PATH = "res://assets/ui/datawhale_logo.png" const LOGO_ICON_PATH = "res://assets/ui/datawhale_icon.png" # 可选 # 节点引用 @onready var tile_map = $TileMap @onready var characters_container = $Characters @onready var camera = $Camera2D func _ready(): """初始化场景""" print("DatawhaleOffice scene loaded (with real logo)") print("Scene size: ", SCENE_WIDTH, "x", SCENE_HEIGHT) # 程序化生成场景元素 _create_scene_elements() # 设置相机限制 _setup_camera_limits() ## 创建场景元素 func _create_scene_elements(): """程序化创建场景的所有视觉元素和碰撞""" # 创建地板 _create_floor() # 创建墙壁(带碰撞) _create_walls() # 创建家具(带碰撞) _create_furniture() # 创建 Datawhale 品牌元素 _create_branding() print("Scene elements created") ## 设置相机限制 func _setup_camera_limits(): """设置相机边界,防止看到场景外""" camera.limit_left = 0 camera.limit_top = 0 camera.limit_right = SCENE_WIDTH camera.limit_bottom = SCENE_HEIGHT # 启用平滑跟随 camera.position_smoothing_enabled = true camera.position_smoothing_speed = 5.0 ## 获取角色容器 func get_characters_container() -> Node2D: """获取角色容器节点""" return characters_container ## 设置相机跟随目标 func set_camera_target(target: Node2D): """设置相机跟随的目标""" if target: var remote_transform = RemoteTransform2D.new() remote_transform.remote_path = camera.get_path() remote_transform.update_position = true remote_transform.update_rotation = false remote_transform.update_scale = false target.add_child(remote_transform) print("Camera following: ", target.name) ## 获取场景尺寸 func get_scene_size() -> Vector2: """获取场景尺寸""" return Vector2(SCENE_WIDTH, SCENE_HEIGHT) ## 创建地板 func _create_floor(): """创建地板(纯视觉,无碰撞)""" var floor = ColorRect.new() floor.name = "Floor" floor.size = Vector2(SCENE_WIDTH, SCENE_HEIGHT) floor.color = COLOR_FLOOR floor.z_index = -10 add_child(floor) ## 创建墙壁 func _create_walls(): """创建墙壁(带碰撞)""" var walls_container = Node2D.new() walls_container.name = "Walls" add_child(walls_container) var wall_thickness = 20 # 外墙 _create_wall(walls_container, Vector2(0, 0), Vector2(SCENE_WIDTH, wall_thickness)) _create_wall(walls_container, Vector2(0, SCENE_HEIGHT - wall_thickness), Vector2(SCENE_WIDTH, wall_thickness)) _create_wall(walls_container, Vector2(0, 0), Vector2(wall_thickness, SCENE_HEIGHT)) _create_wall(walls_container, Vector2(SCENE_WIDTH - wall_thickness, 0), Vector2(wall_thickness, SCENE_HEIGHT)) # 内部分隔墙 _create_wall(walls_container, Vector2(800, 200), Vector2(wall_thickness, 600)) _create_wall(walls_container, Vector2(200, 800), Vector2(1600, wall_thickness)) ## 创建单个墙壁 func _create_wall(parent: Node2D, pos: Vector2, size: Vector2): """创建单个墙壁块""" var wall = StaticBody2D.new() wall.collision_layer = 1 wall.collision_mask = 0 var visual = ColorRect.new() visual.size = size visual.color = COLOR_WALL wall.add_child(visual) var collision = CollisionShape2D.new() var shape = RectangleShape2D.new() shape.size = size collision.shape = shape collision.position = size / 2 wall.add_child(collision) wall.position = pos parent.add_child(wall) ## 创建家具 func _create_furniture(): """创建家具(办公桌、椅子等)""" var furniture_container = Node2D.new() furniture_container.name = "Furniture" add_child(furniture_container) # 入口区域 - 欢迎台 _create_furniture_piece(furniture_container, Vector2(100, 100), Vector2(200, 80), "Reception") # 工作区 - 办公桌(6个) for i in range(3): for j in range(2): var desk_pos = Vector2(100 + i * 250, 300 + j * 200) _create_furniture_piece(furniture_container, desk_pos, Vector2(120, 60), "Desk") # 会议区 - 会议桌 _create_furniture_piece(furniture_container, Vector2(900, 300), Vector2(400, 200), "Meeting Table") # 休息区 - 沙发 _create_furniture_piece(furniture_container, Vector2(100, 900), Vector2(300, 100), "Sofa") _create_furniture_piece(furniture_container, Vector2(100, 1050), Vector2(100, 100), "Coffee Table") ## 创建单个家具 func _create_furniture_piece(parent: Node2D, pos: Vector2, size: Vector2, label: String): """创建单个家具块""" var furniture = StaticBody2D.new() furniture.name = label furniture.collision_layer = 2 furniture.collision_mask = 0 var visual = ColorRect.new() visual.size = size visual.color = COLOR_FURNITURE furniture.add_child(visual) var collision = CollisionShape2D.new() var shape = RectangleShape2D.new() shape.size = size collision.shape = shape collision.position = size / 2 furniture.add_child(collision) furniture.position = pos parent.add_child(furniture) ## 创建品牌元素 func _create_branding(): """创建 Datawhale 品牌元素""" var branding_container = Node2D.new() branding_container.name = "Branding" branding_container.z_index = 5 add_child(branding_container) # 1. 主 Logo 展示区 _create_main_logo(branding_container, Vector2(1400, 400)) # 2. 欢迎标识 _create_welcome_sign(branding_container, Vector2(100, 50)) # 3. 成就墙 _create_achievement_wall(branding_container, Vector2(1200, 900)) # 4. 装饰性品牌元素 _create_decorative_elements(branding_container) # 5. 地板品牌标识 _create_floor_branding(branding_container) ## 创建主 Logo(使用真实图片) func _create_main_logo(parent: Node2D, pos: Vector2): """创建主 Datawhale Logo(使用真实图片)""" var logo_container = Node2D.new() logo_container.name = "MainLogo" logo_container.position = pos parent.add_child(logo_container) # 检查 Logo 文件是否存在 if ResourceLoader.exists(LOGO_PATH): # 使用真实的 Logo 图片 var logo_sprite = Sprite2D.new() logo_sprite.texture = load(LOGO_PATH) # 调整大小(根据你的 logo 实际尺寸调整这个值) logo_sprite.scale = Vector2(0.4, 0.4) logo_sprite.position = Vector2(0, 0) logo_container.add_child(logo_sprite) print("✓ Real Datawhale logo loaded successfully") else: # 如果 logo 文件不存在,使用占位符 print("⚠ Logo file not found at: ", LOGO_PATH) print(" Using placeholder graphics instead") # Logo 背景板 var bg = ColorRect.new() bg.size = Vector2(300, 300) bg.color = Color.WHITE bg.position = Vector2(-150, -150) logo_container.add_child(bg) # 占位符图形 var placeholder = ColorRect.new() placeholder.size = Vector2(200, 120) placeholder.color = COLOR_PRIMARY placeholder.position = Vector2(-100, -80) logo_container.add_child(placeholder) var placeholder_text = Label.new() placeholder_text.text = "LOGO HERE" placeholder_text.position = Vector2(-50, -20) placeholder_text.add_theme_font_size_override("font_size", 24) placeholder_text.add_theme_color_override("font_color", Color.WHITE) logo_container.add_child(placeholder_text) # Logo 文字(可选) var logo_text = Label.new() logo_text.text = "DATAWHALE" logo_text.position = Vector2(-100, 150) logo_text.add_theme_font_size_override("font_size", 32) logo_text.add_theme_color_override("font_color", COLOR_PRIMARY) logo_container.add_child(logo_text) # 副标题 var subtitle = Label.new() subtitle.text = "AI Learning Community" subtitle.position = Vector2(-80, 190) subtitle.add_theme_font_size_override("font_size", 16) subtitle.add_theme_color_override("font_color", COLOR_SECONDARY) logo_container.add_child(subtitle) ## 创建欢迎标识(带小 logo) func _create_welcome_sign(parent: Node2D, pos: Vector2): """创建入口欢迎标识""" var sign_container = Node2D.new() sign_container.name = "WelcomeSign" sign_container.position = pos parent.add_child(sign_container) # 标识背景 var bg = ColorRect.new() bg.size = Vector2(400, 80) bg.color = COLOR_PRIMARY sign_container.add_child(bg) # 小 logo 图标(如果有) if ResourceLoader.exists(LOGO_ICON_PATH): var logo_icon = Sprite2D.new() logo_icon.texture = load(LOGO_ICON_PATH) logo_icon.scale = Vector2(0.15, 0.15) logo_icon.position = Vector2(30, 40) sign_container.add_child(logo_icon) # 欢迎文字 var welcome_text = Label.new() welcome_text.text = "Welcome to Datawhale Office" welcome_text.position = Vector2(70, 20) welcome_text.add_theme_font_size_override("font_size", 24) welcome_text.add_theme_color_override("font_color", Color.WHITE) sign_container.add_child(welcome_text) ## 创建成就墙 func _create_achievement_wall(parent: Node2D, pos: Vector2): """创建成就展示墙""" var wall_container = Node2D.new() wall_container.name = "AchievementWall" wall_container.position = pos parent.add_child(wall_container) # 墙面背景 var wall_bg = ColorRect.new() wall_bg.size = Vector2(600, 400) wall_bg.color = Color(0.95, 0.95, 0.95) wall_container.add_child(wall_bg) # 标题 var title = Label.new() title.text = "Our Achievements" title.position = Vector2(200, 20) title.add_theme_font_size_override("font_size", 28) title.add_theme_color_override("font_color", COLOR_PRIMARY) wall_container.add_child(title) # 成就卡片 var achievements = [ {"title": "10K+ Members", "icon_color": COLOR_PRIMARY}, {"title": "500+ Projects", "icon_color": COLOR_SECONDARY}, {"title": "100+ Courses", "icon_color": COLOR_ACCENT}, {"title": "AI Excellence", "icon_color": COLOR_PRIMARY} ] for i in range(achievements.size()): var row = i / 2 var col = i % 2 var card_pos = Vector2(50 + col * 280, 80 + row * 140) _create_achievement_card(wall_container, card_pos, achievements[i]) ## 创建成就卡片 func _create_achievement_card(parent: Node2D, pos: Vector2, data: Dictionary): """创建单个成就卡片""" var card = ColorRect.new() card.size = Vector2(240, 100) card.color = Color.WHITE card.position = pos parent.add_child(card) # 图标 var icon = ColorRect.new() icon.size = Vector2(60, 60) icon.color = data["icon_color"] icon.position = Vector2(20, 20) card.add_child(icon) # 文字 var text = Label.new() text.text = data["title"] text.position = Vector2(90, 35) text.add_theme_font_size_override("font_size", 18) text.add_theme_color_override("font_color", COLOR_SECONDARY) card.add_child(text) ## 创建装饰性元素 func _create_decorative_elements(parent: Node2D): """创建装饰性品牌元素""" # 蓝色装饰条纹 for i in range(8): var stripe = ColorRect.new() stripe.size = Vector2(40, 200) stripe.color = COLOR_ACCENT stripe.color.a = 0.2 + (i % 3) * 0.1 stripe.position = Vector2(1700 + i * 50, 100 + (i % 2) * 100) parent.add_child(stripe) # 品牌色圆点装饰 var dot_positions = [ Vector2(500, 200), Vector2(700, 250), Vector2(900, 150), Vector2(300, 600), Vector2(600, 650), Vector2(1100, 600) ] for pos in dot_positions: var dot = ColorRect.new() dot.size = Vector2(30, 30) dot.color = COLOR_PRIMARY dot.color.a = 0.3 dot.position = pos parent.add_child(dot) ## 创建地板品牌标识 func _create_floor_branding(parent: Node2D): """在地板上创建品牌标识""" # 中央大型 Logo 水印 var floor_logo = Label.new() floor_logo.text = "DATAWHALE" floor_logo.position = Vector2(800, 600) floor_logo.rotation = -0.1 floor_logo.add_theme_font_size_override("font_size", 120) floor_logo.add_theme_color_override("font_color", COLOR_PRIMARY) floor_logo.modulate.a = 0.05 floor_logo.z_index = -5 parent.add_child(floor_logo)