创建新工程

This commit is contained in:
moyin
2025-12-05 19:00:14 +08:00
commit ff4fa5fffd
227 changed files with 32804 additions and 0 deletions

View File

@@ -0,0 +1,398 @@
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)