创建新工程
This commit is contained in:
398
scripts/DatawhaleOffice_with_logo.gd
Normal file
398
scripts/DatawhaleOffice_with_logo.gd
Normal 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)
|
||||
Reference in New Issue
Block a user