diff --git a/scenes/prefabs/GrassTile.gd b/scenes/prefabs/GrassTile.gd new file mode 100644 index 0000000..c1c66e1 --- /dev/null +++ b/scenes/prefabs/GrassTile.gd @@ -0,0 +1,122 @@ +# ============================================================================ +# 简单草地瓦片 - GrassTile.gd +# +# 一个简单的32x32草地瓦片,自动对齐网格 +# 使用方法: +# 1. 在场景中实例化 grass_tile_prefab.tscn +# 2. 设置 texture 属性 +# 3. 调用 set_grid_position() 设置网格位置 +# ============================================================================ + +class_name GrassTile +extends Sprite2D + +# ============================================================================ +# 导出属性 +# ============================================================================ +@export var grid_position: Vector2i = Vector2i.ZERO : set = set_grid_position +@export var auto_snap: bool = true # 是否自动对齐网格 + +# ============================================================================ +# 信号 +# ============================================================================ +signal position_changed(new_grid_pos: Vector2i) + +func _ready(): + # 如果没有纹理,创建一个默认的占位符 + if not texture: + _create_placeholder_texture() + + # 验证纹理尺寸 + _validate_texture() + + # 自动对齐到网格 + if auto_snap: + snap_to_grid() + +# ============================================================================ +# 公共方法 +# ============================================================================ + +# 设置网格位置并自动对齐 +func set_grid_position(new_pos: Vector2i): + if grid_position != new_pos: + grid_position = new_pos + if auto_snap: + snap_to_grid() + position_changed.emit(grid_position) + +# 对齐到网格中心 +func snap_to_grid(): + position = Vector2( + grid_position.x * 32.0 + 16.0, + grid_position.y * 32.0 + 16.0 + ) + +# 从世界坐标设置位置(会自动转换为网格坐标) +func set_world_position(world_pos: Vector2): + var new_grid_pos = Vector2i( + int(world_pos.x / 32.0), + int(world_pos.y / 32.0) + ) + set_grid_position(new_grid_pos) + +# 获取世界坐标 +func get_world_position() -> Vector2: + return position + +# ============================================================================ +# 私有方法 +# ============================================================================ + +# 创建占位符纹理 +func _create_placeholder_texture(): + var image = Image.create(32, 32, false, Image.FORMAT_RGBA8) + + # 创建简单的草地图案 + var grass_color = Color(0.3, 0.8, 0.3, 1.0) # 亮绿色 + var dark_color = Color(0.2, 0.6, 0.2, 1.0) # 深绿色 + + # 填充基础颜色 + image.fill(grass_color) + + # 添加简单的格子图案 + for x in range(32): + for y in range(32): + if (x + y) % 8 < 4: + image.set_pixel(x, y, dark_color) + + # 创建纹理 + var placeholder_texture = ImageTexture.new() + placeholder_texture.set_image(image) + texture = placeholder_texture + +# 验证纹理尺寸 +func _validate_texture(): + if texture: + var size = Vector2i(texture.get_width(), texture.get_height()) + if size.x % 32 != 0 or size.y % 32 != 0: + push_warning("GrassTile: 纹理尺寸不是32的倍数: " + str(size)) + return false + return true + return false + +# ============================================================================ +# 调试方法 +# ============================================================================ + +# 获取瓦片信息 +func get_tile_info() -> Dictionary: + return { + "grid_position": grid_position, + "world_position": position, + "texture_size": texture.get_size() if texture else Vector2.ZERO, + "auto_snap": auto_snap + } + +# 打印瓦片信息 +func print_info(): + var info = get_tile_info() + print("=== 草地瓦片信息 ===") + for key in info: + print(key, ": ", info[key]) \ No newline at end of file diff --git a/scenes/prefabs/grass_tile_prefab.tscn b/scenes/prefabs/grass_tile_prefab.tscn new file mode 100644 index 0000000..9c85898 --- /dev/null +++ b/scenes/prefabs/grass_tile_prefab.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://bvxqm8n7qwqxe"] + +[ext_resource type="Script" path="res://scenes/prefabs/GrassTile.gd" id="1_0x8qm"] + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_1"] +size = Vector2(32, 32) + +[node name="GrassTile" type="Sprite2D"] +texture = SubResource("PlaceholderTexture2D_1") +script = ExtResource("1_0x8qm") \ No newline at end of file