Files
whale-town/scripts/DatawhaleOffice_with_logo.gd
2025-12-05 19:00:14 +08:00

399 lines
12 KiB
GDScript
Raw Permalink 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 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)